gpt4 book ai didi

windows - Windows上的wxWidgets:如何从应用程序资源编号创建wxCursor?

转载 作者:可可西里 更新时间:2023-11-01 11:58:35 25 4
gpt4 key购买 nike

我使用WxWistGES(原生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月)中的提示:
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()(否则第一个参数应为空)。 ::LoadCursor将参数命名为 LPCTSTR lpCursorName,并且 wxCursor from .rc [Win]
要加载的游标资源的名称。或者,该参数可以由低阶单词中的资源标识符和高阶单词中的零组成。makeIntResource宏也可用于创建此值。
我也试过
wxCursor cur(MAKEINTRESOURCE(IDC_MYCURSOR), wxBITMAP_TYPE_CUR_RESOURCE);

但它失败了,因为 wxCursor构造函数应用了字符串转换——请参见上面的 filename.t_str()。你能对此发表评论吗?
解决了(加上一些我所面临的解释…)
以前,我只通过ide处理windows应用程序资源,或者直接通过 app.rc文件处理一些小事情。当我在 the doc saysVZ's answer的帮助下深入研究时,我可能会更好地理解它们最初的含义以及微软过去和以后的所作所为,以及我困惑的根源。
首先,当您通过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的观点时, 103通过 resource.h的间接指向是我困惑的根源:)
然而,使用一个不带 app.rc和资源的字符串标识符的 resource.h可能是设计者的初衷。因此,写作
mycursor          CURSOR     "MYCURSOR.CUR"

意味着资源脚本文件编译器创建可以直接在 "mycursor"函数或 LoadCursor()函数中使用的 wxCursor("mycursor", ...);字符串标识符。这是vz推荐的方法,在指出的wx样本中可以找到。
我已经创建了自己的包含鼠标光标资源信息的 cursor.rc2。然后 .rc2被包含到 app.rc文件中,以便与其他资源信息结合…而且有效!:)摘要是:不要使用数字来标识资源。使用字符串。
再次感谢您的时间和经验,
彼得尔

最佳答案

对于数字id,您需要使用不太明显的wxCursor("103")。这就是为什么wxwidgets通常使用字符串名称(如上面的答案中的my_cursor)。
当然,你也可以

#include <wx/cpp.h>

wxCursor cursor(wxSTRINGIZE(IDC_CURSOR));

关于windows - Windows上的wxWidgets:如何从应用程序资源编号创建wxCursor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com