C# Windows 窗体 - 带有事件的不可见元素(单击和 MouseEnter/Leave)
Posted
技术标签:
【中文标题】C# Windows 窗体 - 带有事件的不可见元素(单击和 MouseEnter/Leave)【英文标题】:C# Windows Forms - Invisible Element with Events (Click and MouseEnter/Leave) 【发布时间】:2021-12-28 07:29:47 【问题描述】:我在我的项目中将几个标签直接相邻排列。现在,当我大约处于它们之间的边缘时,我想执行诸如 Click 或 MouseEnter/Leave 之类的事件。我试图在这个位置放置一个不可见的元素并从这个元素中捕获事件,但是一旦我使元素不可见,这些事件就不再起作用了。
我希望这不仅适用于 2 个标签之间的边缘,还适用于拐角处,以便在此拐角处停靠多达 4 个标签。
重要的是,我需要在事件中知道它是哪个边或角,以及分别停靠在哪个标签上。
我附上了一张图片以更好地可视化这一点。突出显示的地方只是我想捕捉这些事件的例子。但应该可以在标签之间的任何边缘和角落。
【问题讨论】:
【参考方案1】:也许一种选择是自己绘制标签的边框,然后你不需要在中间放置元素。
private void label3_Paint(object sender, PaintEventArgs e)
e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Red), 10f), label3.ClientRectangle);
base.OnPaint(e);
因此,如果您在标签上添加 Paint Event,则可以绘制边框(此处为红色,宽度为 10)。边框被视为标签的一部分,所以在边框上执行的所有事件都会以相同的方式触发,
【讨论】:
好的,我似乎忘记在我的问题中提及一些重要的事情。事件执行后,我还想知道它是在哪个边缘执行的。所以我需要停靠在事件边缘或角落的所有标签。【参考方案2】:实现此目的的一种方法是添加一个标签作为背景,您可以将其设置为与表单背景相同的颜色,使其显示为隐藏。
然后,您可以将点击、进入和离开事件附加到该标签,一旦您将其他标签之一的鼠标光标移动到背景标签上,该事件就会触发。
我已经模拟了这个屏幕,背景标签颜色较深,以便您可以看到:
我将深色背景命名为“lblBackdrop”,并将文本框命名为“txtMessage”。
然后我将以下处理程序附加到背景标签:
using System;
using System.Windows.Forms;
namespace WinFormsApp1
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void lblBackdrop_Click(object sender, EventArgs e)
txtMessage.Text = string.Concat(txtMessage.Text, "Background clicked\n");
private void lblBackdrop_MouseLeave(object sender, EventArgs e)
txtMessage.Text = string.Concat(txtMessage.Text, "Background left\n");
private void lblBackdrop_MouseEnter(object sender, EventArgs e)
txtMessage.Text = string.Concat(txtMessage.Text, "Background entered\n");
【讨论】:
首先感谢您的回答。但是,我似乎忘记在我的问题中提及一些重要的事情。一旦事件被执行,我还想知道它是在哪个边缘执行的。所以我需要所有停靠在事件边缘或角落的标签。另外,我不喜欢标签之间有空格。应该只看到一个细边框,它应该从背景中脱颖而出。 对!我认为@jason.kaisersmith 的答案适用于这种情况。您必须绘制并跟踪每个边框,但它会起作用。您还可以使用 System.Windows.Forms.Control.MousePosition 之类的东西来获取鼠标坐标,然后查看所有标签并检查哪些标签可能最接近该点?以上是关于C# Windows 窗体 - 带有事件的不可见元素(单击和 MouseEnter/Leave)的主要内容,如果未能解决你的问题,请参考以下文章
捕获托管在 mfc 对话框上的 windows 窗体事件(c#)