wiedermal Menü mit Icon :-) bitte nicht schlagen



  • Jetzt würde ich an seiner Stelle auch nicht mehr antworten. Wie kannst du ihn 'typ' nennen? Das is ne Beleidigung.



  • Er bezeichnet sich selber als Freak. Und das "Typ" war freundschaftlich gemeint.



  • 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 konnte 😞

    mfg
    RB

    martin.bauer.dd@web.de



  • 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
    RB

    PS: das ResourcenScript gabs ja ein paar Threads weiter oben schon ...


Anmelden zum Antworten