0

ユーザーがボタンを操作したときにボタンの画像を変更する簡単なプログラムを作成しています。コンピュータのマウスがボタンの中に入ると画像がハイライトされ、マウスをクリックすると画像が暗くなり、マウスがボタンから離れると画像は正常になります。この動作を実現するために、ボタンの画像を 3 つの画像の間で変更していますが、ボタンをクリックするとモーダル コントロール (MessageBox など) が表示されます。 「画像ですが、マウスはすでにボタンから外れています...だから、button1_MouseLeave イベントは発生していないと思いますが、その理由と修復方法がわかりません...これについて助けてもらえますか? 私が使用しているコードは簡単です:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace teste1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_MouseLeave(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Normal));
        }

        private void button1_MouseEnter(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Claro));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Test");            
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Clique));
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Claro));
        }        
    } 
}
4

5 に答える 5

1

ボタンへのフォーカスがその前に盗まれるため、マウスは確かに離れません。そのため、それらのメッセージは受信されません。また、LostFocus イベントをリッスンし、ボタンがフォーカスを失ったときに通常の画像に切り替える必要があります。

private void button1_LostFocus(object sender, EventArgs e)
{
    button1.Image = (System.Drawing.Image)Properties.Resources.Botao_Del_Normal;
}

LostFocus イベントを実際に聞いてみてください。コードを追加するだけでは何も起こりません。

予想される LostFocus デリゲートと MouseLeave デリゲートのシグネチャは同じであるため、実際には同じメソッドで両方のイベントをリッスンできることに注意してください (そして、それを好きなように呼び出しbutton1_MouseLeaveOrLostFocusます)。

于 2012-06-14T03:04:23.287 に答える
1

button1_MouseEnter イベントの代わりに、button1_MouseHover イベントを試してください。私は働きます。

于 2012-06-14T05:41:07.917 に答える
0

あなたのコードによれば、クリックを止めると画像がリセットされ、メッセージボックスが原因でウィンドウがフォーカスを失うことによってトリガーされるため、これは予想されることです。

MouseUp ハンドラーを削除して、目的の動作を実現します

于 2012-06-14T03:02:52.803 に答える
0

解決済み: わかりました、私はそれを機能させる方法を考え出しました! イベントを削除する必要があり、すべての処理をイベントMouseClickに追加したため、 (ALT + TAB を使用しても) 必要に応じて呼び出されるようになりました。コードは次のとおりです。MouseUpMouseLeaveMouseUp

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace teste1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_MouseEnter(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Claro));
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Clique));              
        }

        private void button1_MouseLeave(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Normal));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Image = ((System.Drawing.Image)(Properties.Resources.Botao_Del_Normal));
            // Processing is made here!
        }

    }
}
于 2012-06-14T22:46:51.573 に答える
0
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent(); 
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "Hello World!";
        }

        private void button1_MouseHover(object sender, EventArgs e)
        {
            button1.Text = "Mouse Hover";
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            button1.Text = "Mouse Down";
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            button1.Text = "Mouse Up";
        }

        private void button1_MouseLeave(object sender, EventArgs e)
        {
            button1.Text = "Mouse Leave";      
        }      
    }    
}
于 2012-06-18T04:40:21.543 に答える