■79858 / ) |
カラーパレット任意の座標に表示する |
□投稿者/ kazu (1回)-(2016/05/24(Tue) 11:46:05)
|
分類:[C#]
お世話になっております。 現在、お絵かきソフトの様なプログラムを作成しております。 カラーパレット表示ボタンを押下時にカラーパレットを任意の座標に表示させるという動作はサイト(http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm)を参考にして実現できたのですが、 mainの画面が表示されれ、penで絵をかいたり、文字を入力した後に、カラーパレットボタンを押下した時に画面が固まる現象が起きています。
実際のコード
ボタン押下処理 private void StripColorBtn_Click(object sender, EventArgs e) { // archPaint の左上隅にダイアログボックスの座標を合わせて表示する Point p = this.PointToScreen(new Point(archPaint.Left + 20, archPaint.Top + 30)); dlg.Position = p; dlg.AllowFullOpen = false; if (dlg.ShowDialog() == DialogResult.OK) this.StripSelectColorBtn.BackColor = dlg.Color; archPaint._selectColor = dlg.Color; dlg.Dispose(); }
別クラス internal class ColorDialogEx : ColorDialog { private Point FPosition; public Point Position { set { FPosition = value; } }
public ColorDialogEx() : base() { }
protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam) { if (msg == 0x110) { // WM_INITDIALOG{ ←ここのif文がおかしいと思われる。 RECT r = new RECT();
// ダイアログボックスの位置とサイズを取得する GetWindowRect(hWnd, ref r);
// ダイアログボックスの位置を変更する MoveWindow(hWnd, FPosition.X, FPosition.Y, r.right - r.left, r.bottom - r.top, true);
return IntPtr.Zero; // HookProc メソッドでメッセージを処理済みにする }
// WM_INIDIALOG 以外のメッセージに対しては元のコントロールにまかせる return base.HookProc(hWnd, msg, wparam, lparam); }
[DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool GetWindowRect(IntPtr hWnd, [In, Out] ref RECT lpRect);
[DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[StructLayout(LayoutKind.Sequential)] private struct RECT { public int left; public int top; public int right; public int bottom; }
ステップ実行してみると、if (msg == 0x110) 部分でmsg == 0x110がfalseになるため中の処理に入らず、永遠とループしている状態で座標が取れず表示ができないという状況になっているように見えます。 解決方法が見当たらず、困っております。 皆さま、ご教授よろしくお願いいたします。
|
|