[B+]Popupmenu

Übersicht BlitzBasic DLLs und Userlibs

Neue Antwort erstellen

simi

Betreff: [B+]Popupmenu

BeitragSo, Sep 18, 2005 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
So, mal wieder etwas kleines von mir....
13 Befehle, mit denen man ganz leicht Popupmenus erstellen und verändern kann.....
Code: [AUSKLAPPEN]

;#############################################################################
;USERLIBS:
;=========

;.lib "user32.dll"
;api_CreatePopupMenu%():"CreatePopupMenu"
;api_DestroyMenu(h):"DestroyMenu"

;api_InsertMenuItem%(hMenu,uItem,fByPosition, lpmii*):"InsertMenuItemA"
;api_DeleteMenu(hMenu,uPosition,uFlags):"DeleteMenu"

;api_TrackPopupMenuEx%(hMenu,wFlags,x,y,HWnd,lptpm):"TrackPopupMenuEx"

;api_GetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):"GetMenuItemInfoA"
;api_SetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):"SetMenuItemInfoA"

;-----------------------------------------------------------------------------

;.lib "kernel32.dll"
;ptr_helper__%(a*,b%,c%):"MulDiv"

;#############################################################################

window = CreateWindow("Hallo!",100,100,200,200,0,9)

Untermenu = PM_Create()
PM_AddItem(Untermenu,"Auswahl Nr.1",11,$8,0,1)
PM_AddItem(Untermenu,"Auswahl Nr.2",12, 0,0,1)
PM_AddItem(Untermenu,"Auswahl Nr.3",13, 0,0,1)

HauptMenu=PM_Create()
PM_AddItem(HauptMenu,"UnterMenü?",1,$8)
PM_AddItem(HauptMenu,"",4)
PM_AddItem(HauptMenu,"Untermenü",2,$1000,Untermenu)
PM_AddItem(HauptMenu,"Ende",3)
PM_AddItem(HauptMenu,"",4)
PM_AddItem(HauptMenu,"Lösch mich!",5)
PM_AddItem(HauptMenu,"Counter: 0",6)


Repeat
   Select WaitEvent()
      Case $803
         Ende = 1
   End Select

   
   event=0:If MouseHit(2) Then event = PM_Show(Hauptmenu,MouseX(),MouseY(),window)
   Select event
      Case 11,12,13
         PM_UncheckItem(Untermenu,11)
         PM_UncheckItem(Untermenu,12)
         PM_UncheckItem(Untermenu,13)
         PM_CheckItem(Untermenu,event)
      Case 3
         Ende = 1
      Case 1
         If PM_GetChecked(Hauptmenu,1) Then
            PM_UncheckItem(Hauptmenu,1)
            PM_DisableItem(Hauptmenu,2)
         Else
            PM_CheckItem(Hauptmenu,1)
            PM_EnableItem(Hauptmenu,2)
         End If
      Case 5
         PM_DeleteItem(HauptMenu,5)
      Case 6
         t$ = PM_GetText(HauptMenu,6)
         t$ = Mid(t,Instr(t," "))
         PM_SetText(Hauptmenu,6,"Counter: "+(Int(t$)+1))
   End Select
   
Until (ende = 1)

PM_Delete(Hauptmenu)
PM_Delete(Untermenu)

End




Function PM_Create()
   Return api_CreatePopupMenu()
End Function
;Erstellt ein neues Popupmenu, und gibt dessen handle zurück.



Function PM_Delete(h)
   api_DestroyMenu(h)
End Function
;Gibt den Speicher eines Menüs frei.
;h = Handle des Popupmenus.



Function PM_AddItem(h,t$,Id,s=$0,subM=0,r=0)
   b2 = CreateBank(Len(t)+1)
      For x = 1 To Len(t)
         PokeByte b2,x-1,Asc(Mid(t,x,1))
      Next
      PokeByte b2,x-1,0

      
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$3B+((subM>0)*$4)
      PokeInt b1,8,$800*(t="")+(r*$200)
      PokeInt b1,12,s
      PokeInt b1,16,ID
   
      PokeInt b1,20,subM
      PokeInt b1,24,0
      PokeInt b1,28,0
   
      PokeInt b1,32,0
      PokeInt b1,36,ptr_helper__(b2,1,1)
      PokeInt b1,40,Len(t)
      
   api_InsertMenuItem(h,0,0,b1)
   
   FreeBank b1
   FreeBank b2
End Function
;Fügt ein Eintrag am Ende eines Popupfensters hinzu.
;h  = Handle des PopupMenus
;t  = Text der angezeigt werden soll oder "" für eine Trennlinie  (& vor Buchstaben für Shortcut)
;ID = Kennnummer, die von ShowPopupMenu zurückgegeben wird....
;s=Styles:   $8      Häckchen
;         $1000   Fett
;         $3      Ausgeschaltet (grau)
;         $80      Highlight (ausgewählt, blauer Hintergrund)
;         Flags können kombinert werden (durch Adition)
;subM = Handle des SubMenus, dass erscheinen soll, wenn man auf diesen Item kommt
;r = Punkte statt Häckchen verwenden (für nur eine Auswahl)



Function PM_DeleteItem(h,i)
   api_DeleteMenu(h,i,0)
End Function
;Löscht einen Eintrag aus einem Menu. Wenn das zu löschende Menü ein Untermenü hat, wird auch dessen
;Speciher freigegeben.
;h = Handle des Menüs, in dem sich der Eintrag befindet.
;i = Kennnummer des Eintrags.



Function PM_Show(h,x,y,w)
   Return api_TrackPopupMenuEx(h,$100,x,y,QueryObject(w,1),0)
End Function
;Zeigt das Popup-Menu an.
;h = Handle des PopupMenus
;x,y = Position des Menus zur linken, oberen Bildschirmecke
;w = Handle des Fensters, das Parent für das Menu ist









Function PM_GetEnabled(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1

   api_GetMenuItemInfo(h,i,0,b1)

   t = Not(PeekInt(b1,12) And $3)/3
   
   FreeBank b1

   Return t
End Function
;Gibt zurück, ob ein Item ausgewählt werden kann.
;h = Handle des Menüs
;i = Kennnummer des Eintrags



Function PM_GetChecked(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1

   api_GetMenuItemInfo(h,i,0,b1)

   t = (PeekInt(b1,12) And $8)/8
   
   FreeBank b1

   Return t
End Function
;Gibt zurück, ob vor einem Menüeintrag ein Haken ist.
;h = Handle des Menüs
;i = Kennnummer des Eintrags



Function PM_GetText$(h,i)
   b2 = CreateBank(50)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$10
      PokeInt b1,36,ptr_helper__(b2,1,1)
      PokeInt b1,40,50

   api_GetMenuItemInfo(h,i,0,b1)

   For x = 0 To 49
      If PeekInt(b2,x)=0 Then Exit
      t$ = t + Chr(PeekByte(b2,x))
   Next

   FreeBank b1
   FreeBank b2

   Return t
End Function
;Gibt den Text eines Menüeintrags zurück.
;h = Handle des Menüs
;i = Kennnummer des Eintrags








Function PM_SetText(h,i,t$)
   b2 = CreateBank(Len(t)+1)
      For x = 1 To Len(t)
         PokeByte b2,x-1,Asc(Mid(t,x,1))
      Next
      PokeByte b2,x-1,0
      
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$10
      PokeInt b1,36,ptr_helper__(b2,1,1)
      PokeInt b1,40,Len(t)+1

   api_SetMenuItemInfo(h,i,0,b1)

   FreeBank b1
   FreeBank b2
End Function
;Ändert den Text eines Menuitems.
;h = Handle des PopupMenus
;i = Kennnummer des Items
;t = neuer Text


Function PM_EnableItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffffc)
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Macht, dass ein Menuitem wieder angewählt werden kann
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_DisableItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffffc)+$3
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Macht, dass ein Menuitem nicht angewählt werden kann
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_CheckItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffff7)+$8
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Häckelt ein MenuItem "an".
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_UncheckItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffff7)
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Entfernt das Häckchen vor einem MenuItem.
;h = Handle des PopupMenus
;i = Kennnummer des Items


Viel Spass!! Wink

cu simi

Sebastian

BeitragMi, Sep 28, 2005 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso ist sowas immer für nur B+ ???

5 Zeilen Abgeändert und schon läaft es auch für B3d :
BlitzBasic: [AUSKLAPPEN]


;#############################################################################
;USERLIBS:
;=========

;.lib \"user32.dll\"
;api_CreatePopupMenu%():\"CreatePopupMenu\"
;api_DestroyMenu(h):\"DestroyMenu\"
;api_GetActiveWindow% () : \"GetActiveWindow\"

;api_InsertMenuItem%(hMenu,uItem,fByPosition, lpmii*):\"InsertMenuItemA\"
;api_DeleteMenu(hMenu,uPosition,uFlags):\"DeleteMenu\"

;api_TrackPopupMenuEx%(hMenu,wFlags,x,y,HWnd,lptpm):\"TrackPopupMenuEx\"

;api_GetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):\"GetMenuItemInfoA\"
;api_SetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):\"SetMenuItemInfoA\"

;-----------------------------------------------------------------------------

;.lib \"kernel32.dll\"
;ptr_helper__%(a*,b%,c%):\"MulDiv\"

;#############################################################################

Graphics 400,400,16,2
SetBuffer BackBuffer()
window = api_GetActiveWindow()

Untermenu = PM_Create()
PM_AddItem(Untermenu,\"Auswahl Nr.1\",11,$8,0,1)
PM_AddItem(Untermenu,\"Auswahl Nr.2\",12, 0,0,1)
PM_AddItem(Untermenu,\"Auswahl Nr.3\",13, 0,0,1)

HauptMenu=PM_Create()
PM_AddItem(HauptMenu,\"UnterMenü?\",1,$8)
PM_AddItem(HauptMenu,\"\",4)
PM_AddItem(HauptMenu,\"Untermenü\",2,$1000,Untermenu)
PM_AddItem(HauptMenu,\"Ende\",3)
PM_AddItem(HauptMenu,\"\",4)
PM_AddItem(HauptMenu,\"Lösch mich!\",5)
PM_AddItem(HauptMenu,\"Counter: 0\",6)


Repeat

Cls

count = count + 1


event=0
If MouseHit(2) Then event = PM_Show(Hauptmenu,MouseX(),MouseY(),window)
Select event
Case 11,12,13
PM_UncheckItem(Untermenu,11)
PM_UncheckItem(Untermenu,12)
PM_UncheckItem(Untermenu,13)
PM_CheckItem(Untermenu,event)
Case 3
Ende = 1
Case 1
If PM_GetChecked(Hauptmenu,1) Then
PM_UncheckItem(Hauptmenu,1)
PM_DisableItem(Hauptmenu,2)
Else
PM_CheckItem(Hauptmenu,1)
PM_EnableItem(Hauptmenu,2)
End If
Case 5
PM_DeleteItem(HauptMenu,5)
Case 6
t$ = PM_GetText(HauptMenu,6)
t$ = Mid(t,Instr(t,\" \"))
PM_SetText(Hauptmenu,6,\"Counter: \"+(Int(t$)+1))
End Select

Text 1,1,count

Flip()

Until (ende = 1)

PM_Delete(Hauptmenu)
PM_Delete(Untermenu)

End




Function PM_Create()
Return api_CreatePopupMenu()
End Function
;Erstellt ein neues Popupmenu, und gibt dessen handle zurück.



Function PM_Delete(h)
api_DestroyMenu(h)
End Function
;Gibt den Speicher eines Menüs frei.
;h = Handle des Popupmenus.



Function PM_AddItem(h,t$,Id,s=$0,subM=0,r=0)
b2 = CreateBank(Len(t)+1)
For x = 1 To Len(t)
PokeByte b2,x-1,Asc(Mid(t,x,1))
Next
PokeByte b2,x-1,0


b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$3B+((subM>0)*$4)
PokeInt b1,8,$800*(t=\"\")+(r*$200)
PokeInt b1,12,s
PokeInt b1,16,ID

PokeInt b1,20,subM
PokeInt b1,24,0
PokeInt b1,28,0

PokeInt b1,32,0
PokeInt b1,36,ptr_helper__(b2,1,1)
PokeInt b1,40,Len(t)

api_InsertMenuItem(h,0,0,b1)

FreeBank b1
FreeBank b2
End Function
;Fügt ein Eintrag am Ende eines Popupfensters hinzu.
;h = Handle des PopupMenus
;t = Text der angezeigt werden soll oder \"\" für eine Trennlinie (& vor Buchstaben für Shortcut)
;ID = Kennnummer, die von ShowPopupMenu zurückgegeben wird....
;s=Styles: $8 Häckchen
; $1000 Fett
; $3 Ausgeschaltet (grau)
; $80 Highlight (ausgewählt, blauer Hintergrund)
; Flags können kombinert werden (durch Adition)
;subM = Handle des SubMenus, dass erscheinen soll, wenn man auf diesen Item kommt
;r = Punkte statt Häckchen verwenden (für nur eine Auswahl)



Function PM_DeleteItem(h,i)
api_DeleteMenu(h,i,0)
End Function
;Löscht einen Eintrag aus einem Menu. Wenn das zu löschende Menü ein Untermenü hat, wird auch dessen
;Speciher freigegeben.
;h = Handle des Menüs, in dem sich der Eintrag befindet.
;i = Kennnummer des Eintrags.



Function PM_Show(h,x,y,w)
Return api_TrackPopupMenuEx(h,$100,x,y,w,0)
End Function
;Zeigt das Popup-Menu an.
;h = Handle des PopupMenus
;x,y = Position des Menus zur linken, oberen Bildschirmecke
;w = Handle des Fensters, das Parent für das Menu ist









Function PM_GetEnabled(h,i)
b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$1

api_GetMenuItemInfo(h,i,0,b1)

t = Not(PeekInt(b1,12) And $3)/3

FreeBank b1

Return t
End Function
;Gibt zurück, ob ein Item ausgewählt werden kann.
;h = Handle des Menüs
;i = Kennnummer des Eintrags



Function PM_GetChecked(h,i)
b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$1

api_GetMenuItemInfo(h,i,0,b1)

t = (PeekInt(b1,12) And $8)/8

FreeBank b1

Return t
End Function
;Gibt zurück, ob vor einem Menüeintrag ein Haken ist.
;h = Handle des Menüs
;i = Kennnummer des Eintrags



Function PM_GetText$(h,i)
b2 = CreateBank(50)
b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$10
PokeInt b1,36,ptr_helper__(b2,1,1)
PokeInt b1,40,50

api_GetMenuItemInfo(h,i,0,b1)

For x = 0 To 49
If PeekInt(b2,x)=0 Then Exit
t$ = t + Chr(PeekByte(b2,x))
Next

FreeBank b1
FreeBank b2

Return t
End Function
;Gibt den Text eines Menüeintrags zurück.
;h = Handle des Menüs
;i = Kennnummer des Eintrags








Function PM_SetText(h,i,t$)
b2 = CreateBank(Len(t)+1)
For x = 1 To Len(t)
PokeByte b2,x-1,Asc(Mid(t,x,1))
Next
PokeByte b2,x-1,0

b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$10
PokeInt b1,36,ptr_helper__(b2,1,1)
PokeInt b1,40,Len(t)+1

api_SetMenuItemInfo(h,i,0,b1)

FreeBank b1
FreeBank b2
End Function
;Ändert den Text eines Menuitems.
;h = Handle des PopupMenus
;i = Kennnummer des Items
;t = neuer Text


Function PM_EnableItem(h,i)
b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$1
api_GetMenuItemInfo(h,i,0,b1)
PokeByte b1,12,(PeekInt(b1,12) And $fffffffc)
api_SetMenuItemInfo(h,i,0,b1)
FreeBank b1
End Function
;Macht, dass ein Menuitem wieder angewählt werden kann
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_DisableItem(h,i)
b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$1
api_GetMenuItemInfo(h,i,0,b1)
PokeByte b1,12,(PeekInt(b1,12) And $fffffffc)+$3
api_SetMenuItemInfo(h,i,0,b1)
FreeBank b1
End Function
;Macht, dass ein Menuitem nicht angewählt werden kann
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_CheckItem(h,i)
b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$1
api_GetMenuItemInfo(h,i,0,b1)
PokeByte b1,12,(PeekInt(b1,12) And $fffffff7)+$8
api_SetMenuItemInfo(h,i,0,b1)
FreeBank b1
End Function
;Häckelt ein MenuItem \"an\".
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_UncheckItem(h,i)
b1 = CreateBank(44)
PokeInt b1,0,44
PokeInt b1,4,$1
api_GetMenuItemInfo(h,i,0,b1)
PokeByte b1,12,(PeekInt(b1,12) And $fffffff7)
api_SetMenuItemInfo(h,i,0,b1)
FreeBank b1
End Function
;Entfernt das Häckchen vor einem MenuItem.
;h = Handle des PopupMenus
;i = Kennnummer des Items




Ist natürlich noch ausbau fähig, z.B könnte jemand überGetWindowPlacement die Position des Fensters rausfinden und das Menu dann dort rein zeichnen ......

Ach ja : Man sollte wissen das PM_show das Proggi anhält bis ein Event auftritt .
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !
  • Zuletzt bearbeitet von Sebastian am Do, Sep 29, 2005 17:03, insgesamt einmal bearbeitet

EPS

BeitragMi, Sep 28, 2005 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Coole Sache, nach sowas such ich schon länger....
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

soli

BeitragSo, Nov 27, 2005 7:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab das mal ergänzt,
damit das PopUp auch da aufgeht
wo man klickt.

Code: [AUSKLAPPEN]

;#############################################################################
;USERLIBS:
;=========

;.lib "user32.dll"
;api_CreatePopupMenu%():"CreatePopupMenu"
;api_DestroyMenu(h):"DestroyMenu"
;api_GetActiveWindow% () : "GetActiveWindow"

;api_InsertMenuItem%(hMenu,uItem,fByPosition, lpmii*):"InsertMenuItemA"
;api_DeleteMenu(hMenu,uPosition,uFlags):"DeleteMenu"

;api_TrackPopupMenuEx%(hMenu,wFlags,x,y,HWnd,lptpm):"TrackPopupMenuEx"

;api_GetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):"GetMenuItemInfoA"
;api_SetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):"SetMenuItemInfoA"

;-----------------------------------------------------------------------------

;.lib "kernel32.dll"
;ptr_helper__%(a*,b%,c%):"MulDiv"

;#############################################################################

Graphics 400,400,16,2
SetBuffer BackBuffer()
window = api_GetActiveWindow()

Untermenu = PM_Create()
PM_AddItem(Untermenu,"Auswahl Nr.1",11,$8,0,1)
PM_AddItem(Untermenu,"Auswahl Nr.2",12, 0,0,1)
PM_AddItem(Untermenu,"Auswahl Nr.3",13, 0,0,1)

HauptMenu=PM_Create()
PM_AddItem(HauptMenu,"UnterMenü?",1,$8)
PM_AddItem(HauptMenu,"",4)
PM_AddItem(HauptMenu,"Untermenü",2,$1000,Untermenu)
PM_AddItem(HauptMenu,"Ende",3)
PM_AddItem(HauptMenu,"",4)
PM_AddItem(HauptMenu,"Lösch mich!",5)
PM_AddItem(HauptMenu,"Counter: 0",6)


Repeat

Cls
 
count = count + 1


event=0
If MouseHit(2) Then event = PM_Show(Hauptmenu,MouseX(),MouseY(),window)
   Select event
      Case 11,12,13
         PM_UncheckItem(Untermenu,11)
         PM_UncheckItem(Untermenu,12)
         PM_UncheckItem(Untermenu,13)
         PM_CheckItem(Untermenu,event)
      Case 3
         Ende = 1
      Case 1
         If PM_GetChecked(Hauptmenu,1) Then
            PM_UncheckItem(Hauptmenu,1)
            PM_DisableItem(Hauptmenu,2)
         Else
            PM_CheckItem(Hauptmenu,1)
            PM_EnableItem(Hauptmenu,2)
         End If
      Case 5
         PM_DeleteItem(HauptMenu,5)
      Case 6
         t$ = PM_GetText(HauptMenu,6)
         t$ = Mid(t,Instr(t," "))
         PM_SetText(Hauptmenu,6,"Counter: "+(Int(t$)+1))
   End Select
 
Text 1,1,count

Flip()
 
Until (ende = 1)

PM_Delete(Hauptmenu)
PM_Delete(Untermenu)

End




Function PM_Create()
   Return api_CreatePopupMenu()
End Function
;Erstellt ein neues Popupmenu, und gibt dessen handle zurück.



Function PM_Delete(h)
   api_DestroyMenu(h)
End Function
;Gibt den Speicher eines Menüs frei.
;h = Handle des Popupmenus.



Function PM_AddItem(h,t$,Id,s=$0,subM=0,r=0)
   b2 = CreateBank(Len(t)+1)
      For x = 1 To Len(t)
         PokeByte b2,x-1,Asc(Mid(t,x,1))
      Next
      PokeByte b2,x-1,0

     
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$3B+((subM>0)*$4)
      PokeInt b1,8,$800*(t="")+(r*$200)
      PokeInt b1,12,s
      PokeInt b1,16,ID
   
      PokeInt b1,20,subM
      PokeInt b1,24,0
      PokeInt b1,28,0
   
      PokeInt b1,32,0
      PokeInt b1,36,ptr_helper__(b2,1,1)
      PokeInt b1,40,Len(t)
     
   api_InsertMenuItem(h,0,0,b1)
   
   FreeBank b1
   FreeBank b2
End Function
;Fügt ein Eintrag am Ende eines Popupfensters hinzu.
;h  = Handle des PopupMenus
;t  = Text der angezeigt werden soll oder "" für eine Trennlinie  (& vor Buchstaben für Shortcut)
;ID = Kennnummer, die von ShowPopupMenu zurückgegeben wird....
;s=Styles:   $8      Häckchen
;         $1000   Fett
;         $3      Ausgeschaltet (grau)
;         $80      Highlight (ausgewählt, blauer Hintergrund)
;         Flags können kombinert werden (durch Adition)
;subM = Handle des SubMenus, dass erscheinen soll, wenn man auf diesen Item kommt
;r = Punkte statt Häckchen verwenden (für nur eine Auswahl)



Function PM_DeleteItem(h,i)
   api_DeleteMenu(h,i,0)
End Function
;Löscht einen Eintrag aus einem Menu. Wenn das zu löschende Menü ein Untermenü hat, wird auch dessen
;Speciher freigegeben.
;h = Handle des Menüs, in dem sich der Eintrag befindet.
;i = Kennnummer des Eintrags.



Function PM_Show(h,x,y,w)

;***
;liest die Windowpositon aus, damit das PopUp an korrekter Stelle angezeigt werden kann
   b2=CreateBank(16)
   erg=api_GetWindowRect(w,b2)
   
   links  = PeekInt(b2,0)
   ;rechts = PeekInt(b2,8) ; wird hier nicht gebraucht
   oben   = PeekInt(b2,4)
   ;unten  = PeekInt(b2,12) ; wird hier nicht gebraucht
   
   FreeBank b2

; addiert Windowpositon zu den übergebenen Mauskoordinaten
   x=x+links
   y=y+oben

;***

   Return api_TrackPopupMenuEx(h,$100,x,y,w,0)
End Function
;Zeigt das Popup-Menu an.
;h = Handle des PopupMenus
;x,y = Position des Menus zur linken, oberen Bildschirmecke
;w = Handle des Fensters, das Parent für das Menu ist









Function PM_GetEnabled(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1

   api_GetMenuItemInfo(h,i,0,b1)

   t = Not(PeekInt(b1,12) And $3)/3
   
   FreeBank b1

   Return t
End Function
;Gibt zurück, ob ein Item ausgewählt werden kann.
;h = Handle des Menüs
;i = Kennnummer des Eintrags



Function PM_GetChecked(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1

   api_GetMenuItemInfo(h,i,0,b1)

   t = (PeekInt(b1,12) And $8)/8
   
   FreeBank b1

   Return t
End Function
;Gibt zurück, ob vor einem Menüeintrag ein Haken ist.
;h = Handle des Menüs
;i = Kennnummer des Eintrags



Function PM_GetText$(h,i)
   b2 = CreateBank(50)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$10
      PokeInt b1,36,ptr_helper__(b2,1,1)
      PokeInt b1,40,50

   api_GetMenuItemInfo(h,i,0,b1)

   For x = 0 To 49
      If PeekInt(b2,x)=0 Then Exit
      t$ = t + Chr(PeekByte(b2,x))
   Next

   FreeBank b1
   FreeBank b2

   Return t
End Function
;Gibt den Text eines Menüeintrags zurück.
;h = Handle des Menüs
;i = Kennnummer des Eintrags








Function PM_SetText(h,i,t$)
   b2 = CreateBank(Len(t)+1)
      For x = 1 To Len(t)
         PokeByte b2,x-1,Asc(Mid(t,x,1))
      Next
      PokeByte b2,x-1,0
     
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$10
      PokeInt b1,36,ptr_helper__(b2,1,1)
      PokeInt b1,40,Len(t)+1

   api_SetMenuItemInfo(h,i,0,b1)

   FreeBank b1
   FreeBank b2
End Function
;Ändert den Text eines Menuitems.
;h = Handle des PopupMenus
;i = Kennnummer des Items
;t = neuer Text


Function PM_EnableItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffffc)
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Macht, dass ein Menuitem wieder angewählt werden kann
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_DisableItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffffc)+$3
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Macht, dass ein Menuitem nicht angewählt werden kann
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_CheckItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffff7)+$8
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Häckelt ein MenuItem "an".
;h = Handle des PopupMenus
;i = Kennnummer des Items



Function PM_UncheckItem(h,i)
   b1 = CreateBank(44)
      PokeInt b1,0,44
      PokeInt b1,4,$1
   api_GetMenuItemInfo(h,i,0,b1)
   PokeByte b1,12,(PeekInt(b1,12) And $fffffff7)
   api_SetMenuItemInfo(h,i,0,b1)
   FreeBank b1
End Function
;Entfernt das Häckchen vor einem MenuItem.
;h = Handle des PopupMenus
;i = Kennnummer des Items
solitaire

Bob

BeitragDo, Dez 29, 2005 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Soli,

ich würde dein Beispiel gerne mal testen. Leider scheitert es bei mir an folgender Zeile.

erg=api_GetWindowRect(w,b2)

Meldung im Debugger. Function api_getwindowRect not found.

Hab ich irgendwo was übersehen?
In meinem Userlib Verzeichnis hab ich zuvor die kernel32 und user32.dll kopiert.
Beide decls Datein wurden auch angelegt.
Hast du einen Tip für mich?


Nachtrag:
Da fällt mir noch was ein. Ist es möglich die Schriftart des Popupmenüs auszutasuchen und das Menu zu skinnen? Also z.B. die Hintergrundfarbe des Popupmenüs zu verändern? Dann liese sich das Popup sehr schön für die eignen Games gbrauchen.

Danke.
  • Zuletzt bearbeitet von Bob am Do, Dez 29, 2005 13:32, insgesamt einmal bearbeitet
 

#Reaper

Newsposter

BeitragDo, Dez 29, 2005 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir kommt das gleich :-/ Sad
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Bob

BeitragDo, Dez 29, 2005 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Reaper,

getreu dem Motto: Hilf dir selbst ....

Ich hab da mal mit den deklarationen in der "user32.decls" rumprobiert.
Hier die komplette "user32.decls".
Damit sollte es klappen.


BlitzBasic: [AUSKLAPPEN]
.lib \"user32.dll\" 
api_CreatePopupMenu%():\"CreatePopupMenu\"
api_DestroyMenu(h):\"DestroyMenu\"
api_GetActiveWindow% () : \"GetActiveWindow\"
api_InsertMenuItem%(hMenu,uItem,fByPosition, lpmii*):\"InsertMenuItemA\"
api_DeleteMenu(hMenu,uPosition,uFlags):\"DeleteMenu\"
api_TrackPopupMenuEx%(hMenu,wFlags,x,y,HWnd,lptpm):\"TrackPopupMenuEx\"
api_GetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):\"GetMenuItemInfoA\"
api_SetMenuItemInfo%(hMenu,uItem,fByPosition,lpmii*):\"SetMenuItemInfoA\"
api_GetWindowRect%(hMenu,lpmii*):\"GetWindowRect\"



Gruß bob
 

#Reaper

Newsposter

BeitragDo, Dez 29, 2005 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, thx! Very Happy
Hatte es mir zwar angesehen,auch gesehen, das die funktion nicht da drinenn stand, aber ich weiß nicht, wie man das dann hinzufühgt^^
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group