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

3

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

6

MSDN中提到,您可以将WNDCLASSEX结构体的hCursor字段设置为NULL,这种情况下,您必须明确在窗口过程中设置光标(也就是处理WM_SETCURSOR消息)。例如:

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

    return TRUE;
}

// Remainder of window procedure code

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


0
我发现首先将 hCursor 设置为 NULL
    wc.hCursor = NULL;

然后将光标设置为NULL

    SetCursor(NULL);

将使其消失。

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

然后,在应用程序设置自己的光标之后,我用第二行代码来操纵它。或者至少,我认为是这样发生的。


0
你正在使用的 SetCursor() 调用不接受 BOOL 类型参数,而是需要一个 HCURSOR。所以你调用了 SetCursor( NULL ),这意味着“隐藏光标”。在早期的 Windows 版本中,我发现这取决于显卡驱动程序,许多驱动程序不支持它。处理这个问题最一致的方法是在你的应用程序中创建一个透明的光标资源,并在主窗口的 WM_SETCURSOR 消息中返回该光标的句柄。

请查看此链接 http://msdn.microsoft.com/en-us/library/ms648391(v=VS.85).aspx 以加载光标...除此之外,不确定您需要什么? - HerrJoebob
我是指使用SetCursor(NULL)命令时,驱动器的行为。我只想知道它的实际作用是什么。 - And390
那不是一个典型的情况,只是解决任何驱动程序错误的可靠方法。 - HerrJoebob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接