如何在 Visual C++ 项目中定义和加载资源?
How do I define and load a resource in a Visual C++ project?
下面的代码编译并运行。但是,当我调试它时,资源为 NULL,大小为零。我使用向导导入了“Resources\title.display.png”,所以我必须相信图像的路径是正确的。不会抛出任何错误。这些是构成项目的三个文件。我已经把它归结为这个并且无法弄清楚出了什么问题。有什么问题吗?
sample.rc:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h[=10=]"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"[=10=]"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"[=10=]"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// PNG
//
IDB_PNG1 PNG "Resources\title.display.png"
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
resource.h:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by sample.rc
//
#define IDB_PNG1 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
sample.cpp:
#include <iostream>
#include <windows.h>
#include "resource.h"
int main(int argc, char** argv)
{
HMODULE module = GetModuleHandle(NULL);
HRSRC resource = FindResource(NULL, MAKEINTRESOURCE(IDB_PNG1), RT_RCDATA);
int resource_size = SizeofResource(module, resource);
return 0;
}
RT_DATA 应该是 L"PNG"。
您正在将图像资源存储为 PNG
资源,而不是 RCDATA
资源。因此,在调用 FindResource()
时,您需要将 RT_RCDATA
更改为 TEXT("PNG")
:
HRSRC resource = FindResource(NULL, MAKEINTRESOURCE(IDB_PNG1), TEXT("PNG"));
下面的代码编译并运行。但是,当我调试它时,资源为 NULL,大小为零。我使用向导导入了“Resources\title.display.png”,所以我必须相信图像的路径是正确的。不会抛出任何错误。这些是构成项目的三个文件。我已经把它归结为这个并且无法弄清楚出了什么问题。有什么问题吗?
sample.rc:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h[=10=]"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"[=10=]"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"[=10=]"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// PNG
//
IDB_PNG1 PNG "Resources\title.display.png"
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
resource.h:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by sample.rc
//
#define IDB_PNG1 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
sample.cpp:
#include <iostream>
#include <windows.h>
#include "resource.h"
int main(int argc, char** argv)
{
HMODULE module = GetModuleHandle(NULL);
HRSRC resource = FindResource(NULL, MAKEINTRESOURCE(IDB_PNG1), RT_RCDATA);
int resource_size = SizeofResource(module, resource);
return 0;
}
RT_DATA 应该是 L"PNG"。
您正在将图像资源存储为 PNG
资源,而不是 RCDATA
资源。因此,在调用 FindResource()
时,您需要将 RT_RCDATA
更改为 TEXT("PNG")
:
HRSRC resource = FindResource(NULL, MAKEINTRESOURCE(IDB_PNG1), TEXT("PNG"));