質問編集履歴

4

内容を変更

2016/05/31 02:13

投稿

DENQ
DENQ

スコア19

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
- // archPaint の左上隅にダイアログボックスの座標を合わせて表示する
71
+ // OekakiPaint の左上隅にダイアログボックスの座標を合わせて表示する
14
- Point p = this.PointToScreen(new Point(archPaint.Left + 20, archPaint.Top + 30));
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{ ←ここのif文がおかしいと思われる。
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

内容の変更

2016/05/31 02:13

投稿

DENQ
DENQ

スコア19

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
- mainの画面表示されれpen絵をかたり、文字入力した後にカラーパレットボタンを押下した時画面が固まる現象が起きています。
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

タイトルの変更

2016/05/27 05:24

投稿

DENQ
DENQ

スコア19

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

1

タグの変更

2016/05/24 00:23

投稿

DENQ
DENQ

スコア19

title CHANGED
File without changes
body CHANGED
File without changes