Buttongadget / Imagegadget mit PopUpMenu
Verfasst: 23.01.2008 00:04
als Beispiel oder wer Spaß daran hat
Funktion: sowie der Mauszeiger den Button Bearbeiten oder den ImageButton berührt klappt ein PopUpMenu auf.
Es gibt nur eine kleine Einschränkung. Ein PopUpMenu darf keinen anderen PopUpButton berühren. Denn es klappt dann nicht mehr automatisch zu.
Wer von den CallbackExperten perfektioniert den Code damit dies nicht passiert ?
Funktion: sowie der Mauszeiger den Button Bearbeiten oder den ImageButton berührt klappt ein PopUpMenu auf.
Code: Alles auswählen
Declare myWindowCallback(hWnd, message, wParam, lParam)
#buttonbr=80
#buttonhh=30
Enumeration
#window
#buttonnr1=10
#buttonnr3
#buttonnr4
#listiconnr
#popup01
#popup01itemA
#popup01itemB
#popup01itemC
#popup01itemD
#popup01Ende
#popup02
#popup02itemA
#popup02itemB
#popup02itemC
#popup02Ende
EndEnumeration
;Image=====================================================
UseJPEGImageDecoder()
pfad1$=#PB_Compiler_Home+"Examples\Sources\Data\"
bitmap0ID = ImageID(LoadImage(#PB_Any,pfad1$+"terrain_detail.jpg"))
bitmap1ID = ResizeImage(LoadImage(#PB_Any,pfad1$+"PureBasicLogo.bmp"),#buttonbr,#buttonhh)
;PopUP=====================================================
pop01ID=CreatePopupMenu(#popup01)
MenuItem (#popup01itemA, "1.Zeile weg")
MenuItem (#popup01itemB, "letzte Zeile weg")
MenuItem (#popup01itemC, "mittlere Zeile weg")
MenuItem (#popup01itemD, "es passiert nix")
;usw
pop02ID=CreatePopupMenu(#popup02)
MenuItem (#popup02itemA, "in Spalte 1 steht Blubb")
MenuItem (#popup02itemB, "in Spalte 2 steht Guten Tag")
MenuItem (#popup02itemC, "Liste wird gelöscht")
;usw
Structure MENUINFO
cbSize.l
fMask.l
dwStyle.l
cyMax.l
hbrBack.l
dwContextHelpID.l
dwMenuData.l
EndStructure
#MIM_BACKGROUND=2
#MIM_STYLE=16
#MNS_AUTODISMISS = $10000000
MI.MENUINFO\cbSize=SizeOf(MENUINFO)
;MI\hbrBack=CreateSolidBrush_(farbe) ;irgendeine farbe
;oder
MI\hbrBack=CreatePatternBrush_(bitmap0ID)
MI\fMask=#MIM_BACKGROUND | #MIM_STYLE
MI\dwStyle=#MNS_AUTODISMISS
SetMenuInfo_(pop01ID,MI)
SetMenuInfo_(pop02ID,MI)
;=====================================================
WindowBreite = 700
WindowHoehe = 500
hWnd=OpenWindow(#window, 0,0, WindowBreite, WindowHoehe, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
idnr1=ButtonGadget(#buttonnr1, 100,450,#buttonbr,#buttonhh,"Zeile add")
idnr3=ButtonGadget(#buttonnr3, 200,450,#buttonbr,#buttonhh,"Bearbeiten")
idnr4=ButtonImageGadget(#buttonnr4, 350,50,#buttonbr,#buttonhh,bitmap1ID)
sp=10:ze=10
idlig=ListIconGadget(#listiconnr,sp,ze,300+4,400,"Spalte1",100)
AddGadgetColumn(#listiconnr,1,"spalte2",100)
AddGadgetColumn(#listiconnr,2,"spalte3",100)
SendMessage_(idlig,#LVM_SETTEXTCOLOR,0,#Blue)
SendMessage_(idlig,#LVM_SETBKCOLOR,0,GetSysColor_(#COLOR_BTNFACE))
SendMessage_(idlig,#LVM_SETTEXTBKCOLOR,0,GetSysColor_(#COLOR_BTNFACE))
SetWindowCallback(@myWindowCallback())
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget Or EventID = #PB_Event_Menu
welcherButton=EventGadget()
Select welcherButton
Case #buttonnr1
nr+1
AddGadgetItem(#listiconnr,-1,"Hallo"+#LF$+"Testnr "+Str(nr)+#LF$+Str(Date()))
Case #popup01itemA
RemoveGadgetItem(#listiconnr,0)
Case #popup01itemB
anz = CountGadgetItems(#listiconnr)-1
RemoveGadgetItem(#listiconnr,anz)
Case #popup01itemC
anz = CountGadgetItems(#listiconnr)-1
RemoveGadgetItem(#listiconnr,anz/2)
Case #popup02itemA
anz = CountGadgetItems(#listiconnr)-1
For j=0 To anz
SetGadgetItemText(#listiconnr,j,"Blubb",0)
Next
Case #popup02itemB
anz = CountGadgetItems(#listiconnr)-1
For j=0 To anz
SetGadgetItemText(#listiconnr,j,"Guten Tag "+Str(j+1),1)
Next
Case #popup02itemC
ClearGadgetItemList(#listiconnr)
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
End
Procedure myWindowCallback(hWnd, Message, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Static popflag ,popbutton
Select Message
Case #WM_NOTIFY
;diese Struktur sagt von welchem Gadget und was ist wo passiert
*nmhdr.NMHDR = lParam
Select *nmhdr\idfrom
Case #buttonnr3, #buttonnr4
Select *nmhdr\code
Case -1249 ;Popup klappt beim berühren des Button automatisch auf
;if else weil -1249 2x kommt und popflag gelöscht werden muß
;beim 1.mal ist popflag=0 und IF popflag=0 ist wahr
;beim 2.mal ist popflag=1 und der ELSE Teil löscht popflag
If popflag=0
popflag=1
;hole Posi vom Button
popbutton=*nmhdr\hwndfrom
GetWindowRect_(popbutton,r.rect)
;PopUp ab linke obere Ecke, damit Button verdeckt ist
Select *nmhdr\idfrom
Case #buttonnr3: DisplayPopupMenu(#popup01, hWnd, r\left,r\top)
Case #buttonnr4: DisplayPopupMenu(#popup02, hWnd, r\left,r\top)
EndSelect
Else
popflag=0
EndIf
EndSelect
;Case irgendeinandererButton
; für irgendwas anderes
EndSelect
Case #WM_COMMAND
;wenn menueintrag angeklickt
If popflag
GetWindowRect_(popbutton,r.rect)
SetCursorPos_(r\right+10,r\bottom+5)
EndIf
Case #WM_ENTERIDLE
If popflag ; damit diese message nur fürs Popup ausgewertet wird
;#WM_ENTERIDLE stellt das handle fürs PopupWindow in lParam
popid=lparam
;solange Mauszeiger im Popup ist, id=popid
GetCursorPos_(p.POINT)
id = WindowFromPoint_(p\X, p\Y)
;wenn Mauszeiger Popup verläßt
If id<>popid
DestroyWindow_(popid)
EndIf
EndIf
EndSelect
ProcedureReturn result
EndProcedure
Wer von den CallbackExperten perfektioniert den Code damit dies nicht passiert ?