C++ Can';t检测MFC图片控件上的鼠标下降
我正在尝试在mfc对话框中添加图片控件。当我点击图片控件时,我想得到像素的x,y坐标。我使用的参考代码和以下检测点击图片控件 为图片控件派生了一个单独的类,并实现了PreTranslateMessageC++ Can';t检测MFC图片控件上的鼠标下降,c++,mfc,C++,Mfc,我正在尝试在mfc对话框中添加图片控件。当我点击图片控件时,我想得到像素的x,y坐标。我使用的参考代码和以下检测点击图片控件 为图片控件派生了一个单独的类,并实现了PreTranslateMessage BOOL CPictureCtrl::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message
BOOL CPictureCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_LBUTTONDOWN && GetDlgItem(IDC_STATIC_BITMAP)->GetSafeHwnd() == pMsg->hwnd)
{
CPoint point(pMsg->pt);
ScreenToClient(&point);
OnLButtonDown(pMsg->wParam, point); //passes the coordinates of the clicked Point in the dialog box
}
return CStatic::PreTranslateMessage(pMsg);
}
在主对话框类中,我调用OnLButtonDown,如下所示
void CCPictureCtrlDemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
m_picCtrl.GetWindowRect(&rect);
ScreenToClient(&rect);
if (rect.PtInRect(point))
{
// Do something
}
CDialog::OnLButtonDown(nFlags, point);
}
PreTranslateMessage仅在我将鼠标悬停在图片控件上时触发,而在我单击图片时不会触发。并且当
单击图片控件时,它仅在单击图片控件以外的任何位置时触发
谢谢。
GetDlgItem(IDC\u静态\u位图)
将无法找到自己。您可以在父对话框上调用它,但不能在控件上调用它。不过,使用m_hWnd==pMsg->hWnd
没有问题。谢谢,我已经将预翻译消息移动到主对话框中,现在它正在工作,但条件if(rect.PtInRect(point))永远不会为真。将屏幕移动到客户端
到对话框中自然会转换相对于对话框客户端区域的坐标<代码>::ScreenToClient(GetDlgItem(IDC\u静态\u位图),&point)修复了这个问题。WM|LBUTTON(DOWN | UP)
提供的坐标是相对于正在单击的HWND
的客户端坐标。因此,您根本不应该使用ScreenToClient()
。但是,如果必须在父对话框中进行转换,请查看MapWindowPoints()
,而不是GetDlgItem(IDC\u STATIC\u BITMAP)
将无法找到自己。您可以在父对话框上调用它,但不能在控件上调用它。不过,使用m_hWnd==pMsg->hWnd
没有问题。谢谢,我已经将预翻译消息移动到主对话框中,现在它正在工作,但条件if(rect.PtInRect(point))永远不会为真。将屏幕移动到客户端
到对话框中自然会转换相对于对话框客户端区域的坐标<代码>::ScreenToClient(GetDlgItem(IDC\u静态\u位图),&point)修复了这个问题。WM|LBUTTON(DOWN | UP)
提供的坐标是相对于正在单击的HWND
的客户端坐标。因此,您根本不应该使用ScreenToClient()
。但如果必须在父对话框中进行转换,请查看MapWindowPoints()