0

我对 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;

无论如何,非常感谢您的帮助。

4

1 回答 1

2

根据MSDN 上 WM_NCHITTEST 的文档,使用GET_X_LPARAMand GET_Y_LPARAMfrom windowsx.h 而不是LOWORDandHIWORDLPARAM. 如果您真的想要将坐标转换为客户端坐标,可以将它们存储在 a 中POINT,然后ScreenToClient像这样调用:

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

但是,我不确定在这里这样做是否有真正的好处。值得注意的是,客户区从窗口框架开始,因此客户坐标中的 (0, 0) 不是窗口的左上角。

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

于 2013-07-20T05:55:11.633 回答