wiedermal Menü mit Icon :-) bitte nicht schlagen
-
Also was soll das! Der Fragesteller RED-BARON hat die Lösung bereits bei SPOTLIGHT.DE veröffentlicht, dort kann man's also nachlesen!
PS: Mein Nick setzt sich so zusammen: JS als Kürzel für meine Lieblingsprogrammiersprache JSCRIPT. Damit entwickle ich (mehr oder weniger erfolgreich) ASP-WEB-Anwendungen. "Freak" in's Deutsche übersetzt: Mißgeburt, Fanatiker, Hobby-Informatiker, Freak, Laune, verrückt
Ich weiß heute nicht mehr so genau, wer mir diesen Namen in unserer Community ursprünglich mal verpasst hat, ich finde ihn jedenfalls nicht so schlecht
-
Hat ja niemand was gegen deinen Nickname gesagt. Danke für den Aufklärung.
-
Also ehrlich gesagt, ich finde in dem Thread keine Lösung. Der Quellcode zu dem Programm beispiel würde mir schon reuichen. Ich muß das sowieso nach Delphi umwurschteln.
-
moin meisters ...
Sorry, dass ich erst jetzt antworte, hatte zwischzeitlich noch bissel stress.
Leider kam ich nun nicht mehr dazu mir das MD.zip Beispiel zu laden, Server nicht gefunden
egal, trozdem vielen Dank, für die Hinweise.
mfg
RB
-
Die Leiden eines Crossposters ...
Das MD.zip-Beispiel gibts hier: http://80.134.15.96/MD.zip
-
Hallo!
Gibst du auch den Quelltext von diesem Programm raus?
-
moin meister ...
ja das Beispiel is ja ok, soweit funktioniert es bei mir jetzt auch (fast),
weil ich noch Probleme habe, mit der Breite der Items.Wenn ich nicht alle Menüeintäge auf ownerdraw setze kommt es, dass die Breite
manchmal bei einigen Menüeinträgen zu kurz ist und das ganze etwas unschön aussieht.ich kann Dir ja mal meine Quelltext posten wenn Du willst, wobei ich ja weiss
dass mein Fehler in
WM_MEASUREITEM ist, ich ihn aber noch nicht beheben konntemfg
RB
-
Prima Idee! Poste deinen Code hier ins Forum (dann haben alle was davon).
-
Hallo meisters!
achso, ist das mit Ownerdrawn-Menüs realisiert worden?
-
moin meisters ...
Also hier mal mein Code:
ich habe mir da ne Klasse gebaut, damits danach einfacher geht
#define IDC_CURSOR 1001 #define IDC_ICON1 101 #define IDC_ICON2 102 #define IDM_WEBLINK 102 #define CM_WEBLINK 0x0001 #define CM_ICON 0x0002 #define CM_CURSOR 0x0004 typedef struct t_CCustomMenu { UINT id; char* pText; HICON hIcon1; HICON hIcon2; HCURSOR hCursor; UINT style; }t_CCustomMenu; class CCustomMenu { public: CCustomMenu::CCustomMenu(HINSTANCE hInst, HWND hwnd); CCustomMenu::~CCustomMenu(); private: HINSTANCE hInst; HWND hwnd; unsigned int ui_count; t_CCustomMenu* pItems; public: int InitItem(UINT submenu_no, UINT menu_id, char* szText, UINT icon_id1, UINT icon_id2, UINT cursor_id, UINT menu_style); void MeasureItem(LPMEASUREITEMSTRUCT pmis); void DrawItem(LPDRAWITEMSTRUCT pdis); }; CCustomMenu::CCustomMenu(HINSTANCE hInst, HWND hwnd) { CCustomMenu::hInst = hInst; CCustomMenu::hwnd = hwnd; ui_count = 0; pItems = NULL; } CCustomMenu::~CCustomMenu() { for(unsigned int i=0; i<ui_count; i++) { if(pItems[i].pText!=NULL) delete [] pItems[i].pText; } delete [] pItems; } int CCustomMenu::InitItem(UINT submenu_no, UINT menu_id, char* szText, UINT icon_id1, UINT icon_id2, UINT cursor_id, UINT menu_style) { MENUITEMINFO mii; HMENU hMenu = GetSubMenu(GetMenu(hwnd), submenu_no); if(hMenu == NULL) return (1); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE; GetMenuItemInfo(hMenu, menu_id, FALSE, &mii); mii.fType |= MFT_OWNERDRAW; SetMenuItemInfo(hMenu, menu_id, FALSE, &mii); ui_count++; if(ui_count == 1) pItems = (t_CCustomMenu*) malloc (ui_count * sizeof(t_CCustomMenu)); else pItems = (t_CCustomMenu*) realloc (pItems, ui_count * sizeof(t_CCustomMenu)); pItems[ui_count-1].id = menu_id; pItems[ui_count-1].pText = (char*) new char[strlen(szText)+1]; strcpy(pItems[ui_count-1].pText, szText); pItems[ui_count-1].hIcon1 = LoadIcon(hInst, MAKEINTRESOURCE(icon_id1)); pItems[ui_count-1].hIcon2 = LoadIcon(hInst, MAKEINTRESOURCE(icon_id2)); pItems[ui_count-1].hCursor = LoadCursor(hInst, MAKEINTRESOURCE(cursor_id)); if( pItems[ui_count-1].hCursor == NULL) menu_style &= ~CM_CURSOR; else menu_style |= CM_CURSOR; if( (pItems[ui_count-1].hIcon1 == NULL) && (pItems[ui_count-1].hIcon2 == NULL) ) menu_style &= ~CM_ICON; else menu_style |= CM_ICON; pItems[ui_count-1].style = menu_style; return (0); } void CCustomMenu::MeasureItem(LPMEASUREITEMSTRUCT pmis) { SIZE s; for(unsigned int i=0; i<ui_count; i++) { if( pmis->itemID == pItems[i].id) { pmis->itemHeight = GetSystemMetrics(SM_CYMENUSIZE); HDC hDC = GetWindowDC(hwnd); GetTextExtentPoint32(hDC, pItems[i].pText, strlen(pItems[i].pText), &s); pmis->itemWidth = s.cx;// - 30; ReleaseDC(hwnd, hDC); } } } void CCustomMenu::DrawItem(LPDRAWITEMSTRUCT pdis) { HFONT hFont, hOldFont; LOGFONT lFont; DWORD cxBitmap, cyBitmap, cyBitmapAdd; for(unsigned int i=0; i<ui_count; i++) if( pdis->itemID == pItems[i].id ) { DrawEdge(pdis->hDC, &pdis->rcItem, 0, BF_MIDDLE); pdis->itemAction |= ODA_SELECT; cyBitmap = GetSystemMetrics(SM_CYMENUSIZE); if ( cyBitmap > 16) { cyBitmapAdd = (cyBitmap - 16)/2; cyBitmap = 16; } else cyBitmapAdd = cyBitmap; cxBitmap = GetSystemMetrics(SM_CXMENUSIZE); if ( cxBitmap > 16 ) cxBitmap = 16; if ( pdis->itemAction & ODA_SELECT ) { hFont = (HFONT)GetCurrentObject(pdis->hDC, OBJ_FONT); GetObject(hFont, sizeof(lFont), &lFont); // hOver if ( pdis->itemState & ODS_SELECTED) { if( pItems[i].style & CM_WEBLINK ) { lFont.lfUnderline = TRUE; SetTextColor(pdis->hDC, 0x00A00000); } if( pItems[i].style & CM_ICON ) { if(pItems[i].hIcon2!=NULL) DrawIconEx(pdis->hDC, pdis->rcItem.left+1, pdis->rcItem.top+cyBitmapAdd, (HICON)pItems[i].hIcon2, cxBitmap, cyBitmap, 0, NULL, DI_NORMAL); else DrawIconEx(pdis->hDC, pdis->rcItem.left+1, pdis->rcItem.top+cyBitmapAdd, (HICON)pItems[i].hIcon1, cxBitmap, cyBitmap, 0, NULL, DI_NORMAL); } if( pItems[i].style & CM_CURSOR ) SetCursor((HCURSOR)pItems[i].hCursor); } else { if(pItems[i].style & CM_WEBLINK) { lFont.lfUnderline = FALSE; SetTextColor( pdis->hDC, GetSysColor(COLOR_WINDOWTEXT)); } if( pItems[i].style & CM_ICON ) if(pItems[i].hIcon1!=NULL) DrawIconEx(pdis->hDC, pdis->rcItem.left+1, pdis->rcItem.top+cyBitmapAdd, (HICON)pItems[i].hIcon1, cxBitmap, cyBitmap, 0, NULL, DI_NORMAL); if( pItems[i].style & CM_CURSOR ) SetCursor( LoadCursor(NULL, IDC_ARROW) ); } hOldFont = (HFONT)SelectObject(pdis->hDC, CreateFontIndirect(&lFont) ); pdis->rcItem.left += (cyBitmap+5); DrawText(pdis->hDC, pItems[i].pText, strlen(pItems[i].pText), &pdis->rcItem, DT_VCENTER + DT_SINGLELINE); pdis->rcItem.left -= (cyBitmap+5); SelectObject(pdis->hDC, hOldFont); } } }
im Programm steht dann:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; static CCustomMenu* pccm = NULL; switch (message) /* handle the messages */ { case WM_CREATE: pccm = (CCustomMenu*) new CCustomMenu(g_hInst, hwnd); pccm->InitItem(0, IDM_WEBLINK, "123456789012345678901234567890123456789", IDC_ICON1, IDC_ICON2, IDC_CURSOR, CM_WEBLINK); pccm->InitItem(0, 103, "WebLink", IDC_ICON1, IDC_ICON2, IDC_CURSOR, CM_WEBLINK); pccm->InitItem(1, 1002, "CustomItem_FIRSTSECOND\0", IDC_ICON1, 0, 0, 0); pccm->InitItem(1, (UINT)GetSubMenu(GetSubMenu(GetMenu(hwnd), 1), 0), "Test", IDC_ICON1, IDC_ICON2, 0, 0); break; case WM_MEASUREITEM: if ( wParam == 0 ) // menu pccm->MeasureItem((LPMEASUREITEMSTRUCT)lParam); break; case WM_DRAWITEM: if ( wParam == 0 ) // menu pccm->DrawItem((LPDRAWITEMSTRUCT)lParam); break; case WM_DESTROY: delete pccm; PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
in der Methode CCustomMenu::MeasureItem steht da
pmis->itemWidth = s.cx;// - 30;und genau da liegt mein Problem.
Erst ermittle ich wie breit der Eintrag ist und weise diesen Wert dann
pmis->itemWidth zu.Was zur Folge hat, dass der rechte Rand des Eintrags z.B "123456789012345678901234567890123456789"
sehr viel Breiter ist als der von normalen Menüeinträgen.Also ziehe ich mal nach gut dünken 30 Pixel ab (ist Kommentiert noch) doch
gibts wieder ein Problem, dass jetzt im zweiten Menü der Eintrag "TEST" welcher ein POPUP darstellt und somit einen schwarzen "Rechts gehts weiter Pfeil" hat,
dass ebend dieser Pfeil noch direkt über dem letzten Buchstaben des darunterliegenden Eintrags ist.Also direkt über dem "D" von "FIRSTSECOND"
UND DAS SIEHT NICHT NUR S****** aus sondern ist es auch.
BITTE HILFE
DANKE ANKE
mfg
RBPS: das ResourcenScript gabs ja ein paar Threads weiter oben schon ...