Hier nun ein neue Version von meinem Code.
das Handle des PopUpWindows wird nun eindeutig ermittelt siehe Callback. Außerdem ein Flag eingesetzt, damit andere Popups nicht gestört werden. z.B.das Systemmenu.
Wer mehr mit den PopUps machen will, als ich in diesem Fall, sollte sich an ANDREAS seinen Lösungsweg halten.
Mir reicht meine Version. Als Gimnick habe ich mal den Hintergrund des PopUps verschönert.
Durch die Verwendung der NMTBHOTITEM Struktur klappt das PopUp jetzt auf beim Berühren und nicht erst beim verlassen.
Code: Alles auswählen
Declare ToolBar_SetButtonInfo(tbid,menuid,iconid)
Declare myWindowCallback(hWnd, message, wParam, lParam)
;nicht in PB definiert
#TBSTYLE_DROPDOWN =$8
#TBSTYLE_EX_DRAWDDARROWS=$1
#BTNS_WHOLEDROPDOWN =$0080
#TBN_DROPDOWN =-710
#TBN_HOTITEMCHANGE =-713
Enumeration
#toolbar
#menuid1=10
#menuid2
#menuid3
#popup01
#popup01itemA
#popup01itemB
#popup01itemC
#popup01itemD
#popup01itemE
#popup01itemF
EndEnumeration
pop01ID=CreatePopupMenu(#popup01)
MenuItem (#popup01itemA, "Aaaaa")
MenuItem (#popup01itemB, "Bbbbbb")
MenuItem (#popup01itemC, "Cccccccc")
MenuItem (#popup01itemD, "Dcccc")
MenuItem (#popup01itemF, "Fcc")
;=====================================================
#MIM_BACKGROUND=2
#MIM_STYLE=16
#MNS_AUTODISMISS = $10000000
#MNS_MODELESS = $40000000
Structure MENUINFO
cbSize.l
fMask.l
dwStyle.l
cyMax.l
hbrBack.l
dwContextHelpID.l
dwMenuData.l
EndStructure
farbe=365255
UseJPEGImageDecoder()
pfad1$=#PB_Compiler_Home+"Examples\Sources\Data\"
bitmap0ID = ImageID(LoadImage(#PB_Any,pfad1$+"clouds.jpg"))
MI.MENUINFO\cbSize=SizeOf(MENUINFO)
;MI\hbrBack=CreateSolidBrush_(farbe)
MI\hbrBack=CreatePatternBrush_(bitmap0ID)
MI\fMask=#MIM_BACKGROUND | #MIM_STYLE
MI\dwStyle=#MNS_AUTODISMISS ;| #MNS_MODELESS = siehe ANDREAS seine Beiträge
SetMenuInfo_(pop01ID,MI)
;=====================================================
WindowBreite = 700
WindowHoehe = 500
OpenWindow(0, 0,0, WindowBreite, WindowHoehe, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
tbid = CreateToolBar(#toolbar, WindowID(0))
ToolBarStandardButton(#menuid1, 0)
ToolBarStandardButton(#menuid2, 0)
ToolBarStandardButton(#menuid3, 0)
ToolBar_SetButtonInfo(tbid,#menuid1,0) ;image 0
ToolBar_SetButtonInfo(tbid,#menuid2,1) ;image 1
ToolBar_SetButtonInfo(tbid,#menuid3,2) ;image 2 ;
SetWindowCallback(@myWindowCallback())
Repeat
EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow
End
Procedure ToolBar_SetButtonInfo(tbid,menuid,iconid)
;change toolbar exStyle = kann Pfeil malen
exstyle=SendMessage_(tbid,#TB_GETEXTENDEDSTYLE,0,0)
SendMessage_(tbid,#TB_SETEXTENDEDSTYLE,0,exstyle | #TBSTYLE_EX_DRAWDDARROWS)
;Struktur füllen
Button.TBBUTTONINFO
Button\cbSize = SizeOf(TBBUTTONINFO)
Button\dwMask = #TBIF_COMMAND |#TBIF_SIZE | #TBIF_IMAGE | #TBIF_STATE | #TBIF_STYLE
Button\idCommand = menuid
Button\iImage = iconid
Button\fsState = #TBSTATE_ENABLED
Button\fsStyle = #TBSTYLE_DROPDOWN | #BTNS_WHOLEDROPDOWN
Button\cx = 50
;ButtonInfo an Toolbar senden
SendMessage_(tbid, #TB_SETBUTTONINFO, menuid, Button.TBBUTTONINFO)
EndProcedure
Procedure myWindowCallback(hWnd, Message, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Shared tbid
Static popflag
If Message = #WM_NOTIFY
*nmhdr.NMHDR = lParam ;für andere Auswertungen von #WM_NOTIFY
*msgTB.nmToolbar=lParam
If *msgTB\hdr\hwndfrom = tbid
Select *msgTB\hdr\code
Case #TBN_DROPDOWN ;click auf pfeil !!
;hole position button
SendMessage_(tbid, #TB_GETRECT, *msgTB\iItem, @rc.RECT)
MapWindowPoints_(tbid,0, @rc, 2)
Select *msgTB\iItem
Case #menuid1: DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom)
Case #menuid2: DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom)
Case #menuid3: DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom)
EndSelect
result = 0
Case #TBN_HOTITEMCHANGE ;Popup klappt beim berühren des Button automatisch auf
*hot.NMTBHOTITEM=lParam
SendMessage_(tbid, #TB_GETRECT, *hot\idnew, @rc.RECT)
MapWindowPoints_(tbid,0, @rc, 2)
Select *hot\idnew
Case #menuid1: popflag=1:DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom)
Case #menuid2: popflag=1:DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom)
Case #menuid3: popflag=1:DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom)
EndSelect
result = 0
EndSelect
EndIf
ElseIf message=#WM_ENTERIDLE ;=289
If popflag ; damit diese message nur fürs Popup ausgewertet wird
GetCursorPos_(lpPoint.POINT)
id = WindowFromPoint_(lpPoint\X, lpPoint\Y)
If id=hwnd
popflag=0
;#WM_ENTERIDLE stellt das handle fürs PopupWindow in lParam
popid=lParam
DestroyWindow_(popid)
EndIf
EndIf
EndIf
ProcedureReturn result
EndProcedure