C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 136 を表示中)
■79940 / )  Re[9]: カラーパレット任意の座標に表示する
□投稿者/ kazu (8回)-(2016/05/30(Mon) 17:39:22)
No79938 (魔界の仮面弁士 さん) に返信
> ■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
>

裏に隠れてる可能性が一番高いかと思っております。
サンプルでは
http://www.kanazawa-net.ne.jp/~pmansato/net/net_technics.htm
if (dlg.ShowDialog(button1) == DialogResult.OK)
this.BackColor = dlg.Color;
になっていましたが
if (dlg.ShowDialog() == DialogResult.OK) にしていたからです。
ですが、dlg.ShowDialog(this) で試してみたところ表には出てくれませんでした。
this以外に考えられる引数はありますか?


>
> 以下蛇足:
>
>>private void archPaint_Click(object sender, EventArgs e) {
>> foreach (Control v in archPaint.Controls) {
>
> 子コントロールの上に、さらに子コントロールが貼られているような
> 入れ子構造のケースは考えなくても良いのでしょうか。
>
>
>>  v.BackColor = Color.FromArgb(0, 0, 0, 0);
>
> コントロールによっては、不透明色しか指定できないものも
> ありますので御注意あれ。(たとえば TextBox など)

今回の仕様ではラベルのみ作成の為、このような判断で色を変更するようにしました。
できれば他の場所をクリックした時にpictureboxの上にあるコントロール(ラベル)の背景色を透過するという
うまい処理を書けたらいいのですが、何分未熟なので今はこの方法しか思いつきませんでした。
返信 編集キー/


管理者用

- Child Tree -