MFC获取鼠标指针坐标问题

MFC getting mouse pointer coordinate problem

我正在尝试获取 Rect(图片控件)的坐标,但有点小问题。

这是我完成的过程。

第一。做了一个图片控件

第二。我通过 GetWindowRect

获得了 WindowRect
// myDialogDlg.cpp

CRect m_rcDisp // (is acually in myDialogDlg.h)

BOOL myDialogDlg::OnInitDialog()
{
// IDC_PIC1 == ID of the (static) picture control
GetDlgItem(IDC_PIC1)->GetWindowRect(m_rcDisp);

...
}

第三。我制作了 OnMouseMove 事件,并在鼠标指针位于图片控件内时使用 PtInRect 执行一些操作。

// myDialogDlg.cpp
void myDialogDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    CString debug;
    {
        if (m_rcDisp.PtInRect(point))
        {
// my event starts
            OutputDebugString(_T("here"));
            if (m_CamTrig == CAMERA_TRIG_SW)
            {
                m_CurSor.x = point.x;
                m_CurSor.y = point.y;
                InvalidateRect(m_rcDisp, NULL);
            }
// my event ends
        }
    }
    CDialogEx::OnMouseMove(nFlags, point);
}

并且... PtInRect 实际工作的地方大约在红框内

:(希望我得到最佳答案。 谢谢!

GetWindowRect returns the window dimensions in screen coordinates. WM_MOUSEMOVE reports the mouse position in client coordinates. ScreenToClient1可用于将屏幕坐标转换为客户端坐标,使图片控件的window矩形坐标和命中测试功能一致共同的起源。

每当图片控件相对于其父对话框移动时都需要执行此操作。如果图片控件从不移动,您只需调整一次矩形。

此答案链接到 Windows API 文档,因为它通常比相应的 MFC 条目提供更多信息并且维护得更好。您可以从 MFC 代码调用其中任何一个,但通常只调用 CWnd 成员更方便。


1 使用 MapWindowPoints instead if you plan on supporting RTL and LTR layouts. See Window Layout and Mirroring 作为指导。