連載:放課後VB教室

第4回 図形の描画とSP1と「ゆるキャラ」メーカー

羽山 博
2008/10/17
Page1 Page2 Page3

もっと簡単に図形を描画するには 〜 SP1の新しいコントロール

あははは。面白い。いろんな顔が作れるね。これなんてサブローそっくり。ほら見てごらん。

もうっ、ラスクったら。あれっ、ラスクの画面……ボクのとちょっと違う。ツールボックスのLineShapeとかOvalShapeとかRectangleShapeってコントロール、ボクのにはないよ。どうやったの、これ?

ほんとだ。でも、ネスト先生に教えてもらって、Visual Basic 2008 Express Editionを普通にインストールしただけだよ。ネスト先生、これっていったい?

そうか、サブローくんの開発環境はService Pack 1(SP1)じゃないんだな。それらのコントロールはSP1で追加された新しいコントロールだよ。

特集:新機能がてんこ盛りの「Visual Studio 2008 SP1」レビュー

 Visual Studio 2008ならMicrosoft UpdateでSP1が自動的に適用できるんだが、Visual Basic 2008 Express Editionの場合は、いったんすべてアンインストールしてから、SP1が適用された、

Visual Basic 2008 Express Edition with Service Pack 1

をインストールしなくちゃならない。ラスクちゃんのは、ついこないだインストールしたばかりだから、最初からSP1が適用されていたんだね。


図8 SP1で追加されたコントロール
図形を描画するためのLineShape、OvalShape、RectangleShapeの各コントロールと、DataGridViewコントロールをより柔軟な表示にしたようなDataRepeaterコントロールが追加された。フォームの表示はOvalShapeコントロールとLineShapeコントロールを配置してみたところ。

そうだったんですか。で、このLineShapeとかOvalShapeって線を引いたり、だ円を描いたりするコントロールじゃないんですか。RectangleShapeはきっと四角形を描画するコントロールですよね?

そうだよ。以前はダウンロードして自分でインストールする必要があったんだけど、SP1からVisual Basic Power Packsとして標準で含まれるようになったコントロールだね。かつてのLineコントロールやShapeコントロールのように手軽に使える描画用のコントロールが復活したってわけだ。これはまるで池田名物「ことまん」のような華麗な復活だな。

ええっー。じゃあここまでの苦労は何だったんですか。簡単に使えるものがあったなんて。

でも、それらのコントロールじゃ円弧は描けないよ。それから、Visual Basic Power Packs の描画用コントロールにはCaptureプロパティがないから、マウスでドラッグして位置を変えるといった処理も難しい。

そのCaptureプロパティってなぁに? Captureって、確か「捕まえる」っていう意味だよね?

そう、文字どおりの意味さ。マウスのボタンを押した後に、マウスを動かしてしまうと、マウス・ポインタがコントロールの外やウィンドウの外に移動することもあるだろ。そのときにマウスのボタンを離したとしよう。ButtonUpイベントは、元のコントロールに送られた方がいいのか、それともマウス・ポインタの下にあるコントロールに送られた方がいいのか、どっちがいい?

元のコントロール、かな?

そのとおり。ドラッグを開始すると、ボタンが離されたときにも元のコントロールにちゃんとButtonUpイベントが送られるように、マウスを「捕まえて」いるわけ。コントロール上でマウスが動いたとき、つまりMouseMoveイベントが発生したときには、マウスがキャプチャされていればドラッグの処理をすればいいし、マウスがキャプチャされていなければ単にマウス・ポインタがコントロール上を通過しただけと見なせばいいよね。そのためには、キャプチャされているかどうかをCaptureプロパティで知る必要がある。

 例えば、PictureBoxコントロールなら、次のようなコードを書いておくだけでマウスを使った移動ができる。

Private Sub ExecDrag(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

  If sender.Capture = True Then
    sender.Left = PointToClient(MousePosition).X - sender.Width \ 2
    sender.Top = PointToClient(MousePosition).Y - sender.Height \ 2
  End If

End Sub
PictureBoxコントロールをドラッグして移動するコード
PictureBox1ではなくsenderを使っているのは、プログラムを拡張すると、このイベント・ハンドラを複数のコントロールで共有する可能性があるため。
  マウスがキャプチャされていれば、マウス・ポインタの位置がコントロールの中心となるように移動する。

 ドラッグが開始されるとマウスがキャプチャされ、ドラッグが終了するとマウスのキャプチャが解放されるので、これだけでPictureBoxコントロールが動かせるというわけだ。だが、OvalShapeコントロールやRectangleShapeコントロールにはCaptureプロパティがないので、MouseMoveイベントが発生したときにドラッグ中か(マウスがキャプチャされているか)、単にマウス・ポインタがコントロール上を通過したかが判別できない。

ちなみに、上のコードは前回でも話した遅延バインディングになるので、Option StrictがOnだとエラーになる。その場合は次のように書けばいいね。

Private Sub ExecDrag(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

  Dim c As Control = CType(sender, Control)

  If c.Capture = True Then
    c.Left = PointToClient(MousePosition).X - c.Width \ 2
    c.Top = PointToClient(MousePosition).Y - c.Height \ 2
  End If

End Sub
遅延バインディングを避ける
  Object型のsenderをControl型に変換し、cという変数で参照できるようにする。

 あとは、これまで話してきた方法で、PictureBoxコントロール上に図形が描画されるようにしておけば、図形をドラッグして移動できるようになるね。例えば、以下のようなコードを書けばいい。

Private Sub DrawCircle(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

  e.Graphics.DrawEllipse(Pens.Black, 0, 0, 32, 32)

End Sub
PictureBoxコントロール上に円を描くコード
PictureBox1のPaintイベント・ハンドラにコードを書いておけば、PictureBox1の再描画が必要になったときに自動的にコードが実行され、DrawEllipseメソッドによって円が描かれる。

簡単な図形を描画するだけならVisual Basic Power Packsのコントロールを使えばいいし、ちょっと凝ったことをやりたいならPictureBoxコントロールなどの上に描画するコードを書くのがいいってことですね。勉強になりました。

ウチもほんま勉強になったわー。「ゆるキャラ」メーカー作って、ウハウハやー。おおきにー。

(つづく)

ラスクちゃんのまとめコーナー


  • 図形を描画するには、GraphicsオブジェクトのDrawLine、DrawEllipse、DrawRectangle、DrawArc、FillEllipse、FillRectangleなどのメソッドを使います。

  • フォームやコントロールの再描画が必要になると、Paintイベントが発生し、Paintイベント・ハンドラが自動的に呼び出されます。従って、描画のためのコードはPaintイベント・ハンドラに書いておくのが普通です。

  • 強制的に再描画させたいときには、Refreshメソッドを呼び出します。

  • Visual Basic 2008 にService Pack 1(SP1)を適用すると、LineShapeコントロール、OvalShapeコントロール、RectangleShapeコントロールが使えるようになります。

  • Visual Basic 2008 Express Editionの場合、SP1を適用するには、いったんすべてをアンインストールしてから、SP1が適用されたVisual Basic 2008 Express Editionをインストールし直す必要があります。

 


次回もよろしくね。End of Article

 

 INDEX
  放課後VB教室
  第4回 図形の描画とSP1と「ゆるキャラ」メーカー
    1.図形描画のメソッドを利用する
    2.ボタンをクリックしたときに図形を動かすには
  3.もっと簡単に図形を描画するには 〜 SP1の新しいコントロール
 
インデックス・ページヘ  「放課後VB教室」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH