我创建了一个无边框窗口,它使用
wndProc()
函数强制 WM_NCHITTEST case
返回 HTCAPTION;
,这允许用户拖动窗口,无论他的光标位于何处。IDC_ARROW
.SetCursor()
中使用WM_NCHITTEST case
,但它没有用。
您可以使用 WM_SETCURSOR 消息覆盖光标。 lParam 的 LOWORD 表示命中测试代码,即您使用 WM_NCHITTEST 处理程序更改的代码。这很有效:
static HCURSOR CustomCursor;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NCHITTEST: {
LRESULT result = DefWindowProc(hWnd, message, wParam, lParam);
if (result == HTCLIENT) result = HTCAPTION;
return result;
}
case WM_SETCURSOR:
if (LOWORD(lParam) == HTCAPTION) {
SetCursor(CustomCursor);
return TRUE;
}
return DefWindowProc(hWnd, message, wParam, lParam);
// etc...
}
在您的窗口初始化中初始化 CustomCursor。说:
CustomCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SIZEALL));
除了
SetCursor
中的WM_NCHITTEST
之外,也尝试SetCursor
中的WM_SETCURSOR
。
通常设置光标的正确方法是响应
WM_SETCURSOR
消息。 (另见http://blogs.msdn.com/b/oldnewthing/archive/2005/05/25/421707.aspx)
但是,如果您在捕获鼠标的地方处理鼠标拖动,您的窗口将不会收到
WM_SETCURSOR
消息,我认为唯一的选择是在这种情况下的 WM_MOUSEMOVE
处理程序中设置光标。