CButton::SetBitmap() funktioniert nicht...

Quick_Mik

Mitglied
Hallo Leute,

ich würde gerne auf einem Button ein Bitmap anzeigen.

Leider funktioniert weder
Code:
	HBITMAP handle;
	CBitmap bmBerechnen;
	bmBerechnen.LoadBitmap(IDB_BERECHNEN);
	handle = (HBITMAP)bmBerechnen.GetSafeHandle();
	m_BBerechnen.SetBitmap(handle);

noch dasBeispiel aus der MSDN

Code:
m_BBerechnen.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(IDB_BERECHNEN)));

Der Button bleibt einfach ohne irgendwas. In der Create() Methode des Buttons ist als Style BS_BITMAP mit angegeben, also sollte das ganze doch funktionieren...

Jemand ne Idee, woran das liegen könnte?

Gruß

M.
 
Hi,

ich habe erst mein Bitmap als Ressource importiert und dann so auf dem Button angezeigt:

Code:
// evtl bereits in Variable gespeichertes Bild löschen
m_Bitmap.DeleteObject();
 
// Bild in Variable speichern
m_Bitmap.LoadBitmap(IDB_BITMAP1);
 
// Bild auf dem Button anzeigen
m_ctlButton1.SetBitmap(m_Bitmap);
 
Die anzuzeigende Bitmap ist auch importiert. Leider bekomme ich es nicht hin, dass diese auch angezeigt wird. :(
Wenn ich die Bitmap zu nerm Icon konvertiere, dieses importiere und mit SetIcon() auf den Button bringe funktioniert alle; vorausgesetzt ich passe den Stil des Button vorher auf Icon an.

Aber ein quadratisches Icon auf einem rechteckigen Button sieht nicht gerade prickelnd aus ;-]

Ich vergaß oben zu erwähnen, dass der Button auf einem untergeordneten Dialogfeld sitzt, welches auf Klick des Anwenders an den Kontext eines Picture Controls übergeben und dort angezeigt wird. Der Dialog al solches wird bereits vorher kreiert, CDialog::OnInitDialog() wird selbstverständlich aufgerufen.

Hoffentlich hat jemand noch ne Idee...

Gruß

M.
 
Kann ich mir nicht vorstellen. OWNERDRAW braucht man doch nur, wenn mann den kompletten Button selbst gestalten will.

Die MSDN bzw. das Beispiel darin verlangt es zumindest nicht, und wenn Du über den Assistenten gehst, dann schließt OWNERDRAW BS_BITMAP und BS_ICON aus, so dass man alle händisch machen müsste...

Gruß

M.
 
@Squeegee:
Bei Verwendung des Styles BS_BITMAP ist BS_OWNERDRAW nicht erforderlich. Der von dir gepostete MDSN-Auszug bezieht sich auf ein anderes Verfahren zur Erstellung von Bitmap-Buttons.

@Quick_Mik:
Bei deiner ersten Codevariante musst du darauf achten, dass das CBitmap-Objekt die gleiche Lebenszeit, wie auch der Button hat (also als Member des Dialogs). Zumindest bei dem von dir geposteten Code ist das Objekt nach dem Durchlaufen der Funktion wieder weg und wird damit natürlich nicht angezeigt.

Die zweite Codevariante erfordert ein Instancehandle; NULL funktioniert hier nicht. Außerdem solltest du das erhaltene HBITMAP in einer Member-Variable merken, damit du es am Ende wieder löschen kannst. Ansonsten gibt's ein GDI-Memory Leak.
Code:
// im Header des Dialogs
HBITMAP m_hbm;

// Bitmap zuweisen
m_hbm = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BERECHNEN));
m_BBerechnen.SetBitmap(m_hbm);

// Bitmap löschen (im Destruktor oder bei DestroyWindow)
::DeleteObject(m_hbm):

Gruß
MCoder
 
Hallo MCoder,
huch, gibts da verschiedene Verfahren? Ich kenne nur eine:
Erstellen eines BitmapButtons, dann Create() und Bilderchens zufügen...
Also so wie ich das mit der MSDN teilweise ja auch gepostet habe.

Wie geht den die andere Methode?

Grüße Squeegee
 
@Squeegee:
Mal abgesehen von einem vollständig selbst gezeichneten Button kenne ich noch 2 Varianten:

1. Ein Standardbutton bekommt den Style BS_BITMAP oder BS_ICON und das Bildchen wird entsprechend mit SetBitmap() oder SetIcon() zugewiesen. Das ist die Variante, mit der Quick_Mik gerade etwas kämpft.

2. Man kann die MFC-Klasse CBitmapButton verwenden. Die Anwendung ist aufwendiger und etwas tricky, aber man kann das komplette Buttonlayout, auch in Abhängigkeit von verschiedenen Zuständen, kontrollieren. Hierfür ist der Style BS_OWNERDRAW zwingend notwendig. Ich denke, aus dem Umfeld stammt das von dir verwendete MSDN-Zitat.


Gruß
MCoder
 
@MCoder:
Methode 1 kannte ich nicht, schon wieder was gelernt *g*
Dann war das was ich sagte natürlich falsch.

Danke dir
Gruß Squeegee
 
Zurück