如何从C++资源文件加载游标组?

问题描述:

我正尝试从Visual C++(Windows)中的资源文件(.rc)加载自定义光标。该资源正在正确编译到我的主要.exe,因为我可以成功加载其他资源类型(即自定义资源类型,如“PNG”)。如何从C++资源文件加载游标组?

在我的.rc文件我有:

#define IDI_CURSOR1 1000 

IDI_CURSOR1 CURSOR "Resources\\Cursors\\MainCursor.cur" 

在我.cpp文件我有:

HCURSOR mainCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDI_CURSOR1)); 

LoadCursor()总是返回NULL。调用HRESULT_FROM_WIN32(GetLastError())将返回“在资源文件中找不到指定的资源类型”。现在

,我尝试使用加载它:

FindResource(NULL, MAKEINTRESOURCE(IDI_CURSOR1), L"CURSOR"); 

,但我得到了同样的错误。

挖掘周围后,我找到了一种方法来打印我的模块中的所有资源,我发现我的光标。它正在加载,但类型为“12”,根据此:http://www.csn.ul.ie/~caolan/pub/winresdump/winresdump/doc/resfmt.txtRT_GROUP_CURSOR。那里还有一个RT_CURSOR,它是类型“1”。作为确认,我试图再次找到资源:

FindResource(NULL, MAKEINTRESOURCE(IDI_CURSOR1), "#12"); 

并确实发现它没有错误。

好吧,所以光标正在加载,但LoadCursor()似乎并没有寻找类型“12”。它寻找什么类型,我如何得到CURSOR映射到正确的类型?

我想你应该为你的自定义游标定义实例参数,通常当你加载标准游标时,可以将NULL作为第一个参数,而不是自定义游标。

例如

LoadCursor(hInstance, MAKEINTRESOURCE(IDI_CURSOR1)); 
+0

谢谢。我也尝试过。没有运气。 – Yelmond

+1

划痕,这是脑死亡的另一种情况。我正在使用模块句柄,而不是实例句柄。你是对的。它现在有效。 – Yelmond

是的,你是对的。加载自定义游标资源类型应为#12。这意味着RT_GROUP_CURSOR。在您的代码中使用此资源类型而不是RT_CURSOR