我正在使用 wxWidges (native C++) 重写应用程序。我确实有几个通过 Visual Studio 资源编辑器创建的用户定义的鼠标光标。资源编辑器为每个文件创建 MYCURSOR.CUR 之类的文件,其中包含位图和其他信息,并在app.rc文件中添加一个条目,例如:
IDC_MYCURSOR CURSOR "MYCURSOR.CUR"
...并在生成的内容中添加一行resource.h:
#define IDC_MYCURSOR 103
编译应用程序时,编译后的资源采用二进制形式,成为app.exe. 当不使用 wxWidgets 框架时,可以调用:
HCURSOR hCur = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_MYCURSOR));
hInstance具有光标资源可执行文件的应用程序的句柄在哪里(以编译的二进制形式,在app.exe.
使用 wxWidgets,我可以创建wxCursor该类的实例,并使用光标将文件名传递给它——就像wxCursor cursor(wxT("MYCURSOR.CUR"));——它可以工作。但是,MYCURSOR.CUR必须找到该文件(例如放置在与该文件相同的目录中app.exe)。换句话说,它会忽略附加到app.exe. 如果未找到该名称的文件,则不加载光标形状。
有没有什么方法——在 Windows 中——可以让我根据资源编号从资源中加载光标?
我理解,代码应该以可移植的方式编写,例如基于 Unix 的操作系统。是否有任何推荐的方法将 Windows 资源或MYCURSOR.CUR文件转换为编译或附加到生成的可执行文件的形式?
更新
我在 wxWidget 讨论论坛上发现了 upCASE(2005 年 4 月)的 .rc [Win] 中 wxCursor中的提示:
wxCursor( "#1", wxBITMAP_TYPE_CUR_RESOURCE );
我尝试将它与我的号码一起使用,它似乎可以工作,但我不知道为什么。然后我像这样改进它:
#define STR(value) #value
#define RES(value) wxT("#") wxT(STR(value))
...
wxCursor cur(RES(IDC_MYCURSOR), wxBITMAP_TYPE_CUR_RESOURCE);
我认为这很丑陋,可能不是正确的方法。无论如何,你能解释一下吗?
此外,查看内部c:\wxWidgets-2.9.4\src\msw\cursor.cpp,我发现采用字符串参数的构造函数将其解释为文件名(至少参数名为filename)。编码...
switch ( kind )
{
case wxBITMAP_TYPE_CUR_RESOURCE:
hcursor = ::LoadCursor(wxGetInstance(), filename.t_str());
break;
...
建议LoadCursor()使用不用于堆栈 Windows 游标的方式(否则第一个参数应为 NULL)。将::LoadCursor参数命名为LPCTSTR lpCursorName,并且文档说
要加载的游标资源的名称。或者,该参数可以由低位字中的资源标识符和高位字中的零组成。MAKEINTRESOURCE 宏也可用于创建此值。
我也试过
wxCursor cur(MAKEINTRESOURCE(IDC_MYCURSOR), wxBITMAP_TYPE_CUR_RESOURCE);
但它失败了,因为wxCursor构造函数应用了字符串转换——见上面filename.t_str()。你能对此发表评论吗?
解决了(加上一些解释我所面临的......)
早些时候,我只通过 IDE 使用 Windows 应用程序资源,或者我只通过app.rc文件直接做一些小事情。在VZ 的答案和ravenspoint 的答案的帮助下深入挖掘时,我可能会更好地理解它们最初的含义以及微软过去和后来所做的事情,以及我困惑的根源是什么。
首先,当您通过 Visual Studio IDE 创建一些资源(比如鼠标光标)时,它会自动获得一个数字标识(比如103)。该数字被自动捕获resource.h为#define IDC_MYCURSOR 103- 即还给出了宏标识符。将有关光标的信息插入到 时使用宏标识符app.rc,如下所示:
IDC_MYCURSOR CURSOR "MYCURSOR.CUR"
由于resource.h被包含在 中app.rc,它可能大致相当于
103 CURSOR "MYCURSOR.CUR"
并且资源编译器可能会将103数字转换为#103字符串或类似的东西。可能正因为如此,wxCursor("#103", wxBITMAP_TYPE_CUR_RESOURCE);作品。在试图理解 ravenpoint 的观点时, 103via 的间接性是我困惑的根源:)resource.h
然而,使用app.rc不带resource.h和字符串标识符的资源可能是设计者的初衷。因此,写作
mycursor CURSOR "MYCURSOR.CUR"
意味着资源脚本文件编译器创建"mycursor"可以直接在LoadCursor()函数内部使用的字符串标识符或wxCursor("mycursor", ...);. 这是 VZ 推荐的方式,并在指出的 wx 示例中找到。
我创建了自己cursor.rc2的包含鼠标光标资源信息的内容。然后.rc2将其包含到app.rc文件中以与其他资源信息组合......并且它可以工作!:) 总结是:不要使用数字来识别资源。使用字符串。
再次感谢您的时间和经验,彼得