0

我正在制作一个简单的程序,当用户与之交互时它会更改按钮的图像。当计算机鼠标进入按钮内部时,图像会突出显示,当鼠标单击时,图像会变暗,当鼠标离开按钮时,图像会变得正常。为了实现这种行为,我正在更改 3 个图像之间的按钮图像,但是当我单击按钮并显示模态控件(例如 MessageBox)时,当它从 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_MouseHover 事件而不是 button1_MouseEnter 事件。我会工作。

于 2012-06-14T05:41:07.917 回答
0

这是意料之中的,因为根据您的代码,当您停止单击时图像会重置,这将由窗口由于 messageBox 而失去焦点而触发。

删除 MouseUp 处理程序以实现您想要的行为

于 2012-06-14T03:02:52.803 回答
0

已解决:好的,伙计们,我想出了如何让它工作!我必须删除该MouseClick事件,并将所有处理添加到该MouseUp事件中,所以现在应该按原样MouseLeave调用(即使使用 ALT+TAB)。MouseUp现在的代码是:

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 回答