画面への描画 Graphics オブジェクト 紙 ペン Pen オブジェクト Brush オブジェクト 画面のピクセルをカプセル化 描画の基本になる 紙 原点 (0,0) X方向 Y方向 300ピクセル (デフォルト値) ペン Pen オブジェクト 線を引く 色,幅(線の太さ),線スタイル(点線など)等の多数のプロパティを持っている Brush オブジェクト 図形を塗りつぶす 単色で塗りつぶすSolidBrush 画像パターンで塗りつぶすTextureBrush グラジエーション効果で塗りつぶすLinearGradientBrush 実際に描画可能な領域 292x273ピクセル (デフォルト値の場合)
Paintハンドラの例 Graphicsオブジェクトを Paintハンドラ内で取得 緑・赤・黄色で太さが1ピクセルのPenオブジェクトを作成 private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen GreenPen = new Pen(Color.Green); Pen RedPen = new Pen(Color.Red); Pen YellowPen = new Pen(Color.Yellow); g.DrawLine(GreenPen, 10, 10, 200, 200); g.DrawEllipse(RedPen, 50, 50, 30, 30); g.DrawPie(YellowPen, 120, 100, 150, 150, 15, 120); Pen RedTickPen = new Pen(Color.Red, 10); g.DrawRectangle(RedTickPen, 150, 20, 100, 50); SolidBrush blueBrush = new SolidBrush(Color.Blue); SolidBrush brownBrush = new SolidBrush(Color.Brown); g.FillPie(blueBrush, 20, 80, 100, 100, 15, 120); g.FillEllipse(brownBrush, 150, 100, 50, 50); } 緑色ペンで座標値(10,10)から(200,200)へ直線を引く 赤色ペンで,左上隅の座標が(50, 50)で幅30,高さ30の正方形に内接する円を描く 赤色で太さ10ピクセルのペン 赤色で太いペンで左上(150,20),幅100,高さ50の長方形を描く 青と茶色の単色ブラシ 左上隅の座標が(20, 80)で幅100,高さ100の長方形に内接する円のうち15度から120度の扇形を青色ブラシで塗りつぶす 茶色ブラシで,左上隅の座標が(150, 100)で幅50,高さ50の正方形に内接する円を塗りつぶす 描画メソッドの種類やその詳細については Graphicsクラスをキーワード検索
コントロールで図形描画を制御する 作図ボタンを押すと,入力した値の10倍 の長さ(ピクセル)の太線を引く public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.NumericUpDown numericUpDown1; private System.Windows.Forms.Button button1; /// <summary> /// 必要なデザイナ変数です。 /// </summary> private System.ComponentModel.Container components = null; private int length = 0; ・・・略 private void button1_Click(object sender, System.EventArgs e) length = (int) (numericUpDown1.Value); this.Refresh(); } private void Form1_Paint(object sender, PaintEventArgs e) Graphics g = e.Graphics; g.DrawLine(new Pen(Color.Blue, 20), 0, 20, length*10, 20); (int) ( x ) で変数xの型をint型に変換する numericUpDown.ValueはDecimal型のプロパティなのでそのままではint型変数に代入できない Form1の描画領域を一旦消去して,Paintハンドラを強制的に呼び出すメソッド 太さ20ピクセルの青色ペンで直線を描画 直線の長さを表わす変数 NumericUpDownコントロールのインスタンス numericUpDown1 200ピクセル 作図ボタンのクリック イベントハンドラ 変数 length Paintイベントハンドラ 変数値の変更 変数値の参照 図形描画を制御する仕組み
ダイアログパネルを使う方法(二つのウィンドウを使う方法) 作図ボタンを押すと,入力した値の10倍 の長さ(ピクセル)の太線を引く データ/入力メニューのクリックでForm2が開き,Form2で入力した値の20倍の長さの太線をForm1ウィンドウ上で引く Form1:メインウィンドウ Form2:ダイアログパネル プロジェクトにForm2を追加するには VisualStudioのメニューで,「ファイル/新しい項目の追加」を選択 「Windowsフォーム」を選択して開く OKボタンのクリックでForm2が閉じ,Form1で太線描画 キャンセルボタンのクリックでForm2が閉じるが,Form1の太線は変化しない
ダイアログパネル(Form2)の設定とプログラム public class Form2 : System.Windows.Forms.Form { /// <summary> /// 必要なデザイナ変数です。 /// </summary> private System.ComponentModel.Container components = null; private System.Windows.Forms.NumericUpDown numericUpDown1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private int length = 0; public Form2() // // Windows フォーム デザイナ サポートに必要です。 InitializeComponent(); // TODO: InitializeComponent 呼び出しの後に・・・ } private void button1_Click(object sender, System.EventArgs e) length = (int) (numericUpDown1.Value); public int Length get { return length; } Form2のプロパティの変更点 ControlBox: False SizeGripStyle: Hide AcceptButton: button1 CancelButton: button2 Enterキーを押した時,button1をクリックしたのと同じ効果を持たせる Escキーを押した時,button2をクリックしたのと同じ効果を持たせる numericUpDown1 長さの値を覚えておく変数 button1のプロパティ変更点 Text: OK DialogResult: OK この設定により,button1をクリックすると自動的にウィンドウが閉じる button1のクリックハンドラ button1がクリックされたら,NumericUpDown1の値を変数lengthに記憶しておく. button1のクリックで自動的にForm2は閉じる button2のプロパティ変更点 Text: キャンセル DialogResult: Cancel この設定により,button2をクリックすると自動的にウィンドウが閉じる パブリックプロパティ Form2の外部から変数lengthの値を取得するために用いる
メインウィンドウ(Form1)の設定とプログラム メニューを追加. メニューの選択でForm2のダイアログパネルが開くようにする. public class Form1 : System.Windows.Forms.Form { private System.ComponentModel.Container components = null; private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem2; private Form2 form2; public Form1() // // TODO: InitializeComponent 呼び出しの後に・・・ form2 = new Form2(); } // ・・・省略 private void Form1_Paint(object sender, PaintEventArgs e) Graphics g = e.Graphics; g.DrawLine(new Pen(Color.Blue, 20), 0, 20, form2.Length * 10, 20); private void menuItem2_Click(object sender, System.EventArgs e) if (form2.ShowDialog(this) == DialogResult.OK) this.Refresh(); オブジェクトForm2のインスタンスform2をプライベートメンバとして登録 form2インスタンスの初期化 form2のLengthプロパティでform2ダイアログパネルの入力値が取得できるので,その長さの10倍の太線を描画 メニューのクリックハンドラ メニューがクリックされたら,form2を開く form2のShowDialog()メソッドでform2のウィンドウが開く. form2のウィンドウが閉じるとShowDialog()メソッドが終了する.この時,メソッドの返す値がDialogResult.OKなら,OKボタンが押されている. OKボタンでform2ウィンドウが閉じているなら,form1ウィンドウを再描画 注:ウィンドウが閉じてもform2オブジェクトが消滅するわけではない