3

マウスがフォーム上にないときは不透明度が減少し、マウスがフォーム上にあるときはフォームが不透明になります。私は現在、いくつかの問題に直面しています:-

  1. まず、私はこれをしました-

     this.MouseHover += new EventHandler(Form1_MouseHover);
     this.MouseLeave += new EventHandler(Form1_MouseLeave);
    

    しかし、フォームにもリッチテキストボックスが1つあり、マウスがその上に移動すると、フォームは再び不透明になりました。これも追加する必要がありました:-

     richTextBox1.MouseHover+=new EventHandler(Form1_MouseHover);
     richTextBox1.MouseLeave+=new EventHandler(Form1_MouseLeave);
    

    リッチテキストボックスとフォームの境界の間にまだギャップがあり、マウスカーソルがそこに移動するとフォームの不透明度が失われるため、より良い方法があるかどうか疑問に思っています。

  2. マウスがフォーム上にない場合 (最初の場合)、フォームの不透明度は低くなります。ここで、マウスがフォームの上に移動するとすぐにフォームを不透明にしたいのですが、フォーム上でのマウスの動きが完全に停止したときにのみ発生します。フォームの上にマウスを移動し続けると、不透明になりません。これは、イベントがメッセージ キューに格納される方法に問題があるのでしょうか。実装しようとしている効果のあるアプリケーションを見たことがあるので、何かできるのでしょうか。

4

4 に答える 4

8

MouseEnter / Leaveイベントは、これを行うには信頼性が低すぎます。最善の方法は、マウスがまだウィンドウ内にあるかどうかをチェックするタイマーを使用することです。フォームにタイマーをドロップし、コードを次のようにします。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.Opacity = 0.99;
        timer1.Interval = 200;
        timer1.Enabled = true;
        timer1.Tick += timer1_Tick;
    }
    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
        timer1_Tick(this, e);
    }
    private void timer1_Tick(object sender, EventArgs e) {
        this.Opacity = this.Bounds.Contains(this.PointToClient(Cursor.Position)) ? 0.99 : 0.20;
    }
}

ところで:不透明度を1.0に上げることは避けてください。これにより、ネイティブウィンドウが強制的に再作成され、多くの副作用が発生する可能性があります。0.99を使用するのが最適です。

于 2012-09-23T14:11:10.557 に答える
6

私は間違っているかもしれませんが、なぜ MouseHover イベントを使用するのですか? MouseHoverは、マウスがフォーム上で移動を停止したことを検出し、通常はツールヒントを表示するために使用されます。

探しているイベントは、MouseEnter です。これは、 MouseLeaveの反対であり、マウスがウィンドウのクライアント四角形に入ったときに検出されます。

Leave イベントでは、カーソル位置がウィンドウ クライアントの四角形にあるかどうかを確認して、実際にフォームを離れたかどうか、または子コントロールのすぐ上にあるかどうかを確認します。

リージョンを使用する場合は、コードを調整する必要があります。

 private void Form1_MouseEnter(object sender, EventArgs e)
    {
        this.Opacity = 1;
    }

    private void Form1_MouseLeave(object sender, EventArgs e)
    {

        if (!this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)))
        {
            this.Opacity = 0.5;
        }
    }
于 2012-09-23T13:46:31.247 に答える
0
private void Form1_MouseEnter(object sender, EventArgs e)
{
    this.Opacity = 1.0;
}

private void Form1_MouseLeave(object sender, EventArgs e)
{ 
    this.Opacity = 0.8;
}
于 2012-09-23T13:54:13.357 に答える