• ベストアンサー

visual C++ 2008 矢印の描写

visual C++ 2008 のマネージアプリケーションで矢印を描きたいのですが、線しか描けません。 角度に応じて先端に三角形をつける、もしくは直接矢印を描く方法があるなら教えてください。 ちなみに線は、 Graphics^ gr = this->CreateGraphics(); gr->DrawLine(Pens::Black,x1,y1,x2,y2); で描いています。 入門用の参考書を頼りにプログラムしていたのですが、載っていなかったので質問させていただきました。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

MSDN ライブラリの LineCap 列挙体の説明の冒頭に書いてあるとおり、LineCap は System.Drawing.Drawing2D 名前空間内で定義されている列挙体です。 現在のコードでは上記の名前空間を直接利用できるようになっていないものと思われます。 ソースファイルの冒頭に以下の行を追加してみてください。多分それで大丈夫なはずです。 using namespace System::Drawing::Drawing2D; 上記を追加せずにコンパイルエラーになっている行を以下のようにしてもいいのですが、……面倒くさい上に長くて分かりづらいですよね? pen->SetLineCap(System::Drawing::Drawing2D::LineCap::Flat, System::Drawing::Drawing2D::LineCap::Triangle, System::Drawing::Drawing2D::LineCap::Flat); # などとえらそうなことを言いましたが、実は指摘されるまで名前空間のことを失念しておりました。 # 最初の回答に抜けがあったことをお詫びいたします。

tomojjj
質問者

お礼

できました! 丁寧な回答ありがとうございました。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

MSDNライブラリを見ながらなので半分自信が無いのですが、以下のコードでいかがでしょうか。 Graphics^ gr = this->CreateGraphics(); Pen^ pen = gcnew Pen(Brushes::Black); pen->SetLineCap(LineCap::Flat, LineCap::Triangle, LineCap::Flat); gr->DrawLine(pen,x1,y1,x2,y2); なお、先端が三角形ではなく3本線の矢印も描けるようです。詳しくはMSDNライブラリでPen.SetLineCapメソッドおよびLineCap列挙体を調べてみてください。

tomojjj
質問者

お礼

以下のエラーが出て実行できませんでした。 'LineCap' : 識別子がクラス名でも名前空間名でもありません。 'Flat' : 定義されていない識別子です。 'LineCap' : 識別子がクラス名でも名前空間名でもありません。 'Triangle' : 定義されていない識別子です。 'LineCap' : 識別子がクラス名でも名前空間名でもありません。 'Flat' : 定義されていない識別子です。 何が足りないのでしょうか?また、MSDNライブラリに載っていいるサンプルコードでも同じエラーが出ました。

関連するQ&A

  • Visual C# 2010 Expressにて。

    pictureBox1に絵を描くプログラムを作っています。 ボタンを設置して、 ボタンを押すとカラーダイアログが開き、ボタンの背景を選択した色に変えました。 このボタンの背景と同じ色にペンの色を変えたいと思っています。 Graphics grfx; // Graphics オブジェクトです。 grfx.DrawLine(Pens.Black, startX, startY, e.X, e.Y); でpictureBox1に記述します。 Pens.Blackのカラーをボタンの背景の色に置き換えるってことは無理なのでしょうか? C#を初めてまだ1カ月もたたないので、意味不明なことを言ってたらすいません。

  • PictureBoxの描画について

    VB2005を使用してPictureBoxに線を描きました。  Dim g As Graphics = PictureBox1.CreateGraphics()  g.DrawLine(p, X1, Y1, X2, Y2) 線は上手く描けたのですが、表示している画面(Form)を最小化して再度最大化すると、描いた線が消えてしまいます。FormをHideしてもう一度Showしても同じです。 この描画を消さないようにするには、どうすればよいでしょうか?

  • DrawLineで引いた線が消えてしまいます。

    お伺いしたい事があります visual basic 2005 なのですが、 picture box にdrawlineで線を引き、他のフォームが前面に来て、 ドラッグするとラインが消えてしまいます .Invalidated、 .over等を試したのですが、うまくいきませんでした。 再描画するタイミングを取得する方法としてどの様な方法があるのでしょうか? それとも、 Dim canvs As Graphics = pbox.CreateGraphics() canvs.DrawLine( 以外で描画するのでしょうか? 申し訳ありません宜しくお願いします。

  • C#を用いて描画する四角形の角を丸くする方法

    教えて下さい。 書籍やインターネットで調べているのですが、四角形の角を丸く(ワードの図形描画にある「角丸四角」です。)したり面取り(日曜大工で角を落とすのとおなじ)にはどのようにしたら良いのでしょうか? 多角形は参考するのがあったのですが、「角」の加工について調べたのですが見当たりませんでした。 【四角形描画】 //Graphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //Penオブジェクトの作成(幅1の黒色) //(この場合はPenを作成せずに、Pens.Blackを使っても良い) Pen p = new Pen(Color.Black, 1); //(10,20,100,80)の長方形を描く g.DrawRectangle(p, 10, 20, 100, 80); //リソースを開放する p.Dispose(); g.Dispose(); 【四角形の一箇所の角を丸くする】  →四角形の角の描画が残ってしまう。 //Graphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //位置(10, 20)に100x80の四角を赤色で描く g.DrawRectangle(Pens.Red, 10, 20, 100, 80); //先に描いた四角に外接する楕円の一部 //(開始角度 0度、スイープ角度 90度)を黒で描く g.DrawArc(Pens.Black, 10, 20, 100, 80, 0, 90); //リソースを開放する g.Dispose();

  • VS2005 line

    Visual Basic 2005での質問です。 フォームが開いた時、線を一本ひくには Private Sub Form1_Paint(ByVal sender As Object, ByVal e _ As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint e.Graphics.DrawLine(Pens.Black, 0, 25, Me.Width, 25) End Sub でわかりましたが、 ボタンを一個置いて、それをクリックした時、線を一本ひくにはどうしたらいいですか。 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click XXXXX.DrawLine(Pens.Black, 0, 25, Me.Width, 25) End Sub XXXXX.の所をなんて記述したらいいのでしょうか? アクセスのVBAしか使ったことがないもので・・・

  • vb2008で四角や直線を描写する方法

    現在、新しく「Microsoft Visual Basic 2008 Express Edition」と「Microsoft SQL Server 2005」を使用して 開発することになり勉強を始めている初心者です。 ACCESSは経験しているのでACCESSのように開発できないかと思い質問させていただきました。 質問内容は、フォーム上に線で四角や直線を描写する方法を教えてほしいことです。 ツールボックスにもそのようなツールがなくどうすれば簡単にできるのでしょうか? 調べたところ、DrawLineメソッドや、DrawRectangleメソッドを使えば表示できるようなことがわかりました。 しかし、座標で書くのに慣れていないため簡単にできません。 GDI(Graphics Design Interface)+が使用できるとも書いてありましたが、どういうことなのか わかりません。 どなたか教えて下さい。お願いします。

  • VB 線を描く

    VBを活用していきたく、勉強を始めました。 (N88-BASICはずっと前に使っていました。) 下記URLを参考に、線を描くことに挑戦したのですがうまくいきません。 状況は以下の通りで、原因がわからず困っているのですが、誰かしっている人いたらお願いします。 ・Visual Basic 2010 Expressを使用 ・下記URLを参考に  e.Graphics.DrawLine(Pens.Red, 50, 60, 100, 150)  をForm1.vbに記述してF5キーで実行したらエラー一覧に 「'Graphics'は'System.EventArgs'のメンバーではありません。」 との表示が出てきてしまします。 参考URL http://homepage1.nifty.com/rucio/VBStandard/vbstandard2.htm

  • f(x)=xのf'(x)と∫f(x)dxのグラフ化

    f(x)=xのf'(x)と∫f(x)dxのグラフ化したいのですがここからどうすればいいのか分からず足踏みしてます。ご教授ください。 積分区間は0~xです。 import java.awt.*; import java.awt.event.*; public class graphics0 extends Frame { // コンストラクタ public graphics0(){ setSize(500, 500); setVisible(true); setTitle("graphics0"); // メッセージ処理 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } // メインメソッド public static void main(String[] args){ new graphics0(); } // ペイントメソッド public void paint(Graphics g){ //ここに絵をかくコードを書く // 中心座標 int ox = 250; int oy = 250; // グラフの幅 int width = 200; int height = 200; //直線描画のための2点(x0,y0), (x1, y1) double x0, y0; double x1, y1; // 刻み幅 double d = 0.001; double n = (int) (1.0 / d); // 軸の描画 g.drawLine(50, 250, 450, 250); g.drawLine(250, 50, 250, 450); x0 = 0; y0 = 0; x1 = d; for(int i = 0; i < n; i++){ y1 = x1 * x1; g.drawLine( (int) (x0 * width) + ox, -((int)(y0 * height) -oy), (int) (x1 * width) + ox, -((int) (y1 * height) - oy)); x0 += d; x1 += d; y0 = y1; } } } よろしくお願いいたします。

  • javaアプレット

    javaアプレットの勉強をしているのですが、教えてください。 マウスを押すと位置を取得して、線を描くアプレットをつくってみたいと思っています。 一回目に押した位置を始点として、二回目の位置まで線を引きます。このとき、二回目にマウスを押したときにはじめて線を描画するとします。その後、三回目、四回目とマウスを押していくと、前に押した位置を始点として線を引くようなアプレットです。 そこで以下のようにコードを書いて実行してみました。(部分) public void mousePressed(MouseEvent e) { n=n+1; if(n==1){ x1=e.getX(); y1=e.getY();} else{ x2=e.getX(); y2=e.getY(); repaint(); x1=x2; y1=y2; } } public void paint(Graphics g) { g.drawLine(x1,y1,x2,y2); } ところが、実行してみると、マウスを押す位置に点が移動するだけでした。おそらく、コード中のx1=x2;y1=y2;がrepaint();より前に実行されてしまうのではないかと思います。どう書き直せばいいのでしょうか?また、どうしてrepaint();より前に実行されてしまうのでしょうか?

    • ベストアンサー
    • Java
  • VB .net Form_Load時、または関数内でPictureBoxにライン描画を行ないたい。

    Form上にPictureBox,Buttonを配置して、Botton_Click処理時にPictureBox上へのライン描画は Dim g As Graphics = PictureBox1.CreateGraphics g.DrawLine(Pens.Red, 0, 0, 100, 200) g,Dispose() にて行なえましたが、同じような描画を Form_Load時に上記の処理を入れても全く描画されません。Button_Clickイベントのように1クッション置かないと実現できないのでしょうか? Form_Load時、関数内などで周期的にライン描画を 行なってやりたいのですが、どなたか解決方法をご存知の方がいましたら回答の程よろしくお願いいたします。

専門家に質問してみよう