【发布时间】:2013-09-13 08:15:17
【问题描述】:
我有这段代码来加载位图:
HBITMAP reg_hbmCS = NULL;
LRESULT CALLBACK WndProc(HWND hRegWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
reg_hbmCS = LoadBitmap(NULL, MAKEINTRESOURCE(IDB_CSBITMAP));
if(!reg_hbmCS)
MessageBox(hRegWnd,
"No se ha podido cargar el icono del programa.\r\n"
"Pruebe a reinstalar el programa para solucionar este problema.",
"Atención", MB_ICONEXCLAMATION | MB_OK);
break;
case WM_CLOSE:
DeleteObject(reg_hbmCS);
DestroyWindow(hRegWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hRegWnd, message, wParam, lParam);
}
return 0;
}
问题是 reg_hbmCS 无法加载,所以我没有可用的位图(它在(if !reg_hbmCS) 中显示消息框。
这里是我的资源.h:
#ifndef RESOURCES_H
#define RESOURCES_H
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif
#define IDI_CSICO 101
#define IDB_CSBITMAP 201
#endif // RESOURCES_H
还有我的 resources.rc:
#include <windows.h>
#include "resources.h"
IDI_CSICO ICON "CS-Nursing.ico"
IDB_CSBITMAP BITMAP DISCARDABLE "CS-Nursing.bmp"
如果有必要,我在 WindowsXP SP3 上使用 Code::Blocks 12.11。 任何帮助将不胜感激。
【问题讨论】:
-
这是在 DLL 还是 EXE 中? DLL 需要在 dll 加载时缓存 HINSTANCE,以便对 LoadBitmap (et.al.) 的调用转到 DLL 的资源,而不是调用 EXE 的资源。
-
您是否使用资源查看器/编辑器验证您的位图实际上已被编译到可执行文件中?
-
还要确保您的位图有效。许多工具会生成带有无效位图标题的位图。在 MS Paint 中打开位图并再次保存。
-
这是一个EXE,正在编译:windres.exe -J rc -O coff -i C:\DOCUME~1\ADMINI~1\MYDOCU~1\CS-NUR~1\ RESOUR~1.RC -o obj\Debug\resources.res mingw32-g++.exe -o bin\Debug\CS-Nursing.exe obj\Debug\main.o obj\Debug\resources.res -lgdi32 -luser32 -lkernel32 -lcomctl32 输出大小为 758.79 KB 我必须检查位图的有效性。
-
用MS Paint打开位图,再次保存,还是没有加载。