强制 WM_NCHITTEST 返回 HTCAPTION,带有自定义光标..?

问题描述 投票:0回答:3

我创建了一个无边框窗口,它使用

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

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

c++ user-interface winapi message mouse-cursor
3个回答
5
投票

您可以使用 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));

0
投票

除了

SetCursor
中的
WM_NCHITTEST
之外,也尝试
SetCursor
中的
WM_SETCURSOR


0
投票

通常设置光标的正确方法是响应

WM_SETCURSOR
消息。 (另见http://blogs.msdn.com/b/oldnewthing/archive/2005/05/25/421707.aspx

但是,如果您在捕获鼠标的地方处理鼠标拖动,您的窗口将不会收到

WM_SETCURSOR
消息,我认为唯一的选择是在这种情况下的
WM_MOUSEMOVE
处理程序中设置光标。

© www.soinside.com 2019 - 2024. All rights reserved.