パソコン活用研究BASIC&VB&EXCEL達人の道(旧称 パソコン活用研究5番街)

FORMのグラフィックメソッド

FORM上にグラフィックを描く手段としては、(1)Picture, Imageコントロールを貼り付ける。(2)ラインコントロールシェイプコントロールで図形を描く。 (3)グラフィックメソッドを使い図形を描く の3通りの方法があります。
おそらく一番多用されるのは、(1))Picture, Imageコントロール だと思いますが、(3)グラフィックメソッドもそれなりに知っていたら便利な手法です。今回はこのグラフィックメソッドについて簡単に追及してみます。

今回、説明する内容の一部は、Visual Basic4.0〜6.0に特有の方法になります。Visual Basic.Netや2005ではグラフィックに関する仕様が大きく変更されております。(今頃、のろのろVB4〜6のことを書くのも、どうかとは思いますが)

グラフィック関連のテクニックについてはBASICの技法も参考になりますので、以下のBASICのページなどもご参照下さい。
グラフィックの基本  グラフィックの基本2(点で直線を描く)



1 グラフィックメソッドについて
昔の手続き型Basicの時代、画面にお絵かきするのに、line (直線をひく)、circle (円を描く)、pset (点をうつ)などの命令を使っていろんなお絵かきをしましたが、Form上にお絵かきするのに、Visual Basicでも同様なグラフィックメソッドが用意されています。

昔のBasicと違う点は、これらのグラフィック描画の命令は、あるコントロール(FormやPicture)のメソッドなので
Form1.Circle ... とするとForm1上に円を描き、
Picture1.Circle ... とするとPicture1(コントロール)上に円を描く
という点くらいでしょうか。
この点さえ意識すれば、あとはBasic時代と同じ感覚で使えます。グラフィックメソッドはFormだけでなくPictureに対しても同様に使えます。

代表的なグラフィックメソッド
Circle 円を描く
Cls 画面のクリア
Line 直線
Point 指定点の色の取得(RGB値)
Pset 点の描画
PaintPicture 指定した位置のグラッフィックを、他の位置にコピーする
Scale 座標系の設定

各メソッドの使用例は後ほど研究することにします。


2 座標
(1) 座標の単位
座標の単位はデフォルトではtwipという単位になっていますが、ScaleModeプロパティで以下の単位を設定することができます。1センチが567twip、1インチが1440twipになります。ピクセルというのは画面の解像度の最小単位になります(すなわち、古きよき時代のBASICでの画面の座標と同じことになります)
Form1.ScaleMode = 3
とすると、座標はピクセル単位になります。
ScalMode 座標単位
0 ユーザ定義の単位
1 twip
2 ポイント
3 ピクセル
4 キャラクタ
5 インチ
6 mm
7 cm

(2) 座標のプロパティ
座標を表すプロパティには以下のようなものがあります。
Height, WidthはFormそのものの高さと幅になります。
ScaleHeight, ScaleWidthは、Formの内部の表示可能部分(内部座標)の高さ、幅になります。

Formに何かコントロール(ピクチャーボックス、イメージ、コマンドボタン他)を配置する時、それらのコントロールの左隅の位置がLeft, Topになります。
例えば、Pictureの位置を指定する場合は、Formの内部座標の値を指定します。
Picture1.Left = 100
Picture1.Top = 50

PictureをFormのど真ん中に配置したければ、以下のように指定すればOkです。
Picture1.Left = Form1.ScaleWidth/2 - Picture1.Width/2
Picture1.Top = Form1.ScaleHeight/2 - Picture1.Height/2




(3) CurrentX, CurrentY
Form上の描画用カーソルの現在位置を取得、設定します。グラフィックメソッドを実行するとCurrentX,CurrentYは以下のように設定されます。
Circle 円の中心      Cls  (0,0)     Line 直線の終点
Print  次の表示位置   Pset 描かれた点の位置


3 色
(1) RGB
色を表す値は倍長整数で表し、テキスト、グラフィックで共通で使われます。
&Hbbggrr  bb, gg, rr は青、緑、赤の色の成分でそれぞれ00〜FFの値をとります。
この形式の色の値をRGB値と読んでいます。

代表的な色の値
&H000000
&HFF0000
&H00FF00
&H0000FF
&H00FFFF
&HFF00FF
&HFFFF00 水色
&HFFFFFF

色を作成するには、RGB関数を使って、RGB(青成分,緑成分,赤成分)のように指定します。
例) RGB(255,0,255)  =>紫になります。

RGB関数をグラッフィックメソッドの中に直接記述して、色の指定をすることができます。
例えば、黒の点を打つ場合は、
Form1.Pset (50, 50) , RGB(0,0,0)
のようになります。

(2) QBColor
旧来のBASICに一般的だった16色の色番号で、色を指定するために、QBColorという関数も用意されていて、以下のように使います。
QBColor(色番号)

QBColorの色番号
0 黒   8 灰色
1 9 明るい青
2 10 明るい緑
3 シアン 11 明るいシアン
4 12 明るい赤
5 マゼンダ 13 明るいマゼンダ
6 14 明るい黄
7 15 明るい白


(3) RGB関数の使用例
RGB関数を使って、簡単な色作成プログラムを作成してみましょう。赤、緑、青の成分をスクロールバーで調整すると、ピクチャーの背景色として指定された色を表示するプログラムです。
ラベル、スクロールバー、ピクチャーを下のように配置します。



プログラムの主要部は以下の通りです。
スクロールバーの値に変化があれば、その値をラベルで表示+ピクチャーの背景色として表示するだけ、のシンプルなものです。

Private Sub Form_Load()
'  スクロールバーの最大値(max)は255に設定します。
HScroll1.Max = 255: HScroll1.Value = 0
HScroll2.Max = 255: HScroll2.Value = 0
HScroll3.Max = 255: HScroll3.Value = 0
End Sub

' スクロールバーの値に変化があれば、変化した色をRGB関数でピクチャーの背景色に指定します
Private Sub HScroll1_Change()
Label4.Caption = HScroll1.Value
Picture1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
End Sub

Private Sub HScroll2_Change()
Label5.Caption = HScroll2.Value
Picture1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
End Sub

Private Sub HScroll3_Change()
Label6.Caption = HScroll3.Value
Picture1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
End Sub

4 基本的なグラフィックメソッドとグラッフィック関係のプロパティ
基本的なグラフィックメソッドとして、Cls, Pset, Pointの使い方について説明します。

【 書式】

[control.] Cls
グラッフィックメソッドで描画したグラフィックとテキストを消去します。Clsを実行するとCurrentX,CurrentYは0に設定されます。
Cls実行前にAutoRedrawをFalseにすると、AutoRedrawがTrueの間に描画したグラフィックとテキストは消去されません。

[control.] Pset [Step] (x,y) [,col]
(x,y)の位置にcolで指定した色で点を描画します。StepをつけるとCurrentX,CurrentYからの相対位置になります。コントロール(Form等)のDrwaWidthプロパティを1以上にすると、(x,y)を中心にした太い点(円)が描かれます。描いた点を消すには、コントロールの背景色(BackColorプロパティ)と同じ色をcolに指定することで、可能です。


[control.] Point(x,y)
(x,y)位置の点の色をRGB値で取得します。
取得したRGB値はlong型整数で、&Hbbggrr(bb, gg, rr は青、緑、赤の色の成分でそれぞれ00〜FFの値をとります。)の形になっています。

[control.] Circle [Step] (x,y), r [, [col][, [start][,end],[aspect]]]


Step  Stepを指定すると(x,y)の位置座標はCurrentX,CurrentYからの相対座標を意味します。
(x,y)  円の中心座標
r    半径
col   色を示すRGB値
start, end  円弧を描く時の開始角と終了角。ラジアンで指定します。
aspect 円の縦横比。デフォルトは1.0。1より大きければ縦長、小さければ横長になります。

FormのプロパティのFillColor,FillStyleで円内を塗りつぶす色、スタイルを指定することができます。

[control.] Line [[Step1](x1,y1)]-[Step2](x2,y2)[,[col][,{B/BF}]]
(x1,y1)-(x2,y2)に直線を描画します。(x1,y1)を省略すると、描画カーソルの現在位置(CurrentX,CurrentY)から(x2,y2)に直線を描画します。

Step1,Step2 Step1を指定すると現在位置からの相対位置、Step2を指定すると第一座標(x1,y1)からの相対位置になります。
col   色を示すRGB値
B/BF  Bを指定すると(x1,y1)-(x2,y2)を対角の頂点とする四角形を描き、BFを指定するとその四角形の中を、Fillcolor,FillStyleを使って塗りつぶします。

(2) グラッフィック関連のプロパティ
Form等のコントロールのプロパティで描画に関するものを説明します。

FillColor 塗りつぶす色。  (設定例) Form1.Fillcolor = RGB(255,0,255)
FillStyle 塗りつぶすスタイル。 (設定例) Form1.FillStyle = 1
FillStyleの設定値 塗りつぶすスタイル
0 塗りつぶし
1 塗りつぶさない(デフォルト)
2 横線
3 縦線
4 斜線 右下がり
5 斜線 左下がり(/)
6 クロス
7 網掛け

DrawWidth  描く線の太さを指定する。1〜32767で単位はピクセルになります。
DrawMode  描画のモードを指定します。
(Destは現在画面に表示している色。Penは描画する線の色=ForeColorやFillColor)
mode 機能
1
2 Not (Dest Or Pen) marge pen(15)を反転した設定
3 Dest And (Not Pen) 背景色とペンの反転色を組み合わせて出力
4 Not Pen Copy Pen(13)を反転した設定
5 (Not Dest) And Pen ペンと表示の反転色に共通する色を組み合わせて出力
6 Not Dest 表示色を反転して出力
7 Dest Xor Pen ペンと表示色使われている色で、どちらか一方に含まれている色を組み合わせて出力
8 Not (Dest And Pen) Mask Pen(9)を反転した設定
9 Dest And Pen Mask Pen ペンと表示色に共通する色を組み合わせて出力
10 Not (Dest Xor Pen) 7を反転した設定
11 Dest 何も表示しない(表示色のまま)
12 Dest Or (Not Pen) 表示色とペンの反転色を組み合わせて出力
13 Pen Copy Pen(デフォルト) Forecolor(ペンの色)で設定した色を出力
14 (Not Dest) Or Pen ペンの色と表示の反転色を組み合わせて出力
15 Dest Or Pen Marge Pen ペンの色と表示色を組み合わせて出力
16

DrawStyle 線の種類を指定
Style 種類
0 実線(デフォルト)
1 鎖線
2 点線
3 一点鎖線
4 二点鎖線
5 透明
6 塗りつぶし

(3) グラフィックメソッド使用例
[描画]ボタンを押すと、赤、青、緑の円を描くプログラムです。お互いの円の重なった部分は、DrawMode=15(表示色とペンの色のorをとる)で描いています。すなわち、光の三原色の重なりと同じパターンです。


まず、背景色BackColorを黒=RGB(0,0,0)にして、
DrawMode=15(表示色とペンの色のor)
FillStyleは0(塗りつぶし)
塗りつぶす色はFillColorでそれぞれ赤、緑、青に設定
Private Sub Command1_Click()
Form1.BackColor = RGB(0, 0, 0)
Form1.DrawMode = 15
Form1.FillStyle = 0
Form1.FillColor = RGB(255, 0, 0)
Circle (250, 100), 100, RGB(255, 0, 0)
Form1.FillColor = RGB(0, 255, 0)
Circle (180, 200), 100, RGB(0, 255, 255)
Form1.FillColor = RGB(0, 0, 255)
Circle (320, 200), 100, RGB(0, 0, 255)
End Sub


TopPage > Visual BasIc&Excel活用研究目次