C ++ WndProc获取消息X和Y坐标

时间:2013-07-20 04:51:40

标签: c++ visual-c++ coordinates win32gui

我不是C ++的新手,但Win32编程的概念对我来说还是个新手。无论如何,当WM_NCHITTEST消息通过WndProc传递时,我在获取X和Y坐标时遇到了一些麻烦。为了尝试立即获取它们,我使用以下代码:

int x = LOWORD(lParam);
int y = HIWORD(lParam);

我不确定它是否有效,但我相信它是。我在某处读到这实际上返回了监视器本身上指针的x和y坐标,而不是相对于应用程序。

当我在尝试找出如何将其转换为相对于应用程序的坐标时进行广泛的谷歌搜索时,我遇到了这个方法(或函数。我不再在java中了:P):

Point relativePos = theControl.PointToClient(pos);

其中pos是x和y坐标。我非常想尝试这个代码,但是我遇到了很多问题。

首先,点在C ++中不起作用。我试过了,但他们没有用。其次,在Win32中,我不相信Point是定义的。我可以找到POINT,但是我不确定那是一回事。最后,我真的不太确定如何定义这一点。

为了解释我为什么需要这个,我试图让窗口只能通过窗口的前50个像素来拖动。

case WM_NCHITTEST:
    hit = DefWindowProc(hWnd, message, wParam, lParam);
    if(y < 50)
        return HTCAPTION;
    break;

无论如何,您的帮助非常赞赏。

1 个答案:

答案 0 :(得分:2)

根据documentation for WM_NCHITTEST on MSDN,使用来自windowsx.h的GET_X_LPARAMGET_Y_LPARAM而不是LOWORDHIWORD来获取LPARAM的坐标值}。您可以将坐标转换为客户坐标,如果您真的想将它们存储在POINT中,然后像这样调用ScreenToClient

POINT pt;
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
ScreenToClient(hWnd, &pt);

但是,我不确定这样做有什么好处。值得注意的是,客户区开始窗口框内,因此客户端坐标中的(0,0)不是窗口的左上角。

你真正想要的是GetWindowRect,它会在屏幕坐标中为你提供整个窗口的边界矩形。你可以从中找出前50个像素是什么。