我试图在MSDN上关注this tutorial以从资源加载图像文件。我觉得有些代码是guff,但我无法弄清楚如何让它工作。对FindResource()
的调用因错误代码1813而失败。
我已将.rc
资源文件添加到我的C ++项目中(我使用Visual Studio 2013作为我的IDE),并添加了一个ID为IDB_PNG1
的png文件:
教程将资源定义为IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
,然后将FindResource()
称为
FindResource(
NULL, // This component.
L"SampleImage", // Resource name.
L"Image"); // Resource type.
我觉得L"SampleImage"
应该是L"IDR_SAMPLE_IMAGE"
而L"Image"
应该是L"IMAGE"
,因为提供的值不是{0}}似乎存在于任何地方,但我的等效电话不起作用:
FindResource(
NULL, // This component
"IDB_PNG1", // Resource name
"PNG", // Resource type
);
我做错了什么?
我不知道它是否相关,但每当我在代码中使用L"string"
时,我都会收到错误(Argument of type "const wchar_t *" is incompatible with parameter of type "LPCSTR"
),所以我已经省略L似乎对我所遵循的其他每个例子都有效,所以我不认为这是问题所在。
答案 0 :(得分:6)
样品有点糊涂了#34; SampleImage"名称。令人困惑的部分是Win32资源可以用字符串或(16位)整数来标识。该示例使您使用字符串(例如L" SampleImage"),但Visual Studio IDE(坦率地说,我遇到的大多数代码)更喜欢整数。为了允许这两种类型,Win32资源函数采用LPCWSTR类型的参数,并且调用者应该使用宏MAKEINTRESOURCE将整数ID转换为"伪字符串"。这同样适用于资源类型。有一些内置类型(ICON,CURSOR,BITMAP等),但您总是可以使用字符串定义自己的类型。
如果您查看代码,您应该能够找到IDB_PNG1定义的头文件(可能是Resource.h)。它很可能是一个小整数,因此您需要使用MAKEINTRESOURCE宏。 PNG可能没有在任何地方定义,并且它不是内置资源类型之一,因此资源编译器将其视为字符串,所以你应该这样做。
e.g。
FindResource(
NULL, // This component
MAKEINTRESOURCE(IDB_PNG1), // Resource name
L"PNG", // Resource type
);
尝试并告知我们是否有效。