[英]Trigger button click in .NET Compact Framework
假設我有一個包含許多Button和PictureBox控件的Panel。 每個控件都有一個關聯的Click事件。 這是一個觸摸屏應用程序,因此用戶點擊可能會有點不精確(或者觸摸屏校准可能不完美)。 所以,我想處理面板上的click事件,然后如果點擊接近按鈕/圖片,則以編程方式調用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?
}
}
}
}
由於您無法使用PerformClick
,因此在這種情況下您將無法依賴控件的Click
事件處理程序自動觸發。 相反,只需創建一個方法來控制並從該控件中找出要采取的操作。 例:
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)))
{
handleClick (cntrl);
}
}
}
}
private void handleClick(Control c)
{
if (c == button1)
{
// handle button1 click, e.g. by calling its `Click` handler
}
else if (c == picureBox1)
{
// handle pictureBox1 click
}
// et cetera
}
首先,嘗試子類化按鈕並從您自己的PerformClick調用click事件。 否則,您可以編寫一個按鈕並執行單擊的方法。 首先獲取控件的句柄,然后p /調用windows API函數向它發送mousedown然后mouseup事件。 我相信它是SendMessage函數。 然后,您只需編寫邏輯以找到最近的按鈕並將其傳遞給函數。 或者,將其作為Button的擴展方法
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx
編輯:這是通過向控件發送mousedown和mouseup消息來模擬點擊的完整代碼:
// Windows constants for mouse messages
private const int WM_LBUTTONDOWN = 0x0201;
private const int WM_LBUTTONUP = 0x0202;
// P/Invoke for SendMessage
[DllImport("coredll.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam);
// Method to click a control
public void ClickControl(IntPtr hWnd)
{
// Send a MOUSE_DOWN and MOUSE_UP message to the control to simulate a click
SendMessage(hWnd, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
SendMessage(hWnd, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
}
// Method to handle click event on parent Panel control
private void pnlButtons_Click(object sender, EventArgs e)
{
// See if the click point is close to a (visible) button and if so, click the button.
// The user was probably a little imprecise or the screen might need re-calibration.
Point pt = pnlButtons.PointToClient(Cursor.Position);
// Now look for any Button / PictureBox controls nearby
foreach (Control cntrl in pnlButtons.Controls)
{
Rectangle inflated = cntrl.Bounds;
inflated.Inflate(4, 5);
if (cntrl.Visible && inflated.Contains(pt))
{
// Simulate a click on the control
ClickControl(cntrl.Handle);
break;
}
}
}
將按鈕單擊處理程序中的所有內容放到單獨的函數中,然后調用該函數而不是觸發按鈕單擊。
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)))
{
PerformActionsOnClick();
}
}
}
}
private void MyButton_Click(object sender, EventArgs e)
{
PerformActionsOnClick();
}
void PerformActionsOnClick()
{
//do your stuff here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.