使用自定义游标强制WM_NCHITTEST返回HTCAPTION ..?

时间:2012-11-18 09:13:49

标签: c++ winapi user-interface cursor message

我创建了一个无边界窗口,该窗口使用wndProc()函数强制WM_NCHITTEST case返回HTCAPTION;,这允许用户拖动窗口,无论他的光标位于何处。
问题是我已经设置了一个自定义光标,但是使用上述方法,光标总是被设置回IDC_ARROW
我该如何解决这个问题?

编辑:我也尝试在SetCursor()中使用WM_NCHITTEST case,但它没有用。

3 个答案:

答案 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}那个案子的处理程序。