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).

ここに私の resources.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 を使用します。どんな助けでも大歓迎です。

4

2 に答える 2

1

ビットマップ リソースの場所を指定していないため、LoadBitmap が失敗している可能性があります。LoadBitmap の最初のパラメータは、ビットマップ リソースを含むモジュールのインスタンスへのハンドルです (システム ビットマップをロードしている場合は NULL です)。ビットマップ リソースはアプリケーションにコンパイルされるため、LoadBitmap を呼び出すときに、最初のパラメータとしてアプリケーション モジュールのインスタンスにハンドルを渡す必要があります。このハンドルは、WinMain 関数の最初のパラメーターから取得できます。多くの人は、このパラメーターをグローバル変数に格納して、他の関数から簡単にアクセスできるようにします。LoadBitmap の呼び出しがまだ失敗する場合は、GetLastError を呼び出して、呼び出しが失敗した理由を説明するコードを取得する必要があります。Windows システム エラー コードを参照してください。

于 2013-09-10T06:08:49.717 に答える