Dr. Erhard
Henkes
- C++ und MFC (Stand:
28.05.2006)
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.