Fragen zu CPictureButton und CPicture

anmae

Erfahrenes Mitglied
Hallo,

ich muß nochmal mit ein paar newbie Fragen nerven.

1. Ich habe folgenden Code um einem Button ein Bild zuzuweisen:
Code:
 	CPicture pic;
                pic.Load("icon_03.bmp");
	CRect buttonRect;
	CWnd *t= GetDlgItem(IDC_BUTTON_NEWGROUP);
	t->GetWindowRect(buttonRect);
	t->ScreenToClient(buttonRect);

	buttonRect.left=0;
	buttonRect.top=0;
	buttonRect.right = pic.m_Width;
	buttonRect.bottom = pic.m_Height;


	CDC *dcp= new CClientDC(t);
	pic.Show(dcp,buttonRect);
Wenn ich diesen Code in einer Funktion aufrufe bei welcher das Fenster schon existiert (z.B. in OnMouseMove()) dann funktioniert sie. In OnPrecreateWindow oder einer ähnlichen passiert rein gar nichts.
Wo muß der Code hin damit das Bild gleich am Start zugewiesen wird?

2.
Ich möchte einem Button mehrere Bilder zuweisen. Dazu habe ich dem Button eine CPictureButton Klasse gegeben.
Warum geht das nicht so:
Code:
mc_BigViewButton.LoadBitmaps(IDB_ARROW_LEFT,IDB_ARROW_RIGHT,NULL,NULL);

Danke schonmal
Andres
 
Zuletzt bearbeitet:
Arbeitest du tatsächlich mit der MFC? Die Klassen "CPicture" und "CPictureButton" sind mir nämlich gänzlich unbekannt. :confused:

Ich vermute es handelt sich um einen Dialog. Dann ist die Bildzuweisung am besten in "OnInitDialog()" aufgehoben (Message Handler für WM_INITDIALOG).
 
Ops, ich hab grad gesehen die klasse hieß CBitmapButton.
CPicture ist eine Klasse die hier im Forum öfters herunter geladen werden kann.

in der OnInit hatte ich es auch schon versucht -- nichts.

Liegt das vielleicht an etwas anderem?
 
Zuletzt bearbeitet:
zu 1.
Das Codebeispiel funktioniert so nicht, da deine Zeichnung wieder durch die Standardzeichenroutine überschrieben wird. Um diesen Weg zu gehen, müsstest du eine eigene CButton-Klasse ableiten, im Dialog-Designer für den Button die Option "Besitzerzeichnung" auswählen und dann die Methode "DrawItem()" überschreiben.

Um ein Bild auf einen Button zu plazieren gibt es aber einfachere Wege. Wähle im Dialog-Designer die Option "Bitmap" für den Button. Dann kannst du mit folgenden Code ein Bild hinterlegen:

Code:
// in "OnInitDialog()" einfügen

HBITMAP hbm = (HBITMAP)::LoadImage( NULL,
                                    _T("icon_03.bmp"),
                                    IMAGE_BITMAP,
                                    0,
                                    0,
                                    LR_LOADFROMFILE | LR_CREATEDIBSECTION );

if( hbm )
{
    ((CButton *)GetDlgItem(IDC_BUTTON_NEWGROUP))->SetBitmap(hbm);
}

zu 2.
Die Verwendung der Klasse CBitmapButton ist leider etwas tricky, hier mal der Weg dazu:

  • Gib deinen Button den Titel MYBUTTON und wähle für ihn die Option "Besitzerzeichung".
  • Gib Deinen Bitmaps die IDs "MYBUTTONU" (für Up) und "MYBUTTOND" (für Down).
    Ganz wichtig, gib die IDs mit den Ausführungszeichen rechts und links ein!
  • Lege eine Member-Variable 'CBitmapButton m_btnBitmap' o.ä. an.
    Achtung, nicht über den Klassenassistenten mit der ID des Buttons verknüpfen!
  • Nun kannst du (ebenfalls in OnInitDialog) die Bitmaps wie folgt zuweisen:
Code:
m_btnBitmap.AutoLoad(IDC_BUTTON_BITMAP, this);
 
cool, danke

zu 2. bekomme ich jedoch einen Assert.

Mein Button ist der IDOK, sollte aber nicht tragisch sein !?
 
Hast du dem Button mit Hilfe des Klassenassistenten eine Member-Variable zugewiesen? Das bitte nicht tun!
Es ist egal, welchen Button du nimmst, IDOK geht natürlich auch.
 
ja das hatte ich

geht aber immer noch nicht.
Assert kommt an folgender Stelle:

// must have at least the first bitmap loaded before calling DrawItem
ASSERT(m_bitmap.m_hObject != NULL); // required
habe ein "IDOKU" und ein "IDOKD"
ist die Farbtiefe wichtig? - sind 24bit

mein Aufruf sieht so aus:

mc_BigViewButton.AutoLoad(IDOK, this);

CDialog::OnInitDialog();
 
Farbtiefe ist egal. Lies nochmal meine Anleitung: Der Button muss ein einen Titel oder Text, wie z.B. MEINOKBUTTON bekommen und die Bitmaps müssen dann "MEINOKBUTTONU" und "MEINOKBUTTOND" heißen. Die IDs der Bitmaps werden NICHT von der ID des Buttons abgeleitet!!
 
Zurück