Grafik am Rand im Kontextmenü

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Grafik am Rand im Kontextmenü

Beitrag 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
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag 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:
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
wichtel
Beiträge: 150
Registriert: 09.09.2004 08:35
Wohnort: Hattersheim

Beitrag 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.
PB / jaPBe jeweils aktuellste Version, seit 3.62 dabei, XP sp3 de/en & W7 en
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag 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
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Creature
Beiträge: 678
Registriert: 29.08.2004 00:55
Wohnort: Frankfurt/Main

Beitrag von Creature »

wichtel hat geschrieben: Also händisch zusammenbasteln.
das heisst net händisch, das heisst manuell.
sorry, aber musste sein... <)
Bildung kommt von Bildschirm und nicht von Buch, sonst hieße es ja Buchung.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> das heisst net händisch, das heisst manuell.

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

Grüße ... Kiffi
Benutzeravatar
wichtel
Beiträge: 150
Registriert: 09.09.2004 08:35
Wohnort: Hattersheim

Beitrag 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.....
PB / jaPBe jeweils aktuellste Version, seit 3.62 dabei, XP sp3 de/en & W7 en
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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...
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag 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
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag 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
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Antworten