Bitmap in Popup-Menü
-
Hallo.
ich habe folgenden code geschrieben, um meinen button in der toolbar ein kleins menü hinzuzufügen:
BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { //... CBitmap *MyBmp; MyBmp->LoadBitmap(IDB_TEST); CDC MyBmpDC; MyBmpDC.CreateCompatibleDC(NULL); MyBmpDC.SelectObject(MyBmp); CMenu men; men.CreatePopupMenu ( ); men.AppendMenu (MF_STRING, iItem, MyBmp); men.AppendMenu (MF_STRING, iItem, "Sample 1"); men.AppendMenu (MF_STRING, iItem, "Sample 2"); men.TrackPopupMenu( 0, pt.x, pt.y, this ); men.DestroyMenu ( ); }leider stürzt mein programm dabei immer ab, in der wingdi.cpp datei, in folgender funktion:
BOOL CGdiObject::Attach(HGDIOBJ hObject) { ASSERT(m_hObject == NULL); // only attach once, detach on destroy if (hObject == NULL) { return FALSE; } // remember early to avoid leak m_hObject = hObject; CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist ASSERT(pMap != NULL); pMap->SetPermanent(m_hObject, this); return TRUE; }1.) was muss an meinem code verändert werden, damit ich das bild im menü sehen kann?
2.) mit welcher memberfunktion kann ich abfragen, welches item gedrückt wurde (Sample 1, Sample 2 oder das bild)? konnte das leider nicht in der online MSDN-hilfe finden
DANKE.
STICK.
-
stick_thai schrieb:
[cpp]
BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
//...
*CBitmap MyBmp;
MyBmp->LoadBitmap(IDB_TEST); CDC MyBmpDC;
MyBmpDC.CreateCompatibleDC(NULL);
MyBmpDC.SelectObject(MyBmp);
}[/cpp]Den kursiven Teil kannst Du vergessen. Du brauchst keinen DC hier.
Du hast einen Zeiger auf eine Bitmap angelegt und diesen nicht initialisiert!
Es muss aber ein Objekt vorhanden sein, also:CBitmap bmpMy; bmpMy.LoadBitmap(IDB_TEST);
-
danke. funktioniert jetzt. es musste nur noch folgende zeile her:
men.AppendMenu (MF_STRING, iItem, &bmpMy);wie kann ich aber nun abfragen, welche der optionen im menue gedrueckt wurde?
DANKE.
STICK.
-
*stick_thai schrieb:
wie kann ich aber nun abfragen, welche der optionen im menue gedrueckt wurde?
Ich verstehe die Frage nicht. Das ist ein Menü!
Folgerichtig versendet es, wie jedes andere Menü WM_COMMAND Nachrichten für die Du ON_COMMAND Handler brauchst.
Du kannst natürlich auch TPM_RETURNCMD übergeben und damit direkt das Ergebnis bekommen.
Ich bevorzuge alerdings die Handler Methode, weil diese auch entsprechende ON_UPDATE_COMMAND Handler zulässt!