C++ Can';t检测MFC图片控件上的鼠标下降

C++ 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

我正在尝试在mfc对话框中添加图片控件。当我点击图片控件时,我想得到像素的x,y坐标。我使用的参考代码和以下检测点击图片控件

为图片控件派生了一个单独的类,并实现了PreTranslateMessage

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()