我创建了一个无边界窗口,该窗口使用wndProc()
函数强制WM_NCHITTEST case
返回HTCAPTION;
,这允许用户拖动窗口,无论他的光标位于何处。
问题是我已经设置了一个自定义光标,但是使用上述方法,光标总是被设置回IDC_ARROW
。
我该如何解决这个问题?
编辑:我也尝试在SetCursor()
中使用WM_NCHITTEST case
,但它没有用。
答案 0 :(得分:2)
您可以使用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...
}
在窗口init中初始化CustomCursor。说:
CustomCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SIZEALL));
答案 1 :(得分:0)
除了SetCursor
中的WM_NCHITTEST
之外,还可以SetCursor
尝试WM_SETCURSOR
。
答案 2 :(得分:0)
通常,设置游标的正确方法是响应WM_SETCURSOR
消息。 (另见http://blogs.msdn.com/b/oldnewthing/archive/2005/05/25/421707.aspx)
但是,如果您在捕获鼠标时处理鼠标拖动,您的窗口将不会收到WM_SETCURSOR
消息,我认为唯一的选择是将光标设置在{{1}那个案子的处理程序。