[B+]Popupmenu
Übersicht

![]() |
simiBetreff: [B+]Popupmenu |
![]() Antworten mit Zitat ![]() |
---|---|---|
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!! ![]() cu simi |
||
![]() |
Sebastian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wieso ist sowas immer für nur B+ ???
5 Zeilen Abgeändert und schon läaft es auch für B3d : BlitzBasic: [AUSKLAPPEN]
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei mir kommt das gleich :-/ ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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\" Gruß bob |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, thx! ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group