Od paru dni siedzę i kombinuję jak tu stworzyć Button z grafiką i tekstem. Przekopałem MSDN i stworzyłem takie coś:
#include "stdafx.h"
#include "asd.h"
#include "Commctrl.h"
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND guzik;
HBITMAP obraz,maska;
HIMAGELIST lista;
BUTTON_IMAGELIST bi;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
obraz = (HBITMAP)LoadImage(NULL, "c:\\plik.bmp", IMAGE_BITMAP, 32, 32, LR_LOADFROMFILE);
maska = (HBITMAP)LoadImage(NULL, "c:\\maska.bmp", IMAGE_BITMAP, 32, 32, LR_LOADFROMFILE);
//WYPEŁNIANIE STRUKTURY
WNDCLASSEX wc;
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_BACKGROUND);
wc.lpszMenuName = NULL;
wc.lpszClassName = NazwaKlasy;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//REJESTROWANIE KLASY OKNA
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Rejestracja okna nie powiodla sie.", "Error", MB_ICONEXCLAMATION | MB_OK);
return 1;
}
//TWORZENIE OKNA
HWND hwnd;
hwnd = CreateWindowEx(0, NazwaKlasy, "Okienko", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, NULL, NULL, hInstance, NULL);
if(hwnd==NULL)
{
MessageBox(NULL, "Okno sie nie pojawilo.", "Error", MB_ICONEXCLAMATION);
return 1;
}
guzik = CreateWindowEx(0, "BUTTON", "Guzik", WS_CHILD | WS_VISIBLE, 150, 150, 150, 30, hwnd, NULL, hInstance, NULL);
lista=ImageList_Create(32,32,ILC_MASK | ILC_COLOR24,1,0);
if(!lista)
{
MessageBox(hwnd,"Blad z tworzeniem listy.","asd",MB_ICONINFORMATION);
}
ImageList_Add(lista,obraz,maska);
bi.himl = lista;
bi.uAlign = BUTTON_IMAGELIST_ALIGN_LEFT;
bi.margin.top = 3;
bi.margin.bottom = 3;
bi.margin.left = 3;
bi.margin.right = 3;
Button_SetImageList(guzik,lista);
DeleteObject(obraz);
DeleteObject(maska);
ShowWindow(hwnd, nCmdShow); //Pokaż okienko...
UpdateWindow(hwnd);
//Pętla komunikatów
while(GetMessage(&Komunikat, NULL, 0, 0))
{
TranslateMessage(&Komunikat);
DispatchMessage(&Komunikat);
}
return Komunikat.wParam;
}
//OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
Używam MS Visual Studio 2005.
Podpowie mi ktoś gdzie jest błąd? Bo kod kompiluje mi się bez błędów, a na guziku grafiki jak nie było tak nie ma :/
Próbowałem też po prostu wysyłać do przycisku komunikat BM_SETIMAGE, ale nie udało mi się uzyskać jednocześnie i tekstu i grafiki. W komentarzu na MSDN piszą nawet, że na Windows XP to niemożliwe.
Jest jakiś prostszy sposób niż tworzenie własnej kontrolki? :-/