トップ回答者
フォームの移動中を判断し半透明にする方法

質問
-
フォームの下に隠れている、他のアプリのコントロールの内容を確認する
ためフォームを半透明にしたいと思うのですが、常時半透明の状態だと
(自アプリの)フォームの内容が見づらくなってしまいます。
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
を利用して、マウスがタイトルバーの上にあるかどうかを調べるまでは
わかったのですが、タイトルバーをドラッグまたはフォームの移動中
であることを判断する方法がわかりません。
どなたか詳しい方、ご指南のほどよろしくお願いします。
回答
すべての返信
-
おはようございます。
はなはなはなさん、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関係なので移動時のイベントをキャッチできるかという疑問が湧いたのですが、試してみると透明・不透明の切り替えが出来ました。ありがとうございました。
-
はなはなはなさん、ありがとうございます。
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);}