■79938 / ) |
Re[8]: カラーパレット任意の座標に表示する |
□投稿者/ 魔界の仮面弁士 (734回)-(2016/05/30(Mon) 17:12:12)
|
■No79936 (kazu さん) に返信 > PictureBox クリック後に StripColorBtn を押すと固まります。
提示された情報を元に検証してみましたが、PictureBox を Click しても (問題点1) ダイアログが表示されず、固まってしまう (問題点2) ShowDialog 後、WM_INITDIALOG が飛んでくる気配が無い のいずれの現象も再現できていません。
> PictureBoxのクリックイベントとしてはPicturBoxにcontrolがあるかを > foreachで全てのコントロールの背景色を透明にするというものと > stripTextConboボックスのテキストの内容を空白にするという処理は書いてあります。
(1) まずは、PictureBox の Click 処理の内容を、すべてコメントアウトしてみてください。
もしもそれで現象が解決するのであれば、この部分に要因があることになります。
(2) 手順 1 で、すべてコメントアウトしても固まってしまう場合は、 今度は HookProc をオーバーライドしないように修正してみてください。
その場合、余計なコードが呼ばれないので、固まる事も無くなる見込みです。
ただし、画面の表示位置はデフォルトの位置のままになるはずです。 (WM_INITDIALOG が渡されてくるかどうかは別として)
(3) 手順 2 でも回避できない場合、プログラムコードと言うよりも、 環境依存の不具合の可能性も考えられますが、今のところ検討がつきません。 現象を再現するための検証用アプリケーションを新たに作成し、 それを OneDrive 等で公開することはできますか?
(4) WM_INITDIALOG 時の戻り値ですが、今回は return (IntPtr)1; を返した方が良いかもしれません。 WM_INITDIALOG が飛んできていない現状では、あまり意味が無いかも知れませんが。
※ 1 を返却 → 標準のフォーカス制御が実行されます。システム既定のフォーカス制御に任せることを意味します。 wParam に、最初にフォーカスを受け取るウィンドウのハンドルが入っており、 ダイアログ表示時には、そのウィンドウがフォーカスを受け取ります。
※ 0 を返却 → 標準のフォーカス制御を抑制し、独自のフォーカス制御を行うこと意味します。 意図的に SetFocus API (あるいは Focus メソッド)を呼んだり、 アクティブウィンドウを変更するようなコードを伴う場合に使います。
> カラーパレットボタンを押下した時に画面が固まる現象が起きています。
もしかしたら、本来はウィンドウの手前に表示されるべきダイアログが ウィンドウの背後にモーダル表示されてしまい、操作不能に陥っているのかも。
> if (dlg.ShowDialog() == DialogResult.OK)
引数に、ダイアログの親ウィンドウを指定してみては如何でしょうか。 具体的には、dlg.ShowDialog() ではなく、 dlg.ShowDialog(this) にしてみるということです。
https://social.msdn.microsoft.com/Forums/ja-JP/1ac1bc49-8b00-45fb-b258-81c87aa9d7b5?forum=csharpgeneralja
以下蛇足:
> private void archPaint_Click(object sender, EventArgs e) { > foreach (Control v in archPaint.Controls) {
子コントロールの上に、さらに子コントロールが貼られているような 入れ子構造のケースは考えなくても良いのでしょうか。
> v.BackColor = Color.FromArgb(0, 0, 0, 0);
コントロールによっては、不透明色しか指定できないものも ありますので御注意あれ。(たとえば TextBox など)
|
|