2013-09-09 3 views
2

Я получил этот код для загрузки растрового изображения:Win32 Bitmap не будет загружать

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" 

Если это необходимо, я использую Code :: Blocks 12.11 на WindowsXP SP3. Любая помощь будет высоко оценена.

+3

Это в DLL или EXE? DLL необходимо кэшировать HINSTANCE для загрузки DLL, чтобы вызовы LoadBitmap (et.al.) переходили на ресурсы DLL, а не на вызывающие EXE. –

+0

Вы проверили с помощью средства просмотра ресурсов/редактора, что ваш растровый файл, по сути, скомпилирован в ваш исполняемый файл? –

+1

Также убедитесь, что ваше растровое изображение действительно. Многие инструменты производят растровые изображения с недопустимыми заголовками растровых изображений. Откройте растровое изображение в MS Paint и сохраните его снова. – IInspectable

ответ

1

LoadBitmap, вероятно, не работает, потому что вы не сказали ему, где найти растровый ресурс. Первым параметром LoadBitmap является дескриптор экземпляра модуля, содержащего ресурс растрового изображения (если вы не загружаете системное растровое изображение, в этом случае оно равно NULL). Поскольку битмап-ресурс компилируется в ваше приложение, вам необходимо передать дескриптор экземпляра вашего прикладного модуля в качестве первого параметра при вызове LoadBitmap. Вы можете получить этот дескриптор из первого параметра в вашей функции WinMain. Многие люди хранят этот параметр в глобальной переменной, так что к нему можно легко получить доступ к другим функциям. Если вызов LoadBitmap все еще сбой, вы должны вызвать GetLastError, чтобы получить код, описывающий, почему вызов завершился неудачно. См. Windows System Error Codes.

+0

Добавлен "HINSTANCE hRegisInstance;" как глобальный и «hRegisInstance = (HINSTANCE) GetWindowLong (hRegWnd, GWL_HINSTANCE); //« reg_hbmCS = LoadBitmap (hRegisInstance, MAKEINTRESOURCE (IDB_CSBITMAP)); »но все равно не загружает его, я буду искать GetLastError – vitimiti

+0

Извините для задержки я добавил функцию для GetLastError(), и я получаю сообщение «Нет сообщения об ошибке», что означало бы сообщение об ошибке «0», каждое мгновение с начала программы до конца – vitimiti

+0

Вы должны вызвать GetWindowLongPtr вместо GetWindowLong, потому что на 64-битных версиях Windows GWL_HINSTANCE может быть больше, чем длинный.Когда GetLastError возвращает ноль, это не означает, что с момента запуска программы не произошло никаких ошибок, это означает, что последняя функция Windows API, которая установила код ошибки, установила ее в ноль. Поэтому, когда вам нужно вызвать GetLastError, чтобы узнать, почему вызов функции был неудачным, вы должны быть уверены, что не вызываете каких-либо функций Windows API, прежде чем вызывать GetLastError (по крайней мере, не тот, который устанавливает код ошибки). – Stuart

0

Измененный файл resources.rc:

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

Теперь он отлично работает, будет помечать решенной, спасибо всем за вашу помощь.

Смежные вопросы