2013-08-11 6 views
0

Я пытаюсь закодировать GUI простой программы с чистым Windows API в C. Мне не удается показать изображение на картинке. Изображение находится на ресурсе. Код таков:Как показать изображение на PictureBox из ресурса?

#include <Windows.h> 
#include "resource.h" 
#define IDC_MAIN_BUTTON 101 
const char g_szClassName[] = "myWindowClass"; 
HBITMAP hBitmap = NULL; 


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
HWND hWndButton; 
char *idb="IDB_BITMAP1"; 
switch(msg) 
{ 
case WM_CREATE: 
    hBitmap = (HBITMAP)LoadImage(hInstance,MAKEINTRESOURCE(idb), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
     hWndButton=CreateWindowEx(NULL, 
    "BUTTON", 
    "Encrypt", 
    WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_FLAT, 
    150, 
    225, 
    100, 
    24, 
    hwnd, 
    (HMENU)IDC_MAIN_BUTTON, 
    GetModuleHandle(NULL), 
    NULL); 

    break; 
case WM_PAINT: 
    PAINTSTRUCT  ps; 
    HDC    hdc; 
    BITMAP   bitmap; 
    HDC    hdcMem; 
    HGDIOBJ   oldBitmap; 

    hdc = BeginPaint(hwnd, &ps); 

    hdcMem = CreateCompatibleDC(hdc); 
    oldBitmap = SelectObject(hdcMem, hBitmap); 

    GetObject(hBitmap, sizeof(bitmap), &bitmap); 
    BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); 

    SelectObject(hdcMem, oldBitmap); 
    DeleteDC(hdcMem); 

    EndPaint(hwnd, &ps); 
    break; 
    case WM_CLOSE: 
     DestroyWindow(hwnd); 
    break; 
    case WM_DESTROY: 
     DeleteObject(hBitmap); 
     PostQuitMessage(0); 
    break; 
    default: 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
} 
return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow) 
{ 
WNDCLASSEX wc; 
HWND hwnd; 
MSG Msg; 

wc.cbSize  = sizeof(WNDCLASSEX); 
wc.style   = 0; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance  = hInstance; 
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
wc.lpszMenuName = NULL; 
wc.lpszClassName = g_szClassName; 
wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 

if(!RegisterClassEx(&wc)) 
{ 
    MessageBox(NULL, "Window Registration Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

hwnd = CreateWindowEx(
    WS_EX_CLIENTEDGE, 
    g_szClassName, 
    "The title of my window", 
    WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 
    CW_USEDEFAULT, CW_USEDEFAULT, 450, 300, 
    NULL, NULL, hInstance, NULL); 

if(hwnd == NULL) 
{ 
    MessageBox(NULL, "Window Creation Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

ShowWindow(hwnd, nCmdShow); 
UpdateWindow(hwnd); 

while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 
} 

Кто-нибудь может помочь? Извините за мой английский

+0

Было бы полезно знать «, что проблемы "у вас есть, а не только гигантский блок кода. –

+0

Да, извините, компилятор дает мне ошибку в hInstance из LoadImage, он говорит, что это не указано или что-то вроде этого, я не могу проверить это, потому что в этот момент ide падает при загрузке проекта :( – user2673210

+0

Прочитайте документацию для ['MAKEINTRESOURCE'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648029.aspx). Кроме того, перед их использованием должны быть объявлены переменные. Где объявляется 'hInstance'? Также, чтение через [ 'LoadImage'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045.aspx), возможно, не такая уж плохая идея. Смешение' MAKEINTRESOURCE' с 'LR_LOADFROMFILE' очень креативное. – IInspectable

ответ

1

Если вы хотите использовать LR_LOADFROMFILE, вы должны указать имя файла BMP, а не ресурс. С помощью ressource попробуйте что-то подобное.

case WM_CREATE: 
{ 
    LPCREATESTRUCT pCreat = (LPCREATESTRUCT) lParam; 
    hBitmap = (HBITMAP) LoadBitmap(pCreat->hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); 
    or 
    hBitmap = (HBITMAP) LoadImage(pCreat->hInstance, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, 0); 
    [...] 
} 
break; 
0

Там нет "PictureBox" в Win32 API, но вы можете использовать "Static Control" и передать STM_SETIMAGE сообщение управления:

HWND staticimage1 = CreateWindowW(L"STATIC", L"This is Label", WS_CHILD | WS_VISIBLE | SS_BITMAP, 50, 50, 100, 100, hwnd, (HMENU) 12345, NULL, NULL); 
HBITMAP hbitmap = LoadImageW(NULL, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, 0); 

SendMessageW(staticimage1, STM_SETIMAGE, IMAGE_BITMAP, hbitmap); 
Смежные вопросы