WinApi,在窗口客户端区域内隐藏光标

WinApi,在窗口客户端区域内隐藏光标,winapi,Winapi,我想隐藏光标内的窗口客户端区域没有边框和标题栏(这是一个简单的opengl应用程序)。那么,功能呢 ShowCursor(FALSE); 这是不合适的。搜索winapi后,我找到了以下解决方案: //when create window class for application window WNDCLASSEX WndClass; //... BYTE CursorMaskAND[] = { 0xFF }; BYTE CursorMaskXO

我想隐藏光标内的窗口客户端区域没有边框和标题栏(这是一个简单的opengl应用程序)。那么,功能呢

    ShowCursor(FALSE);
这是不合适的。搜索winapi后,我找到了以下解决方案:

    //when create window class for application window
    WNDCLASSEX WndClass;
    //...
    BYTE CursorMaskAND[] = { 0xFF };
    BYTE CursorMaskXOR[] = { 0x00 };
    WndClass.hCursor = CreateCursor(NULL, 0,0,1,1, CursorMaskAND, CursorMaskXOR);

这是解决这个典型任务的好方法吗?哪种方法最好?

您正在使用的SetCursor()调用不需要BOOL,而是需要HCURSOR。所以您调用了SetCursor(NULL),这意味着“隐藏该光标”。我以前在Windows上发现,这依赖于视频驱动程序,很多驱动程序都不尊重它。处理此问题最一致的方法是在应用程序中创建一个透明的游标资源,并在主窗口的WM_SETCURSOR消息中返回该游标的句柄。

MSDN说,您可以将WNDCLASSEX hCursor字段设置为NULL,在这种情况下,您必须在窗口过程中显式设置游标(这意味着处理WM_SETCURSOR消息)。例如:

if (Msg == WM_SETCURSOR && LOWORD(lParam) == HTCLIENT)
{
    SetCursor(NULL);

    return TRUE;
}

// Remainder of window procedure code

检查HTCLIENT可确保光标仅隐藏在客户端区域中,并且窗口框架和标题将使用正确的光标。

我发现第一个设置
hCursor
NULL

    wc.hCursor = NULL;
    SetCursor(NULL);
然后将光标设置为
NULL

    wc.hCursor = NULL;
    SetCursor(NULL);
会让它消失

从MSDN中,我了解到如果未在
hCursor
中定义游标,应用程序将默认设置自己的游标。这就是第一行代码所做的


然后,在应用程序设置了自己的游标之后,我用第二行代码将其搞乱。或者至少,我认为这就是发生的情况。

查看此链接以加载游标…除了此之外,不确定您需要什么?我指的是使用SetCursor的驱动程序行为(NULL)你说的对。我只是想知道它是如何实现的。这不是一个典型的案例,这只是解决任何驱动程序错误的可靠方法。哦,谢谢,好的