button mit Image
-
wie setze ich ein Image/Icon auf ein Button (natürlich ohne MFC)
-
da gibts verschiedene möglichkeiten.
entweder den entsprechenden button-style flag setzen und die entspreche nachricht an den button senden
oder owner-drawing.für beide wege findest du die entsprechenden funktionen und flags in der MSDN
grüße
-
Auszug aus MSDN:
The appearance of text or an icon or both on a button control depends on the BS_ICON and BS_BITMAP styles, and whether the BM_SETIMAGE message is called. The possible results are as follows...
siehe "Button Styles" http://msdn2.microsoft.com/en-us/library/bb775951.aspxMartin
-
Das Problem ist Windows CE BS_BITMAP nicht unterstützt.
Ich habe folgendes probiert, aber es zeigt bitmap nicht an:hBmp = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1));
SendMessage(GetDlgItem(hDlg,IDC_BUTTON_DOWN), BS_OWNERDRAW, IMAGE_BITMAP, (LPARAM)hBmp);
-
WinCE unterstützt prinzipbedingt nur eine Untermenge an Funktionen des Windows.
ACHTUNG! BS_OWNERDRAW ist ein Stil beim Erzeugen des Buttons, und somit nicht geeignet als Nachricht per SendMessage()!!!
Mit dem Stil BS_OWNERDRAW kannst Du einen Button erstellen, den Du selbst zeichnen mußt.
D.h. anstatt die Default-Buttons von Windows zeichnen zu lassen, bekommst Du WM_DRAWITEM Nachrichten, wo Du daraufhin z.B. ein Bitmap mit BitBlt() in den Button zeichnen kannst.
Suche hier im Forum oder mit Google nach diesen Begriffen, Lösungen hierzu gibts zuhauf.
Martin
-
Danke, ich kann jetzt image zu dem Button laden aber wenn ich auf dem button drücke , verschwindet das Bild des button. Es erscheint dann nur der Text.
case WM_DRAWITEM: { HBITMAP hBmp; hBmp = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1)); DrawButtonBitmap(hDlg,lParam,IDC_BUTTON_DOWN,hBmp); } void DrawButtonBitmap(HWND hWnd,LPARAM lParam,int ButtonID,HBITMAP hBmp) { LPDRAWITEMSTRUCT lpdis; PAINTSTRUCT ps; HBITMAP hbmOld; HDC hDC; hDC = BeginPaint(GetDlgItem(hWnd,ButtonID), &ps); lpdis = (LPDRAWITEMSTRUCT) lParam; BITMAP bm; HDC hdcMem = CreateCompatibleDC(hDC); hbmOld = (HBITMAP) SelectObject(hdcMem, hBmp); GetObject(hBmp, sizeof(bm), &bm); BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteDC(hDC); EndPaint(GetDlgItem(hWnd,ButtonID), &ps); }
-
Hmmm, das Prinzip hast Du schon richtig verstanden

ABER: Also ich weiß nicht, ob das Funktionsgespann BeginPaint() und EndPaint() auf die Nachricht WM_DRAWITEM anwendbar ist.

Soviel ichs weiß wird dieses Gespann eigentlich nur für WM_PAINT benötigt, kann mich dabei aber irren. <- an die anderen Forumleser, bitte meine Meinung bestätigen oder korrigieren.Guck Dir mal das an, dort ist es eigentlich genau erklärt wie's geht: http://www.c-plusplus.net/forum/viewtopic-var-t-is-194426-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-wmdrawitem.html
Danach ist Dein Button sogar in der Lage sowohl für den Ruhezustand als auch für den gedrückten Zustand jeweils unterschiedliche Bitmaps einzunehmen.Martin
-
schau dir mal die WM_DRAWITEM message in der MSDN an. du bekommst per lParam eine struktur, die dir den HDC bereits gibt, sowie der status, in dem sich der button befindet.
damit kannst du dann dynamisch reagieren und entsprechend zeichnen. ansonsten: windows grundlagen aneignen!
-
Danke !
