c# - 如何在按钮悬停时在面板周围绘制边框?

标签 c# visual-studio winforms

当鼠标悬停在特定按钮上时,我想在面板周围绘制边框,以便提供某种突出显示效果,并且在 MouseLeave 事件中边框将消失。如何实现这一目标?我是 Winform 应用程序开发的新手。

PS-我在面板绘制事件中绘制了一个矩形,但我想在鼠标悬停时显示该矩形。我尝试过 Invalidate() 但没有任何反应。

最佳答案

请密切关注我的回答,我已经在本地测试过了,对你来说应该没问题:

1) 向您的项目添加一个新类,将其命名为 MyPanel.cs
2) 将类的默认文本替换为:

[System.ComponentModel.DesignerCategory("Code")]
public class MyPanel : Panel
{
   public Pen MyPen;

    public MyPanel()
    {
        SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        MyPen = Pens.Red;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        using (SolidBrush brush = new SolidBrush(BackColor))
            e.Graphics.FillRectangle(brush, ClientRectangle);
        e.Graphics.DrawRectangle(MyPen, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
    }
}

这是在您的应用程序的命名空间内,不要忘记这一点

3) 转到 Form1.cs [设计]
4) 从工具箱添加新按钮 toolbox->button
5)双击表单内的一些空闲空间,生成private void Form1_Load(object sender, EventArgs e)
6) 返回设计器,单击一次按钮,然后在属性框中切换到事件(闪电小图标)
7)双击MouseHover生成private void button1_MouseHover(object sender, EventArgs e)

现在我们的设置已准备就绪,让我们付诸行动:

8)public 分部类 Form1 : Form 下实例化 MyPanel 类:

 MyPanel p = new MyPanel();

9)private void Form1_Load(object sender, EventArgs e) 中,我们可以设置此实例并将其添加到表单的控件中:

        p.Location = new Point(10, 10);
        p.Size = new Size(100, 100);

        Controls.Add(p);

10) 我们需要做的最后一件事是更改按钮悬停时的边框颜色,因此让我们在 private void button1_MouseHover(object sender, EventArgs e) 中执行此操作:

        p.MyPen = Pens.Yellow;
        p.Refresh();

就是这样:)

Ps:如果你想让边框消失,请使用MouseLeave事件并将面板的MyPen更改为Pens.Transparent

关于c# - 如何在按钮悬停时在面板周围绘制边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51740877/

相关文章:

c# - 使用 WinForms 扩展旧版 C++ Windows 应用程序

c# - 在 LineSeries WinForms 图表中显示工具提示?

c# - 从每一帧视频中捕获单个像素行并将它们编译在一起

c# - 中央标准时间休息一小时

c# - 如何计算使用静态类变量创建的对象数?

c# - 连接两个表后访问所有数据并使用 linq 对它们进行分组

visual-studio - 未在 Windows 10 上登录时,Visual Studio 2013 devenv 无法构建项目

visual-studio - 如何在不使用 ReSharper 的情况下突出显示 Visual Studio 中的事件行?

visual-studio - Visual Studio 2012 中的 session /工作集

c# - 匹配所有有效格式 IPv6 地址的正则表达式