2

我有这个代码来加载位图:

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

还有我的资源.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。任何帮助都感激不尽。

4

2 回答 2

1

LoadBitmap 可能会失败,因为您没有告诉它在哪里可以找到位图资源。LoadBitmap 的第一个参数是包含位图资源的模块实例的句柄(除非您正在加载系统位图,在这种情况下它为 NULL)。由于位图资源正在编译到您的应用程序中,因此您需要在调用 LoadBitmap 时将句柄作为第一个参数传递给应用程序模块的实例。您可以从 WinMain 函数中的第一个参数获取此句柄。许多人将此参数存储在全局变量中,以便可以从其他函数轻松访问它。如果对 LoadBitmap 的调用仍然失败,那么您应该调用 GetLastError 来获取描述调用失败原因的代码。请参阅Windows 系统错误代码

于 2013-09-10T06:08:49.717 回答
0

更改了 resources.rc 文件:

//IDB_CSBITMAP BITMAP DISCARDABLE "CS-Nursing.bmp"
IDB_CSBITMAP BITMAP "CS-Nursing.bmp"

现在它完美运行,将其标记为已解决,谢谢大家的帮助。

于 2013-09-10T17:19:47.983 回答