ボタンをクリックしたら四角のシェイプを追加。
マウスをクリックしたら線を追加してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace dia { public partial class Form1 : Form { Shape s; DllImpClass1 d; bool pos_chk = false; //最初のクリックでtrue int pos_x = 1; int pos_y = 1; protected void frm_click(object sender, EventArgs e) { if (!pos_chk) { //g.DrawLine(Pens.Black, Cursor.Position.X, Cursor.Position.Y, Cursor.Position.X, Cursor.Position.Y); //g.DrawLine(Pens.Black, Cursor.Position.X, Cursor.Position.Y, Cursor.Position.X,Cursor.Position.Y); pos_x = PointToClient(Cursor.Position).X; pos_y = PointToClient(Cursor.Position).Y; pos_chk = true; Graphics g = CreateGraphics(); MouseMove += new MouseEventHandler((object MouseSender, MouseEventArgs MouseArgs) => { if (pos_chk) { g.Clear(Color.White); g.DrawLine(Pens.Black, pos_x, pos_y, PointToClient(Cursor.Position).X, PointToClient(Cursor.Position).Y); } }); } else { pos_chk = false; } } /* protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (pos_chk) { Graphics g = CreateGraphics(); g.DrawLine(Pens.Black, pos_x, pos_y, Cursor.Position.X, Cursor.Position.Y); } } */ public Form1() { InitializeComponent(); button1.Click += new EventHandler((object sender, EventArgs e) => { s = new Shape(); s.Location = new Point(1, 1); s.Size = new System.Drawing.Size(200, 200); //s.Visible = true; Controls.Add(s); s.DoubleClick += new EventHandler(shape_click); }); d = new DllImpClass1(); // DllImpClass1のコンストラクタでGetDCを呼んでいる。 //d.Location = new Point(1, 1); //d.Size = new System.Drawing.Size(200, 200); //Controls.Add(d); Click += new EventHandler(frm_click); } /* protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); d._fill(); } */ private void shape_click(object sender, EventArgs e) { inp i = new inp(); i.ShowDialog(); //MessageBox.Show(i.val); s.Text = i.val; //i.Dispose(); //このdisposeを入れるとクリックしたシェイプじゃないのに文字列が入ったりする。 //ボタンを押すたびにインスタンスができている。 //formの中のsはひとつしかないのに、複数あるシャイプはどうなっているのだろう。 //とはいえ、s.text にいれた場合それぞれのインスタンスにはいるので、 //同名の変数で管理しているといえしっかりそれぞれのインスタンスは管理されているのだろうけど。 //なんかクリックしたシャイプ以外に値が入ることがある。 //同名のインスタンスが複数ある場合の処理を調べないとダメだな。 this.Refresh(); } /* WndProcがメッセージを受け取る。WN_PAINTは0x000Fだった。 これでWN_PAINTメッセージを受け取ったら_fillを実行しているはずだが。。。 描画のたびに書き換わってないっぽい。 */ protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x000F)//WN_PAINT { //d._fill(); } } private void button1_Click(object sender, EventArgs e) { } } } |