プログラムの概要
10枚のピクチャーボックスの夫々れに、マウスを左ク リックしてドラッグする事に依り、連続線を引き、自由 な絵を描く。此の場合、マウスを右クリックする事に依 り、新たな線を描き始める事が出来る。 描画の対象と成る各ピクチャーボックスは、戻るボタン 又は、進むボタンをクリックする事に依り、変更する事 が出来る。 10枚の絵を描き終われば(途中での再生も可)、再生 ボタンをクリックする事に依り、連続表示する事が出来 る。表示は、トグル形式で連続して行われるので、停止 するには、停止ボタンをクリックする。 今回は、コントロール内でのマウス座標の取得とグラフ ィックスメソッドを利用した描画を学習する。パラパラ漫画
VB 2005 ③ □ 定数の宣言(Public、Const) □ 単純変数と配列の宣言(Private、Dim) □ 標準コントロールの利用(PictureBox、Label、Button、Timer) □ プロパティの利用(Size、Location、Tag、Image、Button、X、Y) □ イベントの利用(Load、Closing、MouseDown、MouseMove、MouseUp、Click、Tick) □ メソッドの利用(FromImage、DrawLine、Clear、Refresh、FromImage、BringToFront) □ ステートメントの利用(AddHandler:実行時にコントロールのイベントハンドラを追加) □ 演算子(代入演算子、算術演算子、比較演算子)□ 制御構造構文(条件分岐 If ~ Then … ElseIf … Else … End If、ループ処理 For ~ Next) 今回の課題項目 □ マウスイベントに依るマウス座標の取得(MouseDown、MouseMove、MouseUp) □ 描画メソッドに依るグラフィックスの描画(DrawLine、Clear、Refresh) 今回の重点項目 □ 描画する色や線の太さ等を自由に設定出来る様にする。 □ 作成した一連の画像をファイルに記録出来る様にする。 今回の応用項目
■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム Name anime Text ぱらぱらアニメ ピクチャーボックス Name picBase BackColor White ラベル1 Name lblFrameTitle Text 現在のフレーム番号 TextAlign MiddleRight ラベル2 Name lblFrameNum BackColor White AutoSize False Text、TextAlign 空白、MiddleRight ボタン1 Name btnMovePrev Text 戻る Tag 0 ボタン2 Name btnMoveNext Text 進む Tag 1 ボタン3 Name btnPlay Text 再生 Tag 0 ボタン4 Name btnStop Text 停止 Tag 1 タイマー Name tmrAnime Enabled False Interval 200 ラベル1 ラベル2 ボタン1 ピクチャーボックス タイマー ボタン3 ボタン2 ボタン4
■ プログラムリスト ■
Public Class anime
' フォームレベルでグローバルな定数の宣言 Private Const NumPic As Integer = 10
' フォームレベルでグローバルな変数の宣言 Private FrameNum As Integer Private DrawFlag As Boolean Private StartX As Integer Private StartY As Integer Private AnimeNum As Integer Private G(NumPic - 1) As Graphics Private picAnime(NumPic - 1) As PictureBox
' フォームが読み込まれた時の処理
Private Sub anime_Load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load
Dim I As Integer
' 描画用ピクチャボックスの生成 For I = 0 To ( NumPic – 1 ) picAnime( I ) = New PictureBox( ) With picAnime( I )
.Size = picBase.Size
.Location = picBase.Location .BackColor = Color.White .Tag = I
.Image = New Bitmap( .Width, .Height ) End With
G( I ) = Graphics.FromImage( picAnime( I ).Image ) Me.Controls.Add( picAnime( I ) )
AddHandler picAnime( I ).MouseDown, AddressOf picAnime_MouseDown AddHandler picAnime( I ).MouseMove, AddressOf picAnime_MouseMove AddHandler picAnime( I ).MouseUp, AddressOf picAnime_MouseUp Next
' 初期状態に設定 FrameNum = 0
picAnime( FrameNum ).BringToFront( ) lblFrameNum.Text = CStr( FrameNum ) DrawFlag = False End Sub 定数を使用すると、プログラムの 可読性が高まり、修正が容易に成 る。定数は、変数とは異なり、プ ログラムの実行中に値を変更する 事は出来ない。 此処で宣言した変数は同じフォー ム内の総てのサブプロシージャで 値の参照と設定を行う事が出来 る。 描画モードと移動モードを区別す る為の変数DrawFlag はブール型 の変数で、True か False の孰れか の値を取る。 定数NumPic 個分のピクチャボッ クスのインスタンスを生成し、配 列に格納して居る。 ピクチャボックスの Imege プロ パティに、描画を行うキャンバス の役目をするBitmap オブジェク トを生成して居る。 実際に描画を行う Graphics オブ ジェクトをピクチャボックスの Image から生成して居る。 コードで生成したコントロールは フォームの Controls コレクショ ンに追加する必要が有る。
' フォームが閉じられ様と仕た時の処理
Private Sub anime_FormClosing( ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs ) Handles Me.FormClosing Dim I As Integer ' タイマーの停止 tmrAnime.Enabled = False ' Graphics オブジェクトの開放 For I = 0 To ( NumPic – 1 ) G( I ).Dispose( ) Next End Sub ' ピクチャボックスでマウスボタンが押し下げられた時の処理 Private Sub picAnime_MouseDown( ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs )
Dim N As Integer = sender.tag
If e.Button = Windows.Forms.MouseButtons.Left Then ' 左ボタンがクリックされた時の処理
DrawFlag = True
StartX = e.X: StartY = e.Y
G( N ).DrawLine( Pens.Black, StartX, StartY, StartX, StartY ) ElseIf e.Button = Windows.Forms.MouseButtons.Right Then ' 右ボタンがクリックされた時の処理 DrawFlag = False G( N ).Clear( Color.White ) End If picAnime( N ).Refresh( ) End Sub ' ピクチャボックスでマウスボタンが移動した時の処理
Private Sub picAnime_MouseMove( ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs )
Dim N As Integer = sender.tag ' 描画フラグが立って居る時の処理 If DrawFlag Then
' ピクチャボックスに線を描画
G( N ).DrawLine( Pens.Black, StartX, StartY, e.X, e.Y ) picAnime( N ).Refresh( )
' 描画開始座標の更新 StartX = e.X: StartY = e.Y End If End Sub 左右孰れかのマウスボタンを押し 下げるとMouseDown イベントが 発生する。 左のマウスボタンが押された場合 には、引数e の Button に 100000H が格納されてMouseDown イベン トが発生する。亦、右のマウスボ タンが押された場合には、引数 e のButton に 200000H が格納され て居る。 アプリケーションを終了する場 合、タイマーのEnabled プロパテ ィは必ず false にして、タイマー を止めて置く事が望ましい。 生成したオブジェクトは、終了時 には、必ず破棄して、メモリから 開放する必要が有る。 MouseDown イベントが発生した 時、マウスの当該オブジェクト内 での座標は、引数e の X と Y に格 納されて居る。 マウスをオブジェクト上で移動す るとMouseMove イベントが発生 する。 従来のコントロール配列の Index に対応する物と仕てTag プロパテ ィを用いるのが一般的で有る。 DrawLine は、指定した2点を結 ぶ直線を、指定したペンで描画す るメソッドで有る。 描画モード(DrawFlag が True) の時以外は、此のプロシージャは 実質的には何も行わない。
' ピクチャボックスでマウスボタンが開放された時の処理
Private Sub picAnime_MouseUp( ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs )
Dim N As Integer = sender.tag
If DrawFlag Then
G( N ).DrawLine( Pens.Black, StartX, StartY, e.X, e.Y ) picAnime( N ).Refresh( )
DrawFlag = False End If
End Sub
' ボタン(戻る・進む)がクリックされた時の処理
Private Sub btnMove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnMovePrev.Click, btnMoveNext.Click
If sender.tag = 0 Then
FrameNum -= 1 : If FrameNum < 0 Then FrameNum = NumPic - 1 Else
FrameNum += 1 : If FrameNum > (NumPic - 1) Then FrameNum = 0 End If
picAnime( FrameNum ).BringToFront( ) lblFrameNum.Text = CStr( FrameNum ) End Sub
' ボタン(再生・停止)がクリックされた時の処理
Private Sub btnPlay_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnPlay.Click, btnStop.Click
If sender.tag = 0 Then AnimeNum = FrameNum tmrAnime.Enabled = True Else tmrAnime.Enabled = False FrameNum = AnimeNum - 1 End If End Sub ' タイマーが一定間隔で行う処理
Private Sub tmrAnime_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles tmrAnime.Tick
picAnime( AnimeNum ).BringToFront( ) lblFrameNum.Text = CStr( AnimeNum )
AnimeNum += 1 : If AnimeNum > (NumPic - 1) Then AnimeNum = 0 End Sub End Class 押し下げて居たマウスボタンを放 すとMouseUp イベントが発生す る。 描画後は、Refresh メソッドで再 描画しないと、描画結果が反映さ れない。 タイマーの Enabled プロパティ のTrue と false を切り替える事に 依り、タイマーを動かせたり、止 めたりして居る。 CStr は、数値を文字列にキャスト する変換関数で有る。 BringToFront は、オブジェクトを 最前面に移動させるメソッド。
New キーワードに依るオブジェクトインスタンスの生成 新しいオブジェクトのインスタンスを生成するキーワード オブジェクト変数|配列 = New 生成するオブジェクトのコンストラクタ( ) 宣言ステートメントや代入ステートメントの中で使用し、指定したクラスのコンストラクタ を呼び出して、新しいオブジェクトのインスタンスを生成する。 New 句では、インスタンスを作成出来る定義済みクラスを指定する必要が有る。New は、宣言ステー トメント、又は、代入ステートメントの中で使用し、ステートメントが実行されると、指定したクラス のコンストラクタが呼び出されて、指定した引数が渡される。 宣言ステートメントで使用する場合 Dim オブジェクト変数 = New 生成するオブジェクトのコンストラクタ( ) 代入ステートメントで使用する場合 Dim オブジェクト変数 As 生成するオブジェクトの型 オブジェクト変数 = New 生成するオブジェクトのコンストラクタ( ) ※ コンストラクタ(Constructor)とは、オブジェクト指向プログラミングで、オブジェクト(クラス のインスタンス)を新しく生成する時に呼び出す特別なメソッドで有り、クラス名と同じ名前を持 つ。通常、新しく作成したオブジェクトを初期化する為に使用する。 Controls コレクションの Add メソッドに依るコントロールの追加 Control オブジェクトをコントロールコレクションの末尾に追加するメソッド コンテナオブジェクト.Controls.Add( 追加するコントロール ) Form オブジェクトや Panel オブジェクト等のコンテナに成る事の出来るオブジェクトにコ ントロールを追加する。 引数には、追加するコントロール名を指定し、省略する事は出来ない。 New キーワードに依りコードで生成したコントロールは、何のコレクションにも属して居ない為、画面 には表示されない。其の為、Form オブジェクトや Panel オブジェクト等のコンテナに成る事の出来る オブジェクトのコントロールコレクションに追加する必要が有る。 コントロールオブジェクトは、一度に1個のコントロールコレクションにしか割り当てる事が出来ず、 コントロールが既に他のコントロールの子コントロールで有る場合は、別のコントロールに追加される 前に其のコントロールから削除される。 猶、追加したコントロールを削除するには、Remove、RemoveAt、Clear の各メソッドを使用する。 ※ コンテナとは、他のオブジェクトを内包する事の出来るオブジェクトを謂う。 機 能 書 式 解 説 機 能 書 式 解 説
AddHandler ステートメントに依るイベントハンドラの追加 イベントをイベントハンドラに関連付けるステートメント AddHandler 処理するイベントの名前 AddressOf イベントを処理するプロシージャの名前 コントロールのイベントと其れを処理するイベントプロシージャを関連付ける。 New キーワードに依りコードで生成したコントロールは、何のイベントプロシージャにも関連付けられ て居ない為、イベント処理が行われない。其の為、AddHandler ステートメントを使用して、既存のイ ベントプロシージャと関連付ける必要が有る。 イベントハンドラとは、対応するイベントが発生した時に呼び出されるプロシージャで有る。任意の有 効なサブルーチンをイベントハンドラと仕て使用する事が出来る。但し、イベントハンドラはイベント ソース(イベントの発生元)に値を返す事が出来ない為、関数(Function プロシージャ)をイベント ハンドラと仕て使用する事は出来ない。 ※ Visual Basic では、イベントハンドラに対して、イベント発生元コントロール名_イベント名と謂う 形式でイベントハンドラ名を付けて居る。例えば、button1 と謂う名前のボタンの Click イベントは Sub button1_Click と謂う名前に成る。従って、独自のイベントのイベントハンドラを定義する場合 は、此の標準名前付け規則を使用する事が推奨されるが、名前付け規則の使用は必須ではなく、任 意の有効なサブルーチン名を使用する事も出来る。 AddHandler ステートメントと RemoveHandler ステートメントを使用すると、プログラムの実行中に 任意の時点でイベント処理の開始や停止を行う事が出来る。 BringToFront メソッドに依る Z オーダーの変更 コントロールをz オーダーの最前面へ移動するメソッド コントロール名.BringToFront( ) コントロールをz オーダーの最前面へ移動する。 コントロールは z オーダーの最前面へ移動される。コントロールが別のコントロールの子で有る場合、 子コントロールは z オーダーの最前面に移動される。BringToFront メソッドは、コントロールをトッ プレベルコントロールにする訳では無い。 猶、コントロールをz オーダーの背面に移動するには、SendToBack メソッドを使用する。此の場合も コントロールが別のコントロールの子で有る場合、子コントロールはz オーダーの背面に移動される。 z オーダーはプロパティではない。亦、z オーダーの操作は、最前面と最背面丈で、3個のコントロー ルが有る様な場合、真ん中の位置するには、1個のコントロールを最前面に仕て、其の後、別の1個の コントロールを最背面にすると謂う手順を踏む事に成る。 ※ Z オーダーとは、コントロールの重なりの順番の事で有る。亦、重なり方以外にも、タブオーダーを 決定する要素と仕ても使用される。 機 能 書 式 解 説 機 能 書 式 解 説
PictureBox コントロールに Graphics 描画を行う為の手順
1.Graphics オブジェクトを参照する為の変数(配列も可)を宣言する。 例:Dim G = Graphics
2.ピクチャボックスのImage プロパティに Bitmap オブジェクトを割り当てる。 例:ピクチャボックス.Image = New Bitmap( 幅, 高さ )
3.ピクチャボックスのImage より Graphics オブジェクトを作成する。 例:G = Graphics.FromImage( ピクチャボックス.Image ) 4.Graphics オブジェクトを通じてピクチャボックスにグラフィックスを描画する。 例:G.DrawLine( Pens.Black, 100, 100, 300, 300 ) ※ Visual Basic 6.0 の様に、ピクチャボックスにグラフィックメソッドで直接描画する事は出来ない。 コントロールのCreateGraphics メソッドに依る Graphics オブジェクトの生成 (再掲) コントロールのGraphics オブジェクトを作成するメソッド
Graphics オブジェクト変数 = Object.CreateGraphics( )
コントロールに画像を表示したり、グラフィックスや文字を描画する為に必要な Graphics オブジェクトを生成する。 生成された Graphics オブジェクトを通じて、コントロールに画像を表示したり、グラフィックスや文 字を描画する。従来のVisual Basic 6.0 以前の様に、フォームやピクチャボックスに、グラフィックス メソッドを使用して、直接描画を行う事は出来ない。 猶、Graphics オブジェクトは、不要に成れば、Dispose メソッドを呼び出して破棄する必要が有る。亦 Graphics オブジェクトは、現在のウィンドウのメッセージの存続期間丈有効で有る。 Bitmap コンストラクタに依る Bitmap オブジェクトの生成 (再掲) Bitmap オブジェクトを作成するコンストラクタ
Bitmap オブジェクト変数 = New Bitmap(Object.Image)
コントロールのImage プロパティより、グラフィックスイメージのピクセルデータと其の属 性で構成されるGDI+ビットマップをカプセル化したデータを保持し、イメージを処理する 場合に使用するBitmap オブジェクトを生成する。 Bitmap コンストラクタには、上記以外にも、画像ファイルから生成したり、サイズ丈を指定して生成 したり、色々なオーバーロード(同一のスコープ内で同一の関数や演算子に複数の定義を与える事。即 ち、同じ名称で、引数の異なる形式)が存在する。 機 能 書 式 解 説 機 能 書 式 解 説
Graphics オブジェクトの DrawLine メソッドに依る直線の描画 座標ペアで指定された2点を結ぶ直線を描画するメソッド GraphicsObject.DrawLine( ペン, 始点X座標, 始点Y座標, 終点X座標, 終点Y座標 ) 始点座標と終点座標を結ぶ直線を、指定したペンで描画する。 引数のペンには、直線の色、幅、スタイルを指定するPen オブジェクトを指定する。 引数の始点X座標には、一方の点のX座標を指定する。 引数の始点Y座標には、一方の点のY座標を指定する。 引数の終点X座標には、他方の点のX座標を指定する。 引数の終点Y座標には、他方の点のY座標を指定する。 座標は、Integer 型、Single 型の孰れでも指定する事が出来るが、両者を混在する事は出来ない。 猶、各点を、Point 構造体で指定する事も出来る。
Graphics オブジェクトには、多彩な描画メソッドが用意されて居るが、Visual Basic 6.0 の様に、点を 描画する Pset メソッドは用意されて居ない。併し、始点を終点に同じ点を指定する事に依り、点を描 画する事が出来るので、特に問題は無い。 ※ Bitmap オブジェクトの SetPixel メソッドを使用すれば、点の描画を行う事が出来る。 Graphics オブジェクトの Clear メソッドに依る描画面のクリア 描画面全体を消去し、指定した背景色で塗り潰すメソッド GraphicsObject.Clear( 塗潰色 ) Color 構造体で指定した色で、描画面全体を塗潰す。 引数の塗潰色には、描画面全体を塗潰す色をColor 構造体で指定する。 Control オブジェクトの Refresh メソッドに依る描画面の再描画 コントロールを再描画するメソッド Control.Refresh( ) 強制的に、コントロールがクライアント領域を無効化し、直後に其のコントロール自体と其 の子コントロールを再描画する。
Visual Basic 6.0 の様に、フォームやピクチャボックスに AutoRedraw プロパティが無い為、此等のコ ントロールにGraphics オブジェクトを通じて描画した場合、当該コントロールを Refresh メソッドを 用いて再描画しないと、描画が反映されないので注意を要する。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
Color 構造体に依る色の指定 (再掲) ■ Color 構造体のプロパティを使用してシステム定義色を指定する方法 約 140 色が、システム定義色と仕て、Color 構造体のプロパティに定義されて居る。此れを使用して、 色を指定する書式は、下記の通りで有る。 書 式:[System.Drawing.]Color.プロパティ 記述例:[System.Drawing.]Color.Red ※ 猶、System.Drawing 名前空間は、既定で参照設定される為、特に名前の衝突が起こらない限り、 記述する必要は無い(以下同じ)。 ■ Color 構造体のメソッドを使用してユーザー定義色を指定する方法 ユーザ定義色を指定するFromArgb メソッドの書式は、下記の通りで有る。 書 式:[System.Drawing.]Color.FromArgb(アルファブレンド, 赤の要素, 緑の要素, 青の要素) 記述例:[System.Drawing.]Color.FromArgb(128, 255, 0, 0 ) 夫々れの引数には、0~255迄の整数の値を指定する。 アルファブレンドは、省略する事が可能で、省略した場合は255(不透明)を指定した事に成る。 上記以外にも、SystemColors クラスのプロパティを使用してシステムカラー(例えば、タイトルバー の色に設定されて居る色)を指定する方法やColorTranslator クラスの FromOLE メソッドを使用して 従来の方法で色を指定する方法が有る。
[System.Drawing.] SystemColors.ScrollBar
[System.Drawing.]ColorTranslator.FromOLE(VB6.QBColor(14) ) [System.Drawing.]ColorTranslator.FromOLE(VB6.RGB(255, 0, 0) ) [System.Drawing.]ColorTranslator.FromOLE(&HFF80FF) 一般に、Color 構造体のプロパティやメソッドを使用して色の指定を行う事が多い。 MouseEventArgs クラスのメンバ MouseEventArgs クラスは、MouseUp、MouseDown、MouseMove の各イベントのデータを提供する クラスで、下記のメンバが有る。 Button マウスのどのボタンが押されたかを示す値(下記)を取得する。 MouseButtons.Left:マウスの左ボタンが押された。 MouseButtons.Middle:マウスの中央ボタンが押された。 MouseButtons.None:マウスボタンは押されて居ない。 MouseButtons.Right:マウスの右ボタンが押された。 Clicks マウスボタンが押されて離された回数を取得する。 Delta マウスホイールの回転回数を表す符合付きの数値を取得する。 マウスホイールのノッチ1 つ分が 1 移動量に相当する。 X マウスがクリックされた位置のx 座標を取得する。 Y マウスがクリックされた位置のy 座標を取得する。
座標系
GDI+では、ワールド座標空間、ページ座標空間、及び、デバイス座標空間の3種類を使用する。 myGraphics.DrawLine( myPen, 0, 0, 160, 80 ) を呼び出す場合、DrawLine メソッドに渡す点 (0, 0) と点 (160, 80) は、ワールド座標空間内の点で有る。GDI+が画面上に直線を描画する前に、此の座標 に対して一連の変換処理が適用される。ワールド座標がページ座標に変換され、次にページ座標がデバ イス座標に変換される。 クライアント領域の左上隅ではなく内側に原点が有る座標系を使用するとする。例えば、クライアント 領域の左端から100 ピクセル、上端から 50 ピクセルの点を原点にした場合の座標系を、下左図に示す。 myGraphics.DrawLine( myPen, 0, 0, 160, 80 ) を呼び出すと、下右図に示す直線が描画される。 此の直線の端点の座標は、3種の座標空間では、夫々れ下記の様に成る。 ワールド (0, 0) ~ (160, 80) ページ (100, 50) ~ (260, 130) デバイス (100, 50) ~ (260, 130) ページ座標空間の原点は、常にクライアント領域の左上隅で有る。亦、単位がピクセルで有る為、デバ イス座標はページ座標と同じに成る。単位をピクセル以外のインチ等に設定すると、デバイス座標はペ ージ座標と異なる値に成る。 ワ ールド座 標から ページ 座標への 変換を ワール ド変換と 呼び、 此の変 換は Graphics クラスの Transform プロパティが保持する。上の例のワールド変換は、x 方向に 100 単位、y 方向に 50 単位の 平行移動で有る。Graphics オブジェクトのワールド変換を設定し、其の Graphics オブジェクトを使用 して上図に示す直線を描画する例を下記に示す。 myGraphics.TranslateTransform( 100, 50 ) myGraphics.DrawLine( myPen, 0, 0, 160, 80 ) ページ座標からデバイス座標への変換をページ変換と呼ぶ。Graphics クラスには、ページ変換を操作 する為のPageUnit プロパティと PageScale プロパティが有る。Graphics クラスは、ディスプレイデ バイスの水平方向、及び、垂直方向のdpi(インチ毎のドット数)を調べる為に、DpiX と DpiY の2個 の読み取り専用プロパティも提供して居る。
Graphics クラスの PageUnit プロパティを使用して、ピクセル以外の単位を指定する事が出来る。(0, 0) から (2, 1) 迄、直線を描画する例を下記に示す。此処で、点 (2, 1) は、点 (0, 0) から右に 2 インチ、 下に1 インチの位置に有る。
myGraphics.PageUnit = GraphicsUnit.Inch myGraphics.DrawLine( myPen, 0, 0, 2, 1 )
※ ペンを構築する時にペン幅を指定しないと、上記の例では、1 インチ幅の直線が描画される。ペンの 幅は、下記に示す様にPen コンストラクタの 2 番目の引数で指定する事が出来る。
Dim myPen As New Pen( Color.Black, 1 / myGraphics.DpiX )
ディスプレイデバイスのdpi が水平方向で 96 ドット、垂直方向で 96 ドットで有ると仮定すると、上記 の例で示した直線の端点の座標は、3種の座標空間では、夫々れ下記の様に成る。 ワールド (0, 0) ~ (2, 1) ページ (0, 0) ~ (2, 1) デバイス (0, 0) ~ (192, 96) ワールド座標空間の原点はクライアント領域の左上隅で有る為、ページ座標はワールド座標と同じに成 る。 様々な効果を得る為に、ワールド変換とページ変換を組み合わせて実行する事も出来る。例えば、単位 と仕てインチを使用し、座標系の原点と仕て、クライアント領域の左端から2 インチ、上端から 1/2 イ ンチの点を使用するとする。Graphics オブジェクトのワールド変換とページ変換を設定し、(0, 0) から (2, 1) 迄、直線を描画する例を下記に示す。 myGraphics.TranslateTransform( 2, 0.5F ) myGraphics.PageUnit = GraphicsUnit.Inch myGraphics.DrawLine( myPen, 0, 0, 2, 1 ) ディスプレイデバイスのdpi が水平方向で 96 ドット、垂直方向で 96 ドットで有ると仮定すると、上記 の例で示した直線の端点の座標は、3種の座標空間では、夫々れ下記の様に成る。 ワールド (0, 0) ~ (2, 1) ページ (2, 0.5) ~ (4, 1.5) デバイス (192, 48) ~ (384, 144)