Unkompliziertester Weg, einen Button mittels Bitmap darzustellen
-
Hallo zusammen,
Kann mir jemand sagen, wie ich es so schnell und unkompliziert wie möglich bewerkstelligen kann, dass mein Button einzig und allein durch eine Bitmap dargestellt wird, sprich ohne die vom Systemdesign abhängig zu sein?
Vielen Dank schon mal im Voraus,
veryxRV
-
------------------------------------------------------------------------------------------------------- +-------------------+ | Bitmap einbinden: | +-------------------+ _____________________ Definierte Variablen: static HANDLE hBitmap; static HWND hButton; _____________________ Einbinden der Bitmap: case WM_CREATE: hBitmap = LoadImage (GetModuleHandle (NULL), "bitmap1.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE); hButton = CreateWindow ("Button", "", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_BITMAP, 20, 20, 50, 30, hWnd1, 0, GetModuleHandle (NULL), 0); SendMessage (hButton, BM_SETIMAGE, (WPARAM) IMAGE_BITMAP, (LPARAM)(HANDLE) hBitmap); DeleteObject (hBitmap); return 0; -------------------------------------------------------------------------------------------------------
-
Danke, aber das Problem bei der Sache ist nur, dass der dösige 3D Rahmen weiterhin dargestellt wird.
-
Dann BS_FLAT noch hinzufügen.
-
Das erzeugt leider auch einen dicken schwarzen Ramen um den Button.
-
LPDRAWITEMSTRUCT lpdis; static HDC hdcMem; . . . case WM_CREATE: hButton = CreateWindow ("Button", "", WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 20, 20, 50, 30, hWnd1, (HMENU) ID_BUTTON, GetModuleHandle (NULL), 0); return 0; case WM_DRAWITEM: lpdis = (LPDRAWITEMSTRUCT) lParam; hdcMem = CreateCompatibleDC (lpdis->hDC); if (lpdis->CtlID == ID_BUTTON) SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap1.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE)); StretchBlt (lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right - lpdis->rcItem.left, lpdis->rcItem.bottom - lpdis->rcItem.top, hdcMem, 0, 0, 20, 20, SRCCOPY); DeleteDC (hdcMem); return 0; . . .
-
Alles klar

EDIT: Was ich noch vergessen hatte zu erwähnen, ist, dass ich es möglichst übersichtlich auf alle Buttons in meinem Prgramm anwenden können sollte.
-
Um mehrere Button zu "verwalten, füge einfach noch ein paar hiervon hinzu:
if (lpdis->CtlID == ID_BUTTON) SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap1.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE));einfach ID_BUTTON und "bitmap1.bmp" ersetzen.
-
Die Buttons sollten dafür aber ownderdrawn sein oder?
EDIT: Steht ja da. Danke

-
SelectObject(hdcMem, LoadImage (hInst, (LPCSTR) IDB_BTT_ADD_N, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE));Hier bekomme ich leider eine Zugriffsverletzung....
-
Vergiß auch ned das Handle, was LoadImage zurückgibt, mit DeleteObject wieder freizugeben.
-
Hallo tenchou,
entschuldige diese vielleicht etwas unangenehme Frage, aber wie alt bist du? Manche Leute in diesem Forum stellen die Vermutung an, dass sich dein Alter im Bereich 15-7 Jahre bewegt. Ist das wahr?
-
CodeOriginator schrieb:
Hallo tenchou,
entschuldige diese vielleicht etwas unangenehme Frage, aber wie alt bist du? Manche Leute in diesem Forum stellen die Vermutung an, dass sich dein Alter im Bereich 15-7 Jahre bewegt. Ist das wahr?
Was hat das denn mit seiner Frage oder mit WinAPI zu tun??! Aber ich kann dich beruhigen, mein Alter bewegt sich nicht im Bereich 15-7 Jahre!!!
-
Verstehe gerade auch nicht was das soll, aber okay. Der Code läuft jedenfalls gut.
-
wenn du zum Beispiel das hier machst (in WM_DRAWITEM):
if (lpdis->itemState & ODS_SELECTED) { if (lpdis->CtlID == ID_BUTTON) SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap_sel.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE)); } else { if (lpdis->CtlID == ID_BUTTON) SelectObject (hdcMem, LoadImage (GetModuleHandle (NULL), "bitmap.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE)); }kannst du auch noch verschiedene Bilder für einen Button einstellen, wenn dieser gerade gedrückt wird. Also 2 Bilder: 1 wenn der Buton gedrückt wurde und 1 wenn irgend etwas anderes mit dem Button ist.
-
Danke für den Tip, das wäre der nächste Schritt gewesen

-
Dachte ich mir schon und deshalb habe ich das einfach mal vorausschauend gepostet
