加载png时,FindResource给出错误1813

时间:2015-04-05 19:27:12

标签: c++

我试图在MSDN上关注this tutorial以从资源加载图像文件。我觉得有些代码是guff,但我无法弄清楚如何让它工作。对FindResource()的调用因错误代码1813而失败。

我已将.rc资源文件添加到我的C ++项目中(我使用Visual Studio 2013作为我的IDE),并添加了一个ID为IDB_PNG1的png文件:

enter image description here

教程将资源定义为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似乎对我所遵循的其他每个例子都有效,所以我不认为这是问题所在。

1 个答案:

答案 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
    );

尝试并告知我们是否有效。