質問編集履歴

4

内容を変更

2016/05/31 02:13

投稿

DENQ
DENQ

スコア19

test CHANGED
@@ -1 +1 @@
1
- 再投稿・教えてください。カラーパレット任意の座標に表示する方法
1
+ 再投稿。カラーパレット任意の座標に表示する方法
test CHANGED
@@ -1,17 +1,133 @@
1
1
  お世話になっております。
2
2
 
3
+ 再度、質問させてください。
4
+
5
+
6
+
3
7
  現在、お絵かきソフトの様なプログラムを作成しております。
4
8
 
5
9
  カラーパレット表示ボタンを押下時にカラーパレットを任意の座標に表示させるという動作は[サイト](http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm)を参考にして実現できたのですが、pictureBoxをクリックした後にカラーパレットの標示させるボタンを押すと画面がフリーズしてしまいます。カラーパレットのボタン部分はToolStripを使用しています。
6
10
 
11
+
12
+
13
+
14
+
15
+
16
+
17
+ ※追記部分
18
+
19
+ 分かった事。
20
+
21
+ 1、dlg.ShowDialog()の時に引数としてtopmostのFromを入れていない事が原因でした。
22
+
23
+
24
+
25
+ 2、pictureBoxをクリックした後にカラーパレット表示用ボタン押下時にカラーパレットが表示されない。
26
+
27
+ 手前のプログラムはユーザーコントロールでPictureBoxを継承しており、自作でマウスムーブイベントを作っています。
28
+
29
+ dlg.ShowDialog(this)にする事によりpictureBoxをクリックしたあとalt + Tabを押下し再度アプリケーションに戻れば、カラーパレットは表示されるようになりました。
30
+
31
+ しかし、やりたい事はカラーパレットボタンを押下した時にfromの最前に表示される事です。
32
+
33
+ そこでユーザーコントロール(PictureBox)のイベントを一度すべて消しpictureBoxをクリックまたはムーブ後、カラーパレットボタンを押下したら
34
+
35
+ 期待通りにカラーパレットが表示されました。
36
+
37
+ 切り分けにより、マウスムーブイベントでカラーパレットがFromの後ろに行くということが判明。
38
+
39
+ 以下、マウスムーブイベントの切り分けした結果を記載します。
40
+
41
+
42
+
43
+ マウスムーブイベントがしている事
44
+
45
+ pictureBoxのbitmapのZoomサイズの取得
46
+
47
+ マウスの開始点の座標を取得
48
+
49
+ refreshで再描画
50
+
51
+ マウスの終了点の座標を取得
52
+
53
+
54
+
55
+ 切り分け
56
+
57
+ 1 マウスムーブイベント全てをコメントアウト
58
+
59
+ ピクチャーボックスをクリックしてカラーボックス表示ボタンを押下
60
+
61
+ 期待の場所にカラーボックスが表示される
62
+
63
+ ただし、penや消しゴムでの描画ができなくなってしまう。
64
+
65
+ (本末転倒)
66
+
67
+
68
+
69
+ 2 マウスムーブイベント左クリック内の座標取得部分をコメントアウト
70
+
71
+ ピクチャーボックスをクリックしてカラーボックス表示ボタンを押下
72
+
73
+ カラーパレットがFromの後ろに行く Alt +Tabで表示可能
74
+
75
+ ペンや消しゴムを使えない上に表示もできない。
76
+
77
+
78
+
79
+
80
+
81
+ 3 マウスムーブイベントのrefresh()部分だけをコメントアウト
82
+
83
+ ピクチャーボックスをクリックしてカラーボックス表示ボタンを押下
84
+
85
+ 期待の場所にカラーボックスが表示される
86
+
87
+ ただし、penや消しゴムでの描画ができなくなってしまう。
88
+
89
+ (本末転倒)
90
+
91
+
92
+
93
+ 切り分け結果
94
+
95
+ 開始点と終了点の間にrefresh()をしているのですが、このrefresh()が原因でカラーパレットが表示されない(Fromの後ろに行く) 事が判明しました。
96
+
97
+
98
+
99
+ 聞きたい事
100
+
101
+ なぜrefreshをすることによりカラーパレットがfromの後ろに行くのか。
102
+
103
+ ペンや消しゴムを使えた上でカラーパレットも表示できるようにするにはどうすればよいでしょうか?
104
+
7
- 原因がいまだ掴めおらず、立ち往生中です。期限も迫ってきているので早めの解決をしたので、なにぞよろしく願いします。
105
+ マウスムーブイベントで取得した開始点と終了点を元ペンモードや消しゴムを描画しているのでなくてはならな機能だ考えてます。
106
+
8
-
107
+ お手数ですが、ご教授よろしくお願い足します。
9
-
108
+
109
+
110
+
111
+
10
112
 
11
113
 
12
114
 
13
115
  実際のコード
14
116
 
117
+ private const float INIT_POINT = 99999.9f;
118
+
119
+ /// 開始:X座標、Y座標
120
+
121
+ private PointF _st = new PointF(INIT_POINT, INIT_POINT);
122
+
123
+ /// 終了:X座標、Y座標
124
+
125
+ private PointF _ed = new PointF(INIT_POINT, INIT_POINT);
126
+
127
+ //画像取り込み用ビットマップ
128
+
129
+ public Bitmap bmp;
130
+
15
131
 
16
132
 
17
133
 
@@ -22,21 +138,107 @@
22
138
 
23
139
  private void StripColorBtn_Click(object sender, EventArgs e) {
24
140
 
25
- // archPaint の左上隅にダイアログボックスの座標を合わせて表示する
141
+ // OekakiPaint の左上隅にダイアログボックスの座標を合わせて表示する
26
-
142
+
27
- Point p = this.PointToScreen(new Point(archPaint.Left + 20, archPaint.Top + 30));
143
+ Point p = this.PointToScreen(new Point(OekakiPaint.Left + 20, OekakiPaint.Top + 30));
28
144
 
29
145
  dlg.Position = p;
30
146
 
31
147
  dlg.AllowFullOpen = false;
32
148
 
33
- if (dlg.ShowDialog() == DialogResult.OK)
149
+ if (dlg.ShowDialog(this) == DialogResult.OK)
34
150
 
35
151
  this.StripSelectColorBtn.BackColor = dlg.Color;
36
152
 
153
+ }
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+ //マウスムーブイベント
164
+
165
+ private void MouseMove(object sender, MouseEventArgs e) {
166
+
167
+ // 左クリック押下中
168
+
169
+ if (e.Button == MouseButtons.Left) {
170
+
171
+ // ZOOM率に合わせたサイズを取得
172
+
37
- archPaint._selectColor = dlg.Color;
173
+ SizeF size = this.getZoomSize();
174
+
38
-
175
+ //// コントロール側の座標値と描画用BITMAP座標値の計算:終点
176
+
177
+ this._ed.X = e.X - (((float)this.ClientSize.Width - size.Width) / 2);
178
+
179
+ this._ed.X = this._ed.X * ((float)this.bmp.Width / size.Width);
180
+
181
+ this._ed.Y = e.Y - (((float)this.ClientSize.Height - size.Height) / 2);
182
+
183
+ this._ed.Y = this._ed.Y * ((float)this.bmp.Height / size.Height);
184
+
185
+ //// 再描画
186
+
39
- dlg.Dispose();
187
+ this.Refresh();
188
+
189
+ //// コントロール側の座標値と描画用BITMAP座標値の計算:始点
190
+
191
+ this._st.X = e.X - (((float)this.ClientSize.Width - size.Width) / 2);
192
+
193
+ this._st.X = this._st.X * ((float)this.bmp.Width / size.Width);
194
+
195
+ this._st.Y = e.Y - (((float)this.ClientSize.Height - size.Height) / 2);
196
+
197
+ this._st.Y = this._st.Y * ((float)this.bmp.Height / size.Height);
198
+
199
+ }
200
+
201
+ }
202
+
203
+
204
+
205
+ //画面サイズの取得
206
+
207
+ public SizeF getZoomSize() {
208
+
209
+ float img_w = this.bmp.Width;
210
+
211
+ float img_h = this.bmp.Height;
212
+
213
+ float pic_w = this.ClientSize.Width;
214
+
215
+ float pic_h = this.ClientSize.Height;
216
+
217
+
218
+
219
+ float mag_w = pic_w / img_w;
220
+
221
+ float mag_h = pic_h / img_h;
222
+
223
+ SizeF zoomSize;
224
+
225
+
226
+
227
+ if (mag_w < mag_h) {
228
+
229
+ zoomSize = new SizeF(img_w * mag_w, img_h * mag_w);
230
+
231
+ }
232
+
233
+ else {
234
+
235
+ zoomSize = new SizeF(img_w * mag_h, img_h * mag_h);
236
+
237
+ }
238
+
239
+
240
+
241
+ return zoomSize;
40
242
 
41
243
  }
42
244
 
@@ -66,7 +268,7 @@
66
268
 
67
269
  protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam) {
68
270
 
69
- if (msg == 0x110) { // WM_INITDIALOG{ ←ここのif文がおかしいと思われる。
271
+ if (msg == 0x110) { // WM_INITDIALOG{
70
272
 
71
273
  RECT r = new RECT();
72
274
 
@@ -125,13 +327,3 @@
125
327
  public int bottom;
126
328
 
127
329
  }
128
-
129
-
130
-
131
-
132
-
133
- ステップ実行してみると、if (msg == 0x110) 部分でmsg == 0x110がfalseになるため中の処理に入らず、永遠とループしている状態で座標が取れず表示ができないという状況になっているように見えます。
134
-
135
- 解決方法が見当たらず、困っております。
136
-
137
- 皆さま、ご教授よろしくお願いいたします。

3

内容の変更

2016/05/31 02:13

投稿

DENQ
DENQ

スコア19

test CHANGED
@@ -1 +1 @@
1
- カラーパレット任意の座標に表示する
1
+ 再投稿・教えてください。カラーパレット任意の座標に表示する方法
test CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  現在、お絵かきソフトの様なプログラムを作成しております。
4
4
 
5
- カラーパレット表示ボタンを押下時にカラーパレットを任意の座標に表示させるという動作は[サイト](http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm)を参考にして実現できたのですが、
5
+ カラーパレット表示ボタンを押下時にカラーパレットを任意の座標に表示させるという動作は[サイト](http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm)を参考にして実現できたのですが、pictureBoxをクリックした後にカラーパレットの標示させるボタンを押すと画面がフリーズしてしまいます。カラーパレットのボタン部分はToolStripを使用しています。
6
6
 
7
- mainの画面表示されれpen絵をかたり、文字入力した、カラーパレットボタンを押下た時に画面が固まる現象が起きています。
7
+ 原因いまだに掴めておらず立ち往生中す。期限も迫ってきてるので早めの解決をしたいので、なとぞよろくお願ます。
8
+
9
+
8
10
 
9
11
 
10
12
 
@@ -15,6 +17,8 @@
15
17
 
16
18
 
17
19
  ボタン押下処理
20
+
21
+ ColorDialogEx dlg = new ColorDialogEx();
18
22
 
19
23
  private void StripColorBtn_Click(object sender, EventArgs e) {
20
24
 

2

タイトルの変更

2016/05/27 05:24

投稿

DENQ
DENQ

スコア19

test CHANGED
@@ -1 +1 @@
1
- カラーパレット任意の座標に表示する際にオーバーライド時に座標が取れない
1
+ カラーパレット任意の座標に表示する
test CHANGED
File without changes

1

タグの変更

2016/05/24 00:23

投稿

DENQ
DENQ

スコア19

test CHANGED
File without changes
test CHANGED
File without changes