Seite 1 von 3

Grafik am Rand im Kontextmenü

Verfasst: 08.11.2004 20:38
von Lukaso
Hallo,

ich möchte eine Grafik am Rand meines Kontextmenüs (Rechtsklickmenü), so wie im Startmenü von Windows (klassisch fals XP) am Rand wo "Windows XP Professional" steht :wink:. Hat das jemand schon gemacht, und kann mir ein paar Tips bzw. nen Source-Schnippsel geben ....

... wäre echt Super :allright:

Danke Lukaso

Verfasst: 09.11.2004 21:27
von Lukaso
Hallo,

hat keiner eine Idee wie das bewerkställigen könnte? :roll:
Hier nochn Pic, um zu zeigen, was ich genau meine:
Bild

MFG Lukaso :allright:

Verfasst: 09.11.2004 21:55
von wichtel
Die API dafür kenn ich nicht.
Das Forum gibt auch nix her.
Da erfährst du alles um Icons in das Menu zu bauen usw...
Ich würde das evtl. mit einem Trick lösen.
Ein Fenster and das Pop Up kleben, wenn du weist was ich meine.
Also händisch zusammenbasteln.
der Effekt wäre der selbe.

Verfasst: 09.11.2004 23:24
von Lukaso
wichtel hat geschrieben: Ein Fenster and das Pop Up kleben, wenn du weist was ich meine.
Also händisch zusammenbasteln.
der Effekt wäre der selbe.
Zusammenkleben hmmm.... und wie soll ich dass bitte genau machen, habe garade irgendwie keinen plan :| nen Beispiel ? :roll: :roll:

THX Lukaso

Verfasst: 10.11.2004 01:36
von Creature
wichtel hat geschrieben: Also händisch zusammenbasteln.
das heisst net händisch, das heisst manuell.
sorry, aber musste sein... <)

Verfasst: 10.11.2004 02:09
von Kiffi
> das heisst net händisch, das heisst manuell.

http://forum.tagesschau.de/showthread.p ... post109577

Grüße ... Kiffi

Verfasst: 10.11.2004 10:17
von wichtel
In diesem Forum sind mehr Rechtschreibfehler als Beiträge.
Was stört also jetzt an händisch?
Wenn es sonst überall funzt, geproggt wird, und irgend jemands events gelogged hat.....

Verfasst: 10.11.2004 15:35
von Danilo
Lukaso hat geschrieben:hat keiner eine Idee wie das bewerkställigen könnte? :roll:
Du mußt das Menu selber zeichnen.

Ich habe grad mal ein Beispiel gemacht, weiß aber nicht ob
es überall (speziell XP mit seinen Skins) korrekt funktioniert.
Hab leider grad keine Zeit mehr, also mußt Du selbst mal
schauen und evtl. korrigieren - es ist wenigstens ein Anfang.

Da ich wenig Zeit hatte konnte ich nichts kommentieren,
aber kannst Du alles in MSDN/PSDK nachlesen -> bei Menus.

Code: Alles auswählen

;
; Owner Drawn PopUp Menu
;
;   by Danilo, 10.11.2004 - german forum
;
;
#MIIM_FTYPE  = $100
#MIIM_TYPE   = $10
#MIIM_STRING = $40

Global hMenu,hBmp,hBmpWidth, tempDC


Procedure GetMenuHeight(hWnd,Menu)
  hDC     = GetDC_(hWnd)
  GetTextExtentPoint32_(hDC,"X",1,size.SIZE); 
  ReleaseDC_(hWnd,hDC)
  ProcedureReturn GetMenuItemCount_(Menu)*size\cy
EndProcedure


Procedure$ GetMenuIDName(itemID)
  mii.MENUITEMINFO
  mii\cbSize        = SizeOf(MENUITEMINFO)
  mii\fMask         = #MIIM_STRING;|#MIIM_TYPE
  ;mii\fType         = #MFT_STRING
  mii\dwTypeData    = AllocateMemory(1024)
  mii\cch           = 1023
  If GetMenuItemInfo_(hMenu,itemID,0,mii)
   ItemName$        = PeekS(mii\dwTypeData)
  EndIf
  FreeMemory(mii\dwTypeData)
  ProcedureReturn ItemName$
EndProcedure


Procedure WndProc(hWnd,Msg,wParam,lParam)
  Select Msg
    Case #WM_MEASUREITEM
      *mis.MEASUREITEMSTRUCT = lParam
      If *mis
        hDC     = GetDC_(hWnd)
        ItemName$ = GetMenuIDName(*mis\itemID)
        If ItemName$ = ""
          ItemName$ = "X" ; for menu bars
        EndIf
        GetTextExtentPoint32_(hDC,ItemName$,Len(ItemName$),size.SIZE);
        *mis\itemWidth  = size\cx+hBmpWidth
        *mis\itemHeight = size\cy
        ReleaseDC_(hWnd,hDC)
        ProcedureReturn #TRUE
      EndIf
    Case #WM_DRAWITEM
      *dis.DRAWITEMSTRUCT = lParam
      If *dis
        If *dis\itemState & #ODS_SELECTED
          colText = SetTextColor_(*dis\hDC,GetSysColor_(#COLOR_HIGHLIGHTTEXT))
          colBack = SetBkColor_(  *dis\hDC,GetSysColor_(#COLOR_HIGHLIGHT))
        Else
          colText = SetTextColor_(*dis\hDC,GetSysColor_(#COLOR_MENUTEXT))
          colBack = SetBkColor_(  *dis\hDC,GetSysColor_(#COLOR_MENU))
        EndIf
        
        x = *dis\rcItem\left + GetSystemMetrics_(#SM_CXMENUCHECK) + hBmpWidth
        y = *dis\rcItem\top

        ItemName$ = GetMenuIDName(*dis\itemID)
        If ItemName$
          ExtTextOut_(*dis\hDC,x,y+1,#ETO_OPAQUE,@*dis\rcItem,ItemName$,Len(ItemName$),0)
        Else
          hDC     = GetDC_(hWnd)
          GetTextExtentPoint32_(hDC,"X",1,size.SIZE);
          ReleaseDC_(hWnd,hDC)
          y + size\cy/2-1
          colText = SetTextColor_(*dis\hDC,GetSysColor_(#COLOR_MENUTEXT))
          colBack = SetBkColor_(  *dis\hDC,GetSysColor_(#COLOR_MENUTEXT))
          Pen=CreatePen_(#PS_SOLID,1,GetSysColor_(#COLOR_GRAYTEXT))
          oldPen=SelectObject_(*dis\hDC,Pen)
          MoveToEx_(*dis\hDC,0,y,@tmp.POINT)
          LineTo_(*dis\hDC,*dis\rcItem\right,y)
          SelectObject_(*dis\hDC,oldPen)
          DeleteObject_(Pen)
        EndIf

        BitBlt_(*dis\hDC,0,0,hBmpWidth,1000,tempDC,0,0,#SRCCOPY)

        SetTextColor_(*dis\hDC,colText)
        SetBkColor_(  *dis\hDC,colBack)
        ProcedureReturn #TRUE
      EndIf
    Case #WM_INITMENU
      If tempDC=0
        hDC    = GetDC_(hWnd)
        tempDC = CreateCompatibleDC_(hDC)
        SelectObject_(tempDC,hBmp)
        ReleaseDC_(hWnd,hDC)
      EndIf
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure OwnerDrawnMenu(Menu)
  mii.MENUITEMINFO
  mii\cbSize = SizeOf(MENUITEMINFO)
  mii\fMask  = #MIIM_FTYPE
  mii\fType  = #MFT_OWNERDRAW
  For i = 0 To GetMenuItemCount_(Menu)-1
    SetMenuItemInfo_(Menu,i,#TRUE,mii)
  Next i
EndProcedure


;>---------------------------------------


hMenu = CreatePopupMenu(0)
If hMenu
  For i = 1 To 10
    MenuItem(100+i,"Item "+Str(i))
  Next i
  MenuBar()
  OpenSubMenu("Sub")
    MenuItem(1, "SubMenu 1")
    MenuItem(2, "SubMenu 2")
  CloseSubMenu()
  MenuBar()
  MenuItem(3, "Quit")
Else
  End
EndIf


If OpenWindow(0,200,200,300,300,#PB_Window_SystemMenu,"OwnerDrawn PopUp Menu")
  SetWindowCallback(@WndProc())

  #barwidth = 30
  height    = GetMenuHeight(WindowID(),hMenu)
  hBmp      = CreateImage(0,#barwidth,height)
  hBmpWidth = #barwidth

  StartDrawing(ImageOutput())
    stp.f = 255/height
    For y = height To 0 Step -1
      Line(0,y,#barwidth,0,RGB(0,0,b.f))
      b+stp
    Next y
    Locate(3,height-20)
    DrawingMode(1)
    FrontColor($FF,$FF,$00)
    DrawText("Yo!")
  StopDrawing()

  OwnerDrawnMenu(hMenu)



  Repeat
    Select WaitWindowEvent()
      Case #WM_RButtonDown
        DisplayPopupMenu(0,WindowID())
      Case #WM_LButtonDown
        DisplayPopupMenu(0,WindowID())
      Case #PB_EventMenu
        menu = EventMenuID()
        If menu = 3
          Break
        EndIf
        MessageRequester("MENU","Menu Event: "+Str(menu),0)
      Case #PB_EventCloseWindow
        Break
    EndSelect
  ForEver
EndIf

If tempDC
  DeleteDC_(tempDC)
EndIf
Vielleicht hilft es ja ein bissl...

Verfasst: 10.11.2004 16:34
von Lukaso
@Danilo
Super Danke! :allright:
Funktioniert super, sogar mit XP Skins :allright:
Hacken und auf Disable setzen geht zwar nicht, aber ich versuche es selber hinzubekommen :roll:

Danke nochmals, hast mir sehr geholfen! :allright:

MFG Lukaso

Verfasst: 14.11.2004 20:20
von Lukaso
Mist, versuche schon seit Tagen in Danilos Code den Orginalen MenuBar (nicht son strich :roll:), die Disable und das Häkle hinzubekommen. Nur vergebnens, entweder es Funtz nicht oder ich bekomme nen XP-Fehler, bzw. meine Kiste bootet mitm Bluescreen neu :roll: :lol: :cry:

Könnte mir jemand helfen <)

Danke Lukaso