none
フォームの移動中を判断し半透明にする方法 RRS feed

  • 質問

  • フォームの下に隠れている、他のアプリのコントロールの内容を確認する

    ためフォームを半透明にしたいと思うのですが、常時半透明の状態だと

    (自アプリの)フォームの内容が見づらくなってしまいます。

     

    private void Form1_Load(object sender, EventArgs e)

    {

        this.Opacity = 0.8;

    }

     

    そこでフォームのタイトルバーをドラッグして移動中だけ半透明にしたい

    と思い、いろいろ試してみたのですが、どうしてもうまくいきません。

    (ドロップしたときは、透明ではなくする。)

     

    protected override void WndProc(ref Message m)

     

    http://dobon.net/vb/dotnet/form/moveform.html

     

    を利用して、マウスがタイトルバーの上にあるかどうかを調べるまでは

    わかったのですが、タイトルバーをドラッグまたはフォームの移動中

    であることを判断する方法がわかりません。

     

    どなたか詳しい方、ご指南のほどよろしくお願いします。

    2008年4月27日 10:09

回答

すべての返信

  • WM_NCLBUTTONDOWNで半透明、WM_NCLBUTTONUPで不透明にしてはどうでしょうか。

    2008年4月27日 12:47
  • 別の方法ですが、フォームの ResizeBegin イベントと ResizeEnd イベントを使ってみられてはいかがでしょうか。

    2008年4月27日 13:46
  • おはようございます。

     

    はなはなはなさん、TH01さんありがとうございます。

     

    早速お二人のアドバイスを試させていただきました。

     

    > WM_NCLBUTTONDOWNで半透明、WM_NCLBUTTONUPで不透明にしてはどうでしょうか。

     

    private const int WM_NCLBUTTONDOWN = 0xA1;
    private const int WM_NCLBUTTONUP = 0xA2;

    protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_NCLBUTTONDOWN)
                {
                        this.Opacity = 0.8;

                }
                else if (m.Msg == WM_NCLBUTTONUP)
                {
                        this.Opacity = 1.0;
                }

                base.WndProc(ref m);
            }

    のようにしてみたのですが、コードに間違えがあるのかWM_NCLBUTTONDOWNは透明になるのですが、WM_NCLBUTTONUPがうまく受け取ることができませんでした。(不透明に戻らない。)

     

    > 別の方法ですが、フォームの ResizeBegin イベントと ResizeEnd イベントを使ってみられてはいかがでしょうか。

     

    最初見たときResize関係なので移動時のイベントをキャッチできるかという疑問が湧いたのですが、試してみると透明・不透明の切り替えが出来ました。ありがとうございました。

    2008年4月28日 0:44
  •  

    WM_EXITSIZEMOVEでした。
    2008年4月28日 3:24
  • はなはなはなさん、ありがとうございます。

     

    WM_EXITSIZEMOVEに変更したら不透明にもどるようになりました。

     

    private const int WM_NCLBUTTONDOWN = 0xA1;
    private const int WM_EXITSIZEMOVE = 0x232;

     

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_NCLBUTTONDOWN)
        {
            this.Opacity = 0.8;
        }
        else if (m.Msg == WM_EXITSIZEMOVE)
        {
            this.Opacity = 1.0;
        }
        base.WndProc(ref m);

    }

     

     

    2008年4月28日 15:30