Geht das: Icon vor text in Menü?



  • Hallo,hab in meinem Programm oben ein Menüsystem, ich würde gerne vor dem text ein Icon anzeigen, ich hab das z.B. bei Getright gesehen, aber irgendwie steht das in der msdn mit

    InsertMenuItem
    

    kann man entweder einen Text oder ein Bitmap einfügen, wie mach ich das dann bloss?



  • ModifyMenu mit dem Parameter MF_OWNERDRAW | MF_BYCOMMAND aufrufen.

    Auf die Nachricht WM_DRAWITEM mit der Ausgabe via DrawState die Grafik vor dem Menüeintrag plazieren.

    Pfertisch!

    PS: Die markierten Einträge solltest du an deine Lieblings-Suchmaschine verfüttern ...



  • Danke für die Antwort, aber auch nach Langem rumprobieren hab ich es nicht hinbekommen, ich habe jetzt das Checkstate Icon ausgetauscht, keine gute Lösung aber erstmal ein Ansatz, mal sehen, vieleicht bekommm ich es ja noch hin.



  • Die einfachste Loesung waere die

    [cpp]
    HBITMAP hMenuBit = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP, 13, 13, LR_SHARED);
    
    AppendMenu(hMenu,MF_STRING,ID_MENU,"Irgend ein Menue");
    SetMenuItemBitmaps (hMenu, 0, MF_BYPOSITION, hMenuBit, hMenuBit);
    
     [/cpp]
    

    oder so Owner Draw

    [cpp]
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
    	HMENU				hMenu = GetMenu(hWnd);
    	LPDRAWITEMSTRUCT	        lpdis;
    	LPMEASUREITEMSTRUCT             lpmis;
    	HBRUSH				hbrColor = CreateSolidBrush(RGB(49, 106, 197));
    	HDC				hDC;
    	switch(uiMsg)
    	{
    //.......
    
    ModifyMenu(hMenu, IDM_EXIT, MF_BYCOMMAND | MF_ENABLED | MF_OWNERDRAW,  IDM_EXIT, NULL);
    
    //.......
    
    case WM_MEASUREITEM:
    lpmis = (LPMEASUREITEMSTRUCT)lParam;
    switch(lpmis->itemID)
    {
      case IDM_EXIT:
      lpmis->itemHeight = 17;
      lpmis->itemWidth = 160;
      break;
    }
    return 0;
    
    case WM_DRAWITEM:
    lpdis = (LPDRAWITEMSTRUCT)lParam;
    hDC = CreateCompatibleDC(lpdis->hDC);
    if(lpdis->itemState & ODS_SELECTED)  
    {
     switch(lpdis->itemID)
     {
       case IDM_EXIT:
       FillSelMenu(hDC, lpdis, hbrColor, 1,   2,TEXT("Exit"),  4, IDB_BITMAP1);
       break;
     }
    }else{
     switch(lpdis->itemID)
     {
      case IDM_EXIT:
      FillMenu(hDC, lpdis, 1, 2, TEXT("Exit"), 4, IDB_BITMAP2);
      break;
     }
    }
    DeleteObject(hbrColor);
    return 0;
    
    //.......
    
    void FillSelMenu(HDC hDC, LPDRAWITEMSTRUCT lpdis, HBRUSH hbr, int yBmp , int yTxt, LPCWSTR szString, int iStrlen, const int BitID)
    {
    	HBITMAP  hBmp = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(BitID), IMAGE_BITMAP, 16, 16, LR_SHARED);
    
    	SelectObject(hDC, hBmp);
    	SetBkMode(lpdis->hDC, TRANSPARENT);
    	FillRect(lpdis->hDC, &lpdis->rcItem, hbr);
    	StretchBlt(lpdis->hDC, 2, yBmp, 16, 16, hDC, 0, 0, 16, 16, SRCCOPY);
    	SetTextColor(lpdis->hDC,RGB(255,255,255));
    	TextOut(lpdis->hDC, 22, yTxt, szString, iStrlen);
    	DeleteDC(hDC);
    }
    
    void FillMenu(HDC hDC, LPDRAWITEMSTRUCT lpdis, int yBmp, int yTxt, LPCWSTR szString, int iStrlen, const int BitID)
    {
    	HBITMAP  hBmp = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(BitID), IMAGE_BITMAP, 16, 16, LR_SHARED);
    
    	SelectObject(hDC, hBmp);
    	SetBkMode(lpdis->hDC, TRANSPARENT);
    	FillRect(lpdis->hDC, &lpdis->rcItem, CreateSolidBrush(RGB(255,255,255)));
    	StretchBlt(lpdis->hDC, 2, yBmp, 16, 16, hDC, 0, 0, 16, 16, SRCCOPY);
    	TextOut(lpdis->hDC, 22, yTxt, szString, iStrlen);
    	DeleteObject(hDC);
    }
    
    [/cpp]
    

    MFG Ascharan 😃



  • Danke für den Beispielcode, ich werde da wohl einige Zeit brauchen um den duchzuarbeiten.


Anmelden zum Antworten