グラフィックス (Visual Basic 6.0 ユーザー向け)
更新 : 2007 年 11 月
Visual Basic 6.0 では、Form コントロールまたは PictureBox コントロールに描画する場合は、グラフィックスの各種メソッドおよびプロパティを使用します。Visual Basic 6.0 のグラフィックスは、Windows のグラフィック デバイス インターフェイス (GDI) の API に基づいてます。
Visual Basic 2008 のグラフィックスは、GDI+ API にカプセル化された System.Drawing 名前空間によって提供されます。GDI+ は Visual Basic 6.0 のグラフィックス機能に基づいて拡張されていますが、メソッドに互換性はありません。
概念の違い
Visual Basic 6.0 では、グラフィックス メソッドは、Form オブジェクトおよび PictureBox コントロールだけに適用されます。
Visual Basic 2008 では、グラフィックス メソッドは、フォームに加えて、PictureBox、Panel、GroupBox など、Paint イベントをサポートする任意のコントロールに適用されます。また、グラフィックス メソッドは、ListView、TreeView、Button コントロールなど、OwnerDraw プロパティをサポートする任意のコントロールにも適用されます。
AutoRedraw プロパティ
Visual Basic 6.0 のグラフィックス メソッドは、任意のイベント プロシージャから呼び出すことができます。グラフィックス メソッドが、Paint 以外のイベントから呼び出された場合は、グラフィックスを永続化するために AutoRedraw プロパティが使用されます。
Visual Basic 2008 では、グラフィックス メソッドは、Paint イベント プロシージャからのみ呼び出されます。ただし、オーナー描画コントロールの場合、さまざまな Draw イベント プロシージャ (DrawItem、DrawSubItem など) からも呼び出されます。Paint イベントおよび Draw イベントで自動的にグラフィックスが永続化されるので、AutoRedraw プロパティは不要になり、サポートされなくなりました。
ClipControls プロパティ
Visual Basic 6.0 では、フォームまたはコントロールの描画を制御するために、ClipControls プロパティを使用します。このプロパティを True に設定すると、それまで見えていなかった領域のみが再描画され、理論上はパフォーマンスが向上します。
ClipControls プロパティに相当するものは、Visual Basic 2008 にはありません。GDI+ によりパフォーマンスが向上し、最新のビデオ アダプタが使用できるようになったため、このプロパティの必要性はなくなりました。
DrawMode プロパティ
Visual Basic 6.0 では、パターンを別のパターンの上に描画するときに DrawMode プロパティによってグラフィックス オブジェクトの色が制御されます。このプロパティが効力を持つのは、モノクロ ディスプレイまたは解像度の低い (256 色以下) ディスプレイだけです。
DrawMode プロパティに相当するものは、Visual Basic 2008 にありません。現在のディスプレイでは不要になりました。
DrawStyle プロパティ
Visual Basic 6.0 では、Line メソッドを使用して描画する線の外観を制御するために、DrawStyle プロパティを使用します。DrawWidth プロパティが 1 より大きい値に設定されている場合、DrawStyle プロパティは無効になり、線は常に実線になります。
Visual Basic 2008 では、DrawLine のいずれかのメソッドで使用される System.Drawing.Pen クラスの DashStyle プロパティを設定することで、線の外観を制御します。線の幅は、このプロパティに影響されません。
DrawWidth プロパティ
Visual Basic 6.0 では、DrawWidth プロパティで線のピクセル幅が決定されます。通常、DrawWidth プロパティは、グラフィックス メソッドを実行する前に設定します。
Visual Basic 2008 では、System.Drawing.Pen コントロールの Pen.Width プロパティで線の幅が決定されます。Pen の作成時に Width プロパティをパラメータとして設定するか、Pen の作成後に Pen.Width を設定できます。Pen.Width プロパティを指定しない場合、既定は 1 ピクセルです。
Image プロパティ
Visual Basic 6.0 では、フォームまたは PictureBox コントロールの Image プロパティは、ビットマップのハンドルを返します。このハンドルは、Picture プロパティに割り当てたり、Windows API の呼び出し時に値として渡したりできます。
Visual Basic 2008 では、ビットマップにハンドルはなくなりました。ビットマップそのものを Bitmap 型のオブジェクトとして渡します。Bitmap コントロールは、PictureBox コントロールの Image プロパティに割り当てることができますが、Windows API の呼び出し時に渡すことはできません。
Line メソッド
Visual Basic 6.0 では、Line メソッドは、左上と下部の座標およびオプションの引数 B を指定して、四角形を描画するために使用します。FillColor プロパティは純色で四角形を塗りつぶすのに使用し、FillStyle プロパティはクロスハッチ パターンで四角形を塗りつぶすのに使用します。
Visual Basic 2008 では、DrawRectangles メソッドは四角形の境界線を描画するのに使用し、FillRectangle メソッドは四角形を塗りつぶすのに使用します。FillRectangle は、Brush オブジェクトをパラメータとして受け取ります。 FillColor プロパティは SolidBrush に置き換えられ、FillStyle プロパティは HatchBrush クラスのメンバに置き換えられました。
Point メソッド
Visual Basic 6.0 では、フォームまたは PictureBox コントロールの Point メソッドは、指定の場所にあるピクセルのカラー値を取得するのに使用します。Point メソッドは、画像のないフォームまたはコントロールでも使用できますが、ほとんどの場合は、Picture プロパティに割り当てられたビットマップのカラーを取得するために使用されます。
Visual Basic 2008 では、Point メソッドは使用されなくなりました。ビットマップからカラー値を取得するには、M:System.Drawing.Bitmap.GetPixel(System.Int32,System.Int32) メソッドを使用します。フォームまたはコントロールに画像がない場合は、BackColor プロパティを使用できます。
Print メソッド
Visual Basic 6.0 では、Print メソッドは、フォームまたは PictureBox コントロールにテキストを表示するのに使用します。テキストの表示に使うフォントは、フォームまたはコントロールの Font プロパティで決定され、色は ForeColor プロパティで決定されます。Print メソッドには、テキストの配置を決めたり、テキストを縦方向に表示したりする機能はありません。
Visual Basic 2008 では、テキストの表示に DrawString メソッドを使用します。フォントは Font オブジェクトによって決定され、色は Brush オブジェクトによって決定されます。どちらのオブジェクトも、パラメータとして DrawString メソッドに渡します。DrawString メソッドには、X および Y というパラメータもあり、これらを使ってテキストの開始位置を指定できます。また、オプションの Format パラメータに StringFormat オブジェクトを渡して、テキストを縦方向に表示することもできます。
PSet メソッド
Visual Basic 6.0 では、PSet メソッドは、フォーム上または PictureBox コントロール上のピクセルの色を変更するのに使用します。DrawWidth プロパティが 1 より大きい値に設定されている場合は、PSet メソッドは塗りつぶされた円を描画します。省略された ForeColor を使用する場合は、省略可能なパラメータを使って色を指定します。
Visual Basic 2008 には、PSet メソッドに直接対応するものはありません。フォーム上または PictureBox コントロール上の 1 ピクセルの色を変更するには、DrawEllipse メソッドを使って高さと幅が 1 ピクセルの円を描画します。DrawWidth が 1 より大きい場合に PSet と同等の機能を実現するには、FillEllipse メソッドを使用します。
グラフィックスを扱うコードの変更
次のコード例は、Visual Basic 6.0 と Visual Basic 2008 のコーディング テクニックの違いを示しています。
単純な線の描画
次のコードは、実行時にフォーム上に線を描画する方法を示します。Visual Basic 6.0 のコード例では、Line メソッドを使用し、パラメータとして線の開始位置と終了位置の X 座標と Y 座標を渡し、オプションの引数として色を渡します。Visual Basic 2008 のコード例では、DrawLine メソッドを使用し、引数として Pens オブジェクトと、開始位置と終了位置の X 座標および Y 座標を渡します。
メモ : |
---|
Visual Basic 6.0 の既定の測定単位は twip ですが、Visual Basic 2008 の測定単位はピクセルです。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a solid black line 200 twips from the top of the form.
Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint(ByVal sender As Object, ByVal e _
As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a solid black line 25 pixels from the top of the form.
e.Graphics.DrawLine(Pens.Black, 0, 25, Me.Width, 25)
End Sub
点線の描画
次のコードは、実行時にフォーム上に点線を描画する方法を示します。Visual Basic 6.0 のコード例では、DrawStyle プロパティを使用して線の外観を指定します。Visual Basic 2008 のコード例では、Pen オブジェクトを使用し、DashStyle プロパティを設定して外観を指定します。
メモ : |
---|
Visual Basic 6.0 の既定の測定単位は twip ですが、Visual Basic 2008 の測定単位はピクセルです。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a dotted line 200 twips from the top of the form.
Me.DrawStyle = vbDot
Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint1(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a dotted black line 25 pixels from the top of the form.
Dim LPen As New System.Drawing.Pen(System.Drawing.Color.Black)
LPen.DashStyle = Drawing2D.DashStyle.Dot
e.Graphics.DrawLine(LPen, 0, 25, Me.Width, 25)
End Sub
線の太さの制御
次のコードは、実行時にフォーム上に太さの異なる複数の線を描画する方法を示します。Visual Basic 6.0 のコード例では、DrawWidth プロパティを使用します。Visual Basic 2008 のコード例では、Pens オブジェクトの Width プロパティを使用します。
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a line with a thickness of 1 pixel.
DrawWidth = 1
Line (0, 200)-(ScaleWidth, 200), vbBlack
' Draw a line with a thickness of 5 pixels.
DrawWidth = 5
Line (0, 400)-(ScaleWidth, 400), vbBlack
' Draw a line with a thickness of 10 pixels.
DrawWidth = 10
Line (0, 600)-(ScaleWidth, 600), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint2(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a line with a thickness of 1 pixel.
Dim TPen As New System.Drawing.Pen(System.Drawing.Color.Black, 1)
e.Graphics.DrawLine(TPen, 0, 25, Me.Width, 25)
' Draw a line with a thickness of 5 pixels.
TPen.Width = 5
e.Graphics.DrawLine(TPen, 0, 50, Me.Width, 50)
' Draw a line with a thickness of 10 pixels.
TPen.Width = 10
e.Graphics.DrawLine(TPen, 0, 75, Me.Width, 75)
End Sub
円の描画
次のコードは、実行時にフォーム上に円を描画する方法を示します。Visual Basic 6.0 のコード例では、Circle メソッドを使用し、引数として円の中心点の X および Y 座標と半径を渡し、オプションで色を渡します。Visual Basic 2008 のコード例では、DrawEllipse メソッドを使用し、引数として Pen オブジェクト、外接する四角形の左上隅の X 座標および Y 座標、幅と高さを渡します。
メモ : |
---|
Visual Basic 6.0 の既定の測定単位は twip ですが、Visual Basic 2008 の測定単位はピクセルです。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a 1000 twip diameter red circle
Circle (500, 500), 500, vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint3(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a 70 pixel diameter red circle.
e.Graphics.DrawEllipse(Pens.Red, 0, 0, 70, 70)
End Sub
塗りつぶされた四角形の描画
次のコードでは、実行時に 2 つの四角形をフォーム上に描画します。1 つの四角形は純色で塗りつぶし、もう 1 つの四角形はクロスハッチ パターンで塗りつぶします。Visual Basic 6.0 のコード例では、FillColor プロパティと FillStyle プロパティおよび Line メソッドを使用します。B パラメータを指定して Line メソッドを呼び出して、四角形を描画します。
Visual Basic 2008 のコード例では、Graphics.Rectangle メソッドを使って輪郭を描画し、Graphics.FillRectangle メソッドに引数として Brush オブジェクトを渡します。この例では、SolidBrush コントロールと HatchBrush コントロールの両方を使用します。
メモ : |
---|
Visual Basic 6.0 の既定の測定単位は twip ですが、Visual Basic 2008 の測定単位はピクセルです。 |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a solid red rectangle.
FillColor = vbRed
FillStyle = vbSolid
Line (10, 10)- (1000, 500), vbRed, B
' Draw a rectangle filled with a crosshatch pattern.
FillColor = vbBlack
FillStyle = vbCross
Line (10, 500)- (1000, 1000), vbBlack, B
End Sub
' Visual Basic
Private Sub Form1_Paint4(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a solid red rectangle.
Dim SBrush As New System.Drawing.SolidBrush _
(System.Drawing.Color.Red)
e.Graphics.DrawRectangle(Pens.Red, 2, 2, 70, 40)
e.Graphics.FillRectangle(SBrush, 2, 2, 70, 40)
' Draw a rectangle filled with a crosshatch pattern.
Dim HBrush As New System.Drawing.Drawing2D.HatchBrush( _
System.Drawing.Drawing2D.HatchStyle.Cross, _
System.Drawing.Color.Black, System.Drawing.Color.Transparent)
e.Graphics.DrawRectangle(Pens.Black, 2, 40, 70, 40)
e.Graphics.FillRectangle(HBrush, 2, 40, 70, 40)
End Sub
フォーム上での画像の表示
次のコードは、グラフィックス メソッドを使って、実行時にフォーム上に画像を表示する方法を示します。Visual Basic 6.0 のコード例では、PaintPicture メソッドを使用します。Visual Basic 2008 の例では、DrawImage メソッドを使用します。
' Visual Basic 6.0
Private Sub Form_Paint()
' Create a stdPicture object.
Dim Pict1 As New stdPicture
Pict1 = LoadPicture("C:\Windows\Greenstone.bmp")
PaintPicture Pict1, 0, 0
End Sub
' Visual Basic
Private Sub Form1_Paint5(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Create a Bitmap object.
Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
e.Graphics.DrawImage(Pict1, 0, 0)
End Sub
フォーム上でのテキストの表示
次のコードは、グラフィックス メソッドを使って、実行時にフォーム上にテキスト文字列を表示する方法を示します。Visual Basic 6.0 のコード例では、Print メソッドを使用します。Visual Basic 2008 の例では、DrawString メソッドを使用します。
' Visual Basic 6.0
Private Sub Form_Paint()
Me.Font.Size = 24
Me.Font.Bold = True
Me.ForeColor = vbRed
Print "Hello World!"
End Sub
' Visual Basic
Private Sub Form1_Paint6(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
TextFont.Dispose()
TextBrush.Dispose()
End Sub
文字列の高さと幅の確認
次のコードは、グラフィックス メソッドを使って、実行時にフォーム上の文字列のサイズを確認し、その周囲に四角形を描画する方法を示します。Visual Basic 6.0 のコード例では、TextHeight メソッドと TextWidth メソッドを使用します。Visual Basic 2008 のコード例では、MeasureString メソッドを使用します。このメソッドは、SizeF 構造体を返します。
' Visual Basic 6.0
Private Sub Form_Paint()
Me.Font.Size = 24
Me.Font.Bold = True
Me.ForeColor = vbRed
Print "Hello World!"
Line (0, 0)-(TextWidth("Hello World!"), _
TextHeight("Hello World!")), vbBlack, B
End Sub
' Visual Basic
Private Sub Form1_Paint7(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
Dim TextSize As New System.Drawing.SizeF
TextSize = e.Graphics.MeasureString("Hello World!", TextFont)
e.Graphics.DrawRectangle(Pens.Black, 10, 10, TextSize.Width, TextSize.Height)
TextFont.Dispose()
TextBrush.Dispose()
End Sub
単一のピクセルの描画
次のコードは、グラフィックス メソッドを使って、実行時にフォーム上の 1 ピクセルの色を変更する方法を示します。Visual Basic 6.0 のコード例では、PSet メソッドを使用します。Visual Basic 2008 のコード例では、DrawEllipse メソッドを使用し、Height パラメータと Width パラメータを 1 に設定します。
メモ Visual Basic 6.0 の既定の測定単位は twip ですが、Visual Basic 2008 の測定単位はピクセルです。
' Visual Basic 6.0
Private Sub Form_Paint()
Me.DrawWidth = 1
PSet (1000, 1000), vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint8(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
e.Graphics.DrawEllipse(Pens.Red, 70, 70, 1, 1)
End Sub
単一ピクセルの色の確認
次のコードは、グラフィックス メソッドを使って、実行時にフォーム上の画像の指定した位置にある 1 ピクセルの色を確認し、その色で四角形を塗りつぶして描画する方法を示します。Visual Basic 6.0 のコード例では、Point メソッドを使ってカラー値を取得します。Visual Basic 2008 の例では、GetPixel メソッドを使用します。
メモ : |
---|
Visual Basic 6.0 の既定の測定単位は twip ですが、Visual Basic 2008 の測定単位はピクセルです。 |
' Visual Basic 6.0
Private Sub Form_Paint()
Dim PixelColor As Long
Picture1.Picture = LoadPicture("C:\Windows\Greenstone.bmp")
PixelColor = Picture1.Point(10, 10)
FillColor = PixelColor
Line (0, 0)-(100, 500), PixelColor, B
End Sub
' Visual Basic
Private Sub Form1_Paint9(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
Picture1.Image = Pict1
Dim PixelColor As Color = Pict1.GetPixel(4, 4)
Dim PixelBrush As New SolidBrush(PixelColor)
e.Graphics.FillRectangle(PixelBrush, 0, 0, 100, 100)
End Sub
グラフィックス プロパティとメソッドの対応関係
次の表は、Visual Basic 6.0 のグラフィックス プロパティおよびグラフィックス メソッドと、Visual Basic 2008 でそれらに対応するものを示します。
Visual Basic 6.0 |
Visual Basic 2008 で対応するもの |
---|---|
AutoRedraw プロパティ |
新規に実装されました。グラフィックスを永続化するには、Paint イベントにグラフィックス メソッドを記述します。 |
Circle メソッド |
DrawEllipse メソッド |
ClipControls プロパティ |
新規に実装されました。ClipControls プロパティは不要になりました。 |
Cls メソッド |
Clear メソッド |
CurrentX プロパティ |
各種グラフィックス メソッドの x パラメータ。たとえば、DrawRectangle(pen, x, y, width, height)。 |
CurrentY プロパティ |
各種グラフィックス メソッドの y パラメータ。たとえば、DrawRectangle (pen, x, y, width, height)。 |
DrawMode プロパティ |
新規に実装されました。DrawMode プロパティは不要になりました。 |
DrawStyle プロパティ |
DashStyle プロパティ |
DrawWidth プロパティ |
Width プロパティ |
FillColor プロパティ |
SolidBrush オブジェクト |
FillStyle プロパティ |
HatchBrush オブジェクト |
HasDC プロパティ |
新規に実装されました。GDI+ では、デバイス コンテキストは不要になりました。 |
HDC プロパティ |
新規に実装されました。GDI+ では、デバイス コンテキストは不要になりました。 |
Image プロパティ |
新規に実装されました。 |
Line メソッド |
DrawLine メソッド |
PaintPicture メソッド |
DrawImage メソッド |
Point メソッド |
直接対応する項目はありません。ビットマップには、Bitmap.GetPixel を使用します。フォームまたはコントロールには、BackColor プロパティを使用します。 |
Print メソッド |
DrawString メソッド |
Pset メソッド |
DrawEllipse メソッド、FillEllipse メソッド |
TextHeight、TextWidth プロパティ |
MeasureString メソッド |
アップグレード メモ
アプリケーションを Visual Basic 6.0 から Visual Basic 2008 にアップグレードすると、グラフィックス メソッドはアップグレードされず、警告がコードに挿入されます。GDI と GDI+ では大きな違いがあるので、既存のグラフィックス コードは書き直す必要があります。