【发布时间】:2015-05-19 15:03:34
【问题描述】:
假设我有一个包含许多 Button 和 PictureBox 控件的面板。每个控件都有一个关联的 Click 事件。这是一个触摸屏应用程序,因此用户的点击可能有点不精确(或者触摸屏校准可能不完美)。所以,我想处理面板上的点击事件,然后如果点击靠近按钮/图片,则以编程方式调用按钮或图片框的点击事件。
许多其他答案建议使用“PerformClick”事件,但 Compact Framework 不支持此操作。有什么选择吗?我的代码:
private void pnlButtons_Click(object sender, EventArgs e)
{
Point ptClick = Control.MousePosition;
foreach (Control cntrl in pnlButtons.Controls)
{
// Make sure the control is visible!
if (cntrl.Visible)
{
// Click close to control?
if ((ptClick.X > (cntrl.Left - 5)) &&
(ptClick.X < (cntrl.Right + 5)) &&
(ptClick.Y > (cntrl.Top - 5)) &&
(ptClick.Y < (cntrl.Bottom + 5)))
{
// Click Button or PictureBox without cntrl.PerformClick?
}
}
}
}
【问题讨论】:
-
为什么要执行点击事件而不是点击事件调用的函数呢?所以:点击事件 CE1 调用函数 A,它调用函数 B、C、D 和 E。而不是调用 CE1,你可以只调用 A。
-
是的,好主意,但面板上的每个控件的功能略有不同。所以按钮 A => A_click 调用 FunctionA(),按钮 B => B_click 调用 FunctionB(),PictureBox C => C_click 调用 FunctionC() 等等,以获取大量按钮和图片。
-
很抱歉,我没有时间或东西来完整地写出答案,但我相信这并不难。首先,尝试子类化按钮并从您自己的 PerformClick 中调用 click 事件。否则,您可以编写一个获取按钮并执行单击的方法。首先获取控件的句柄,然后 p/调用 Windows API 函数以向其发送 mousedown 然后 mouseup 事件。我相信它是 SendMessage 功能。然后,您所要做的就是编写逻辑以找到最近的按钮并将其传递给函数。或者,将其写为 Button 的扩展方法...
-
@Alan:好主意,谢谢。我刚刚 P/Invoked SendMessage 并向控件发送了 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息,它按预期工作。如果您快速回答,我可以接受。否则,我明天会按照这些思路回答。
-
@AlainD 不客气,作为答案发布,随时编辑并复制 DllImports 的意大利面以供未来用户使用。
标签: c# .net compact-framework