Button mit Hintergrundbild ohne SendMessage
-
hi.
ich wollte gern meinen button mit einem bitmap versehen,
allerdings hab ich das handicap, dass es mit SendMessage(hWndButton,...)
nicht geht.kennt ihr noch eine andere möglichkeit?
-
Nein. Das funktioniert aber auch ganz prima mit SendMessage. Du hast also noch was falsch gemacht. Da ich aber nicht Hellsehen kann ...
-
nein ich hab nix falsch gemacht.
meine api unterstützt nur kein BS_BITMAP das ist alles.
-
Jetzt lass Dir doch nicht alles einzeln aus der Nase ziehen. Windows CE, oder was? Dann:
Note Windows CE does not support the BS_BITMAP, BS_FLAT, BS_ICON, BS_PUSHBOX, BS_TEXT, or BS_USERBUTTON styles. Use the BS_OWNERDRAW style to create the effects that you would achieve otherwise by using the BS_BITMAP, BS_ICON, or BS_USERBUTTON button styles
-
ja ce.
das hab ich jetzt gerade auch gefunden aber da kommt das nächste prob.
SendMessage(hwndbut,BM_SETIMAGE,(WPARAM) IMAGE_BITMAP,(LPARAM)(HANDLE)hBitmap);ce kennt auch net BM_SETIMAGE.
haste noch ne idee?
-
BS_OWNERDRAW
Das steht da aber schon!
-
Warum haben die diese Sachen eigentlich unter CE nicht? Das ist ja wirklich dumm.
-
wo eigentlich ne buttonmessage hinkommt kann ich ein buttonstyle hinsetzen?
naja ich habs mal versucht
SendMessage(hwndbut,BS_OWNERDRAW,(WPARAM) IMAGE_BITMAP,(LPARAM)(HANDLE)hBitmap);der compiler meckert zwar net mehr allerdings ist jetzt der ganze button wech.
-
BS_ ist ein Style und keine Message
-
hwndbut = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_OWNERDRAW ,13, 42, 100, 50, hWnd, (HMENU) but1,hInstance, NULL);
hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
if(hBitmap == NULL)
{
MessageBox(hWnd,L"Das Buttonbild konnte nicht geladen werden!",L"NACHRICHT",MB_OK);
}SendMessage( hwndbut, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)(HANDLE) hBitmap );
so hier is jetzt der quelltext.
und meine frage ist jetzt warum will der compiler net das machen was ich will?
-
STM_SETIMAGE
zeichne das bitmap selbst auf den button
-
Hallo.
STM_SETIMAGE ist für Statics, das sind Steuerelemente, die nur Text oder Bitmaps anzeigen, für Beschriftungen. Man kann sie aber nicht anklicken!Dir scheint nicht klar zu sein, was BS_OWNERDRAW bedeutet. Ein Ownerdraw Button zeichnet nichts, deshalb siehst Du auch nichts. Er sendet nur eine WM_DRAWITEM Nachricht an sein Elternfenster. Das übernimmt die Darstellung des Buttons. Anders ausgedrückt: Du mußt den Button selbst zeichnen, Bild und Rahmen, wie Jim schon sagte.
Beispiel, nicht unter Windows CE getestet:
HBITMAP hBmp = LoadImage(hInst, MAKEINTRESOURCE(IDB_BKGND2), IMAGE_BITMAP, 16, 16, LR_LOADMAP3DCOLORS); ... void DrawButton(UINT idCtl, LPDRAWITEMSTRUCT di) { RECT rc; if ((di->itemAction & ODA_DRAWENTIRE) || (di->itemAction & ODA_SELECT)) { GetClientRect(di->hwndItem, &rc); DrawFrameControl(di->hDC, &rc, DFC_BUTTON, ((di->itemState & ODS_SELECTED) ? DFCS_PUSHED : 0) | DFCS_BUTTONPUSH | DFCS_ADJUSTRECT); if (di->itemState & ODS_SELECTED) { rc.top++; rc.left++; } DrawState(di->hDC, NULL, NULL, (DWORD)hBmp, 0L, rc.top, rc.left, 0, 0, DST_BITMAP); } } LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch (msg) { case WM_DRAWITEM: DrawButton((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); return 0; case WM_COMMAND: ... }