連載:放課後VB教室第4回 図形の描画とSP1と「ゆるキャラ」メーカー羽山 博2008/10/17 |
|
|
もっと簡単に図形を描画するには 〜 SP1の新しいコントロール
あははは。面白い。いろんな顔が作れるね。これなんてサブローそっくり。ほら見てごらん。
もうっ、ラスクったら。あれっ、ラスクの画面……ボクのとちょっと違う。ツールボックスのLineShapeとかOvalShapeとかRectangleShapeってコントロール、ボクのにはないよ。どうやったの、これ?
ほんとだ。でも、ネスト先生に教えてもらって、Visual Basic 2008 Express Editionを普通にインストールしただけだよ。ネスト先生、これっていったい?
そうか、サブローくんの開発環境はService Pack 1(SP1)じゃないんだな。それらのコントロールは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コントロールなら、次のようなコードを書いておくだけでマウスを使った移動ができる。
| |||
PictureBoxコントロールをドラッグして移動するコード | |||
PictureBox1ではなくsenderを使っているのは、プログラムを拡張すると、このイベント・ハンドラを複数のコントロールで共有する可能性があるため。
|
ドラッグが開始されるとマウスがキャプチャされ、ドラッグが終了するとマウスのキャプチャが解放されるので、これだけでPictureBoxコントロールが動かせるというわけだ。だが、OvalShapeコントロールやRectangleShapeコントロールにはCaptureプロパティがないので、MouseMoveイベントが発生したときにドラッグ中か(マウスがキャプチャされているか)、単にマウス・ポインタがコントロール上を通過したかが判別できない。
ちなみに、上のコードは前回でも話した遅延バインディングになるので、Option StrictがOnだとエラーになる。その場合は次のように書けばいいね。
| |||
遅延バインディングを避ける | |||
|
あとは、これまで話してきた方法で、PictureBoxコントロール上に図形が描画されるようにしておけば、図形をドラッグして移動できるようになるね。例えば、以下のようなコードを書けばいい。
| |
PictureBoxコントロール上に円を描くコード | |
PictureBox1のPaintイベント・ハンドラにコードを書いておけば、PictureBox1の再描画が必要になったときに自動的にコードが実行され、DrawEllipseメソッドによって円が描かれる。 |
簡単な図形を描画するだけならVisual Basic Power Packsのコントロールを使えばいいし、ちょっと凝ったことをやりたいならPictureBoxコントロールなどの上に描画するコードを書くのがいいってことですね。勉強になりました。
ウチもほんま勉強になったわー。「ゆるキャラ」メーカー作って、ウハウハやー。おおきにー。
(つづく)
ラスクちゃんのまとめコーナー
|
|
INDEX | ||
放課後VB教室 | ||
第4回 図形の描画とSP1と「ゆるキャラ」メーカー | ||
1.図形描画のメソッドを利用する | ||
2.ボタンをクリックしたときに図形を動かすには | ||
3.もっと簡単に図形を描画するには 〜 SP1の新しいコントロール | ||
「放課後VB教室」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -