Seite 2 von 2

Verfasst: 19.01.2008 16:09
von Andreas
hjbremer hat geschrieben: Du brauchst nicht mehr nach dem Handle suchen. Es ist so einfach, wenn ich nur richtig lesen/suchen/denken würde.
Die Message 289 entspricht #WM_ENTERIDLE und da steht in der MSDN
Value of lParam. Contains the handle of the dialog box (if fuSource is MSGF_DIALOGBOX) or of the window containing the displayed menu (if fuSource is MSGF_MENU).
folglich ist das Handle vom PopUpFenster = lParam !
OK !

Vielleicht habe ich auch eine Lösung für die Farbänderung gefunden.
Habe den obigen Code upgedatet.

Ich mache einfach ein Bild vom Fensterinhalt ( mitsamt Rahmen ), prüfe im Programm auf WM_Activate und zeichne dort den Rahmen neu.
Das geht relativ fix, bei mir flackert da auch nichts mehr.

Verfasst: 19.01.2008 16:16
von Andreas
AND51 hat geschrieben:Ich weiß nicht, ob ich richtig verstanden habe was hier abgeht, aber wenn du das Handle eines (PopUp-)Menus suchst, fährst du mit MenuID() schon ganz gut...
Das Popupmenu wird in einem eigenen Fenster angezeigt, je nachdem wie die Eigenschaften bei SetMenuInfo_() gesetzt werden Modal ( mit eigenem Messageloop ) oder Modeless ( ohne Messageloop). Und um dieses Fensterhandle geht es, das ist nicht identisch mit MenuID.

Verfasst: 20.01.2008 00:58
von hjbremer
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