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

时间:2013-01-03 06:29:55

标签: winapi

我希望在没有边框和标题栏的窗口客户区内隐藏光标(这是简单的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);

这是解决这一典型任务的好方法吗?什么方式最好?

3 个答案:

答案 0 :(得分:4)

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

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

    return TRUE;
}

// Remainder of window procedure code

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我发现首先将 hCursor 设置为 NULL

    wc.hCursor = NULL;

然后将光标设置为NULL

    SetCursor(NULL);

会让它消失。

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

然后,在应用程序设置了自己的光标后,我用第二行代码把它弄乱了。或者至少,我认为这就是会发生的事情。