gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:13:16 25 4
gpt4 key购买 nike

我不是 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;

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

最佳答案

根据 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 个像素是什么。

关于C++ WndProc 获取消息的X和Y坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17758777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com