需要将一个带有背景图片的 UserControl 划分为多个小的可点击区域。单击它们应该只是引发一个事件,允许确定单击图片的哪个特定区域。
显而易见的解决方案是使用透明标签。但是,它们严重闪烁。所以看起来标签不是为此目的而设计的,它们需要太多时间来加载。
所以我在想是否存在更轻的选择?从逻辑上“切分”表面。
不过,我还需要在这些区域周围设置边界。
需要将一个带有背景图片的 UserControl 划分为多个小的可点击区域。单击它们应该只是引发一个事件,允许确定单击图片的哪个特定区域。
显而易见的解决方案是使用透明标签。但是,它们严重闪烁。所以看起来标签不是为此目的而设计的,它们需要太多时间来加载。
所以我在想是否存在更轻的选择?从逻辑上“切分”表面。
不过,我还需要在这些区域周围设置边界。
在用户控件上执行:
MouseClick += new System.Windows.Forms.MouseEventHandler(this.UserControl1_MouseClick);
现在在UserControl1_MouseClick
事件中做:
private void UserControl1_MouseClick(object sender, MouseEventArgs e)
{
int x = e.X;
int y = e.Y;
}
现在让我们将用户控件划分为一个 10x10 的区域:
int xIdx = x / (Width / 10);
int yIdx = y / (Height / 10);
ClickOnArea(xIdx, yIdx);
在ClickOnArea
方法中,您只需要决定在每个领域做什么。也许使用二维数组Action
至于边界这样做:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
Pen p = new Pen(Color.Black);
float xIdx = (float)(Width / 10.0);
float yIdx = (float)(Height / 10.0);
for (int i = 0; i < 10; i++)
{
float currVal = yIdx*i;
g.DrawLine(p, 0, currVal, Width, currVal);
}
g.DrawLine(p, 0, Height - 1, Width, Height - 1);
for (int j = 0; j < 10; j++)
{
float currVal = xIdx * j;
g.DrawLine(p, currVal, 0, currVal, Height);
}
g.DrawLine(p, Width - 1, 0, Width - 1, Height);
}