Dr. Erhard Henkes - C++ und MFC   (Stand: 28.05.2006)
 

Zurück zum Inhaltsverzeichnis

Zurück zum vorherigen Kapitel
 

Kapitel 14 - Buttons mit Bildern

Wenn man Schaltflächen (Buttons) z.B. in einer Dialog-Ressource erstellt, haben diese eine Beschriftung, die man im Ressourceneditor voreinstellen und im Programm mittels der Methode CButton::SetWindowText( LPCTSTR ) verändern kann. Man besorgt sich eine Membervariable vom Typ CButton und übergibt einfach den passenden String. Entwerfen Sie eine einfache dialogbasierende Anwendung mit einem einzigen Button. Erstellen Sie die Membervariable m_ctlButton vom Typ CButton und legen Sie auf den Button folgende Funktion:

CButton m_ctlButton; //mittels Assistent

//...

void CTestDlg::OnButton1()
{
    m_ctlButton.SetWindowText( "HALLO" );
}
 

Manchmal möchte man nicht nur Beschriftungen, sondern auch grafische Symbole (Icons) oder Bilder (Bitmaps) auf Schaltflächen darstellen und diese im Programm verändern. Hierzu gibt es mehrere Möglichkeiten.

Die einfachste Variante besteht im Einsatz von Icons oder Bitmaps. Nehmen wir das vorstehende Beispiel. Verändern Sie den Code in der Funktion wie folgt:

//mittels Assistent:
CButton m_ctlButton;
HICON m_Icon;
//...

void CTestDlg::OnButton1()
{
    m_Icon = AfxGetApp()->LoadIcon( IDR_MAINFRAME );
    m_ctlButton.SetIcon( m_Icon );
}

Dieser Code funktioniert nur, wenn Sie im Ressourceneditor für die Schaltfläche unter "Eigenschaften - Formate" das Symbol-Flag (BS_ICON) aktivieren:

Entsprechend können wir auch ein Bitmap ( fügen Sie bitte ein neues Bitmap als Ressource IDB_BITMAP1 ein ) auf die Schaltfläche zaubern:

//mittels Assistent:
CButton m_ctlButton;
CBitmap m_Bitmap;
//...

void CTestDlg::OnButton1()
{
    m_Bitmap.LoadBitmap( IDB_BITMAP1 );
    m_ctlButton.SetBitmap( m_Bitmap );
}

Hier muß für die Schaltfläche unter "Eigenschaften - Formate" das Bitmap-Flag (BS_BITMAP) aktiviert werden (siehe Abbildung oben).

Wie kann man nun die drei Möglichkeiten Text, Icon, Bitmap direkt vom Programm steuern?
Hier folgt ein einfaches Beispiel zur Demonstration:

void CTestDlg::OnButton1()
{
     m_ctlButton.ModifyStyle( BS_ICON | BS_BITMAP, NULL );
     m_ctlButton.SetWindowText( "HALLO" );

     Sleep(1000);
 
     m_Icon = AfxGetApp()->LoadIcon( IDR_MAINFRAME );
     m_ctlButton.ModifyStyle( BS_BITMAP, BS_ICON );
     m_ctlButton.SetIcon( m_Icon );
     m_ctlButton.UpdateWindow(); //Neuzeichnen ist hier notwendig
 
     Sleep(1000);
 
     m_Bitmap.LoadBitmap( IDB_BITMAP1 );
     m_ctlButton.ModifyStyle( BS_ICON, BS_BITMAP );
     m_ctlButton.SetBitmap( m_Bitmap );
}

Die Funktion BOOL CWnd::ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 ) schaltet hier zwischen den verschiedenen Formaten um. Die Funktion void CButton::SetButtonStyle( UINT nStyle, BOOL bRedraw = TRUE ) erledigt diese Aufgabe übrigens nicht! Die letztere Funktion dient dazu, die Erscheinungsform des Buttons zu verändern. Folgende BS_... sind möglich:

BS_AUTOCHECKBOX
BS_AUTORADIOBUTTON
BS_AUTO3STATE
BS_CHECKBOX
BS_RADIOBUTTON
BS_3STATE
BS_DEFPUSHBUTTON
BS_PUSHBUTTON
BS_GROUPBOX
BS_LEFTTEXT
BS_OWNERDRAW
 

Wir testen dies in unserem Beispiel, indem wir im dritten Schritt nicht nur mit CWnd::ModifyStyle(...) auf Bitmap, sondern zusätzlich mit CButton::SetButtonStyle(...) auf Checkbox umschalten. Ergänzen Sie folgende Code-Zeile:

void CTestDlg::OnButton1()
{
 ...
 m_Bitmap.LoadBitmap( IDB_BITMAP1 );
 m_ctlButton.SetButtonStyle( BS_CHECKBOX );
 m_ctlButton.ModifyStyle( BS_ICON, BS_BITMAP );
 m_ctlButton.SetBitmap( m_Bitmap );
}
 
 
Empfehlenswert für Buttons mit Bilder und Text ist übrigens die Klasse FooButton.
 
 

Hier geht's weiter Zum Nächsten Kapitel

Zurück zum Inhaltsverzeichnis