質問編集履歴
4
内容を変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
再投稿
|
1
|
+
再投稿。カラーパレット任意の座標に表示する方法
|
body
CHANGED
@@ -1,27 +1,128 @@
|
|
1
1
|
お世話になっております。
|
2
|
+
再度、質問させてください。
|
3
|
+
|
2
4
|
現在、お絵かきソフトの様なプログラムを作成しております。
|
3
5
|
カラーパレット表示ボタンを押下時にカラーパレットを任意の座標に表示させるという動作は[サイト](http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm)を参考にして実現できたのですが、pictureBoxをクリックした後にカラーパレットの標示させるボタンを押すと画面がフリーズしてしまいます。カラーパレットのボタン部分はToolStripを使用しています。
|
4
|
-
原因がいまだに掴めておらず、立ち往生中です。期限も迫ってきているので早めの解決をしたいので、なにとぞよろしくお願いします。
|
5
6
|
|
6
7
|
|
8
|
+
|
9
|
+
※追記部分
|
10
|
+
分かった事。
|
11
|
+
1、dlg.ShowDialog()の時に引数としてtopmostのFromを入れていない事が原因でした。
|
12
|
+
|
13
|
+
2、pictureBoxをクリックした後にカラーパレット表示用ボタン押下時にカラーパレットが表示されない。
|
14
|
+
手前のプログラムはユーザーコントロールでPictureBoxを継承しており、自作でマウスムーブイベントを作っています。
|
15
|
+
dlg.ShowDialog(this)にする事によりpictureBoxをクリックしたあとalt + Tabを押下し再度アプリケーションに戻れば、カラーパレットは表示されるようになりました。
|
16
|
+
しかし、やりたい事はカラーパレットボタンを押下した時にfromの最前に表示される事です。
|
17
|
+
そこでユーザーコントロール(PictureBox)のイベントを一度すべて消しpictureBoxをクリックまたはムーブ後、カラーパレットボタンを押下したら
|
18
|
+
期待通りにカラーパレットが表示されました。
|
19
|
+
切り分けにより、マウスムーブイベントでカラーパレットがFromの後ろに行くということが判明。
|
20
|
+
以下、マウスムーブイベントの切り分けした結果を記載します。
|
21
|
+
|
22
|
+
マウスムーブイベントがしている事
|
23
|
+
pictureBoxのbitmapのZoomサイズの取得
|
24
|
+
マウスの開始点の座標を取得
|
25
|
+
refreshで再描画
|
26
|
+
マウスの終了点の座標を取得
|
27
|
+
|
28
|
+
切り分け
|
29
|
+
1 マウスムーブイベント全てをコメントアウト
|
30
|
+
ピクチャーボックスをクリックしてカラーボックス表示ボタンを押下
|
31
|
+
期待の場所にカラーボックスが表示される
|
32
|
+
ただし、penや消しゴムでの描画ができなくなってしまう。
|
33
|
+
(本末転倒)
|
34
|
+
|
35
|
+
2 マウスムーブイベント左クリック内の座標取得部分をコメントアウト
|
36
|
+
ピクチャーボックスをクリックしてカラーボックス表示ボタンを押下
|
37
|
+
カラーパレットがFromの後ろに行く Alt +Tabで表示可能
|
38
|
+
ペンや消しゴムを使えない上に表示もできない。
|
39
|
+
|
40
|
+
|
41
|
+
3 マウスムーブイベントのrefresh()部分だけをコメントアウト
|
42
|
+
ピクチャーボックスをクリックしてカラーボックス表示ボタンを押下
|
43
|
+
期待の場所にカラーボックスが表示される
|
44
|
+
ただし、penや消しゴムでの描画ができなくなってしまう。
|
45
|
+
(本末転倒)
|
46
|
+
|
47
|
+
切り分け結果
|
48
|
+
開始点と終了点の間にrefresh()をしているのですが、このrefresh()が原因でカラーパレットが表示されない(Fromの後ろに行く) 事が判明しました。
|
49
|
+
|
50
|
+
聞きたい事
|
51
|
+
なぜrefreshをすることによりカラーパレットがfromの後ろに行くのか。
|
52
|
+
ペンや消しゴムを使えた上でカラーパレットも表示できるようにするにはどうすればよいでしょうか?
|
53
|
+
マウスムーブイベントで取得した開始点と終了点を元にペンモードや消しゴムを描画しているのでなくてはならない機能だと考えております。
|
54
|
+
お手数ですが、ご教授よろしくお願い足します。
|
55
|
+
|
56
|
+
|
57
|
+
|
7
58
|
実際のコード
|
59
|
+
private const float INIT_POINT = 99999.9f;
|
60
|
+
/// 開始:X座標、Y座標
|
61
|
+
private PointF _st = new PointF(INIT_POINT, INIT_POINT);
|
62
|
+
/// 終了:X座標、Y座標
|
63
|
+
private PointF _ed = new PointF(INIT_POINT, INIT_POINT);
|
64
|
+
//画像取り込み用ビットマップ
|
65
|
+
public Bitmap bmp;
|
8
66
|
|
9
67
|
|
10
68
|
ボタン押下処理
|
11
69
|
ColorDialogEx dlg = new ColorDialogEx();
|
12
70
|
private void StripColorBtn_Click(object sender, EventArgs e) {
|
13
|
-
//
|
71
|
+
// OekakiPaint の左上隅にダイアログボックスの座標を合わせて表示する
|
14
|
-
Point p = this.PointToScreen(new Point(
|
72
|
+
Point p = this.PointToScreen(new Point(OekakiPaint.Left + 20, OekakiPaint.Top + 30));
|
15
73
|
dlg.Position = p;
|
16
74
|
dlg.AllowFullOpen = false;
|
17
|
-
if (dlg.ShowDialog() == DialogResult.OK)
|
75
|
+
if (dlg.ShowDialog(this) == DialogResult.OK)
|
18
76
|
this.StripSelectColorBtn.BackColor = dlg.Color;
|
19
|
-
archPaint._selectColor = dlg.Color;
|
20
|
-
dlg.Dispose();
|
21
77
|
}
|
22
78
|
|
23
79
|
|
24
80
|
|
81
|
+
|
82
|
+
//マウスムーブイベント
|
83
|
+
private void MouseMove(object sender, MouseEventArgs e) {
|
84
|
+
// 左クリック押下中
|
85
|
+
if (e.Button == MouseButtons.Left) {
|
86
|
+
// ZOOM率に合わせたサイズを取得
|
87
|
+
SizeF size = this.getZoomSize();
|
88
|
+
//// コントロール側の座標値と描画用BITMAP座標値の計算:終点
|
89
|
+
this._ed.X = e.X - (((float)this.ClientSize.Width - size.Width) / 2);
|
90
|
+
this._ed.X = this._ed.X * ((float)this.bmp.Width / size.Width);
|
91
|
+
this._ed.Y = e.Y - (((float)this.ClientSize.Height - size.Height) / 2);
|
92
|
+
this._ed.Y = this._ed.Y * ((float)this.bmp.Height / size.Height);
|
93
|
+
//// 再描画
|
94
|
+
this.Refresh();
|
95
|
+
//// コントロール側の座標値と描画用BITMAP座標値の計算:始点
|
96
|
+
this._st.X = e.X - (((float)this.ClientSize.Width - size.Width) / 2);
|
97
|
+
this._st.X = this._st.X * ((float)this.bmp.Width / size.Width);
|
98
|
+
this._st.Y = e.Y - (((float)this.ClientSize.Height - size.Height) / 2);
|
99
|
+
this._st.Y = this._st.Y * ((float)this.bmp.Height / size.Height);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
//画面サイズの取得
|
104
|
+
public SizeF getZoomSize() {
|
105
|
+
float img_w = this.bmp.Width;
|
106
|
+
float img_h = this.bmp.Height;
|
107
|
+
float pic_w = this.ClientSize.Width;
|
108
|
+
float pic_h = this.ClientSize.Height;
|
109
|
+
|
110
|
+
float mag_w = pic_w / img_w;
|
111
|
+
float mag_h = pic_h / img_h;
|
112
|
+
SizeF zoomSize;
|
113
|
+
|
114
|
+
if (mag_w < mag_h) {
|
115
|
+
zoomSize = new SizeF(img_w * mag_w, img_h * mag_w);
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
zoomSize = new SizeF(img_w * mag_h, img_h * mag_h);
|
119
|
+
}
|
120
|
+
|
121
|
+
return zoomSize;
|
122
|
+
}
|
123
|
+
|
124
|
+
|
125
|
+
|
25
126
|
別クラス
|
26
127
|
internal class ColorDialogEx : ColorDialog {
|
27
128
|
private Point FPosition;
|
@@ -32,7 +133,7 @@
|
|
32
133
|
}
|
33
134
|
|
34
135
|
protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam) {
|
35
|
-
if (msg == 0x110) { // WM_INITDIALOG{
|
136
|
+
if (msg == 0x110) { // WM_INITDIALOG{
|
36
137
|
RECT r = new RECT();
|
37
138
|
|
38
139
|
// ダイアログボックスの位置とサイズを取得する
|
@@ -61,9 +162,4 @@
|
|
61
162
|
public int top;
|
62
163
|
public int right;
|
63
164
|
public int bottom;
|
64
|
-
}
|
165
|
+
}
|
65
|
-
|
66
|
-
|
67
|
-
ステップ実行してみると、if (msg == 0x110) 部分でmsg == 0x110がfalseになるため中の処理に入らず、永遠とループしている状態で座標が取れず表示ができないという状況になっているように見えます。
|
68
|
-
解決方法が見当たらず、困っております。
|
69
|
-
皆さま、ご教授よろしくお願いいたします。
|
3
内容の変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
カラーパレット任意の座標に表示する
|
1
|
+
再投稿・教えてください。カラーパレット任意の座標に表示する方法
|
body
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
お世話になっております。
|
2
2
|
現在、お絵かきソフトの様なプログラムを作成しております。
|
3
|
-
カラーパレット表示ボタンを押下時にカラーパレットを任意の座標に表示させるという動作は[サイト](http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm)を参考にして実現できたのですが、
|
4
|
-
|
3
|
+
カラーパレット表示ボタンを押下時にカラーパレットを任意の座標に表示させるという動作は[サイト](http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm)を参考にして実現できたのですが、pictureBoxをクリックした後にカラーパレットの標示させるボタンを押すと画面がフリーズしてしまいます。カラーパレットのボタン部分はToolStripを使用しています。
|
4
|
+
原因がいまだに掴めておらず、立ち往生中です。期限も迫ってきているので早めの解決をしたいので、なにとぞよろしくお願いします。
|
5
5
|
|
6
|
+
|
6
7
|
実際のコード
|
7
8
|
|
8
9
|
|
9
10
|
ボタン押下処理
|
11
|
+
ColorDialogEx dlg = new ColorDialogEx();
|
10
12
|
private void StripColorBtn_Click(object sender, EventArgs e) {
|
11
13
|
// archPaint の左上隅にダイアログボックスの座標を合わせて表示する
|
12
14
|
Point p = this.PointToScreen(new Point(archPaint.Left + 20, archPaint.Top + 30));
|
2
タイトルの変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
カラーパレット任意の座標に表示する
|
1
|
+
カラーパレット任意の座標に表示する
|
body
CHANGED
File without changes
|
1
タグの変更
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|