Seite 1 von 2

PopUpMenu automatisch schließen, suche das handle fürs PopUp

Verfasst: 18.01.2008 20:26
von hjbremer
Hinweis: HandleProblem gelöst siehe neuen Code auf Seite 2

Habe eine Toolbar mit PopUpMenus
Zur Demo 3 Buttons. Beim 3.Button klappt das PopUp automatisch auf und soll beim verlassen verschwinden.

Problem: ich bekomme nicht korrekt heraus welches handle das PopUp Window hat. So wie ich es im Beispielcode im Callback gelöst habe
  • popid = GetWindow_(hwnd,#GW_HWNDFIRST)
kann es nicht richtig sein. Denn beim 2.Button bekomme gar keine Handle. Wer weiß wie ich an das handle vom aufgeklappten PopUp komme ?

Ich habe zwar die Timeout Funktion aktiviert mit #MNS_AUTODISMISS, aber die voreingestellte Zeit ist mir zu lang. Wer weiß wie ich diese Zeit ändere ?

Code: Alles auswählen

Declare   ToolBar_SetButtonInfo(tbid,menuid,iconid)

Declare myWindowCallback(hWnd, message, wParam, lParam) 

;nicht in PB definiert
#TBN_DROPDOWN=-710 
#TBSTYLE_DROPDOWN=$8    
#TBSTYLE_EX_DRAWDDARROWS=$1 
#BTNS_WHOLEDROPDOWN=$0080

Enumeration
#toolbar
#menuid1=10
#menuid2
#menuid3

#popup01
#popup01itemA
#popup01itemB
#popup01itemC
#popup01itemD
#popup01itemE
#popup01itemF
EndEnumeration

pop01ID=CreatePopupMenu(#popup01)
        MenuItem (#popup01itemA, "A")
        MenuItem (#popup01itemB, "B")
        MenuItem (#popup01itemC, "C")
        MenuItem (#popup01itemD, "D")
        MenuItem (#popup01itemF, "F")
        
;=====================================================      

#MIM_BACKGROUND=2 
#MIM_STYLE=16
#MNS_AUTODISMISS = $10000000 

Structure MENUINFO 
  cbSize.l 
  fMask.l 
  dwStyle.l 
  cyMax.l 
  hbrBack.l 
  dwContextHelpID.l 
  dwMenuData.l 
EndStructure 

farbe=365255 

MI.MENUINFO\cbSize=SizeOf(MENUINFO) 
MI\hbrBack=CreateSolidBrush_(farbe) 
MI\fMask=#MIM_BACKGROUND | #MIM_STYLE
MI\dwStyle=#MNS_AUTODISMISS

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 popid
      
      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 !! -710
                        
                        ;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) 
                                            popid = GetWindow_(hwnd,#GW_HWNDFIRST)
                                            
                        EndSelect
                        
                        result = 0 
                        
                     Case #TBN_DROPDOWN-3  ;Popup klappt beim verlassen automatisch auf
                        
                        SendMessage_(tbid, #TB_GETRECT, *msgTB\iItem, @rc.RECT) 
                        MapWindowPoints_(tbid,0, @rc, 2)
                        
                        Select *msgTB\iItem
                            Case #menuid3: DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom) 
                                            popid = GetWindow_(hwnd,#GW_HWNDFIRST)
                                            ;Debug popid
                                            ;GetCursorPos_(lpPoint.POINT) 
                                            ;id = WindowFromPoint_(lpPoint\X, lpPoint\Y) 
                                            ;Debug id 
                                    
                        EndSelect
                        
                        result = 0                                                  
                      
                  EndSelect 
  
           EndIf 
      
      ElseIf message=289
      
           GetCursorPos_(lpPoint.POINT) 
           id = WindowFromPoint_(lpPoint\X, lpPoint\Y) 
            
           ;Debug id 
            
           If id=hwnd 
              DestroyWindow_(popid)                       
           EndIf
      
      EndIf
       
   ProcedureReturn result 
EndProcedure
 

Verfasst: 18.01.2008 22:35
von Fluid Byte
Habe eine Toolbar mit PopUpMenus
Zur Demo 3 Buttons. Beim 3.Button klappt das PopUp automatisch auf und soll beim verlassen verschwinden.
Es ist genau andersrum. Nur damit ich es richtig verstehe...

Du willst wenn man mit der Maus über den dritten Button geht das Menü erscheint oder? Es macht auf jeden Fall keinen Sinn das es verschwindet wenn du den Button oder das Menü verlässt da ja eine Auswahlmöglichkeit bestehen muss.

Verfasst: 18.01.2008 22:57
von hjbremer
ich will genau das was für dich keinen Sinn macht. Es soll verschwinden. Außerdem erscheint es ja wenn ich den Mauszeiger auf den Button setze und den Button verlasse.

Aber das ist eh wurscht, denn es geht hauptsächlich um das Handle des PopUpMenus

PS: Schau nur mal auf die Seite der MSDN, wenn du oben rechts mit der Maus auf Microsoft kommst, dann klappt ein großes mehrspaltiges PopUp auf und verschwindet wieder wenn die Maus den Bereich verläßt

Verfasst: 18.01.2008 23:08
von Fluid Byte
Wie willst aus dem Menü was auswählen wenn es sofort verschwindet wenn du den Button verlässt?

Verfasst: 19.01.2008 00:00
von hjbremer
nicht wenn ich den Button verlasse, sondern das Menu verlasse
soll es verschwinden.

wenn ich den Button verlasse, erscheint das Menu, zumindest bei mir ! so soll es auch sein

Verfasst: 19.01.2008 09:23
von Andreas
Setz bei Style den Flag #MNS_MODELESS, dann kommen die weiteren
Messages im Callback sofort an, und nicht erst wenn das Menu verschwindet.
Du kannst dann Mousemove abfangen und darauf reagieren.

Dein angepasster Code :

Code: Alles auswählen

Declare ToolBar_SetButtonInfo(tbid,menuid,iconid)
Declare myWindowCallback(hWnd, message, wParam, lParam)

;nicht in PB definiert
#TBN_DROPDOWN=-710
#TBSTYLE_DROPDOWN=$8
#TBSTYLE_EX_DRAWDDARROWS=$1
#BTNS_WHOLEDROPDOWN=$0080

Enumeration
  #toolbar
  #menuid1=10
  #menuid2
  #menuid3
  
  #popup01
  #popup01itemA
  #popup01itemB
  #popup01itemC
  #popup01itemD
  #popup01itemE
  #popup01itemF
EndEnumeration

pop01ID=CreatePopupMenu(#popup01)
MenuItem (#popup01itemA, "A")
MenuItem (#popup01itemB, "B")
MenuItem (#popup01itemC, "C")
MenuItem (#popup01itemD, "D")
MenuItem (#popup01itemF, "F")

;=====================================================

#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

MI.MENUINFO\cbSize=SizeOf(MENUINFO)
MI\hbrBack=CreateSolidBrush_(farbe)
MI\fMask=#MIM_BACKGROUND | #MIM_STYLE 
MI\dwStyle=#MNS_AUTODISMISS | #MNS_MODELESS

SetMenuInfo_(pop01ID,MI)

SystemParametersInfo_(#SPI_SETACTIVEWINDOWTRACKING,0,#False,1)

;=====================================================

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 popid
  Static id
  Static IsKlick
  Static WinClip
  
  Select Message
  Case #WM_ACTIVATE
  Select wparam
  Case #WA_INACTIVE
        If IsImage(0)
        GetWindowRect_(WindowID(0),wr.RECT)
        DC = StartDrawing(ImageOutput(0))
        BitBlt_(GetWindowDC_(WindowID(0)),0,0,wr\right - wr\left,wr\bottom - wr\top,DC,0,0,#SRCCOPY)
        StopDrawing()
        EndIf
     ProcedureReturn 1
  EndSelect
  Case #WM_MOUSEMOVE
    If Isklick;nur wenn das Popupmenu gezeigt wird
      mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0);Mausklick senden
      isKlick = 0
    EndIf
  Case #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 !! -710
        ;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)
          popid = GetWindow_(hwnd,#GW_HWNDFIRST)
        EndSelect
        
      Case #TBN_DROPDOWN-3  ;Popup klappt beim verlassen automatisch auf
        SendMessage_(tbid, #TB_GETRECT, *msgTB\iItem, @rc.RECT)
        MapWindowPoints_(tbid,0, @rc, 2)
        GetWindowRect_(WindowID(0),wr.RECT)
        If IsImage(0)
        FreeImage(0)
        EndIf
        CreateImage(0,wr\right - wr\left,wr\bottom - wr\top)
        DC = StartDrawing(ImageOutput(0))
        BitBlt_(DC,0,0,wr\right - wr\left,wr\bottom - wr\top,GetWindowDC_(WindowID(0)),0,0,#SRCCOPY)
        StopDrawing()
        Select *msgTB\iItem
        Case #menuid3
          DisplayPopupMenu(#popup01, hWnd, rc\left,rc\bottom)
          IsKlick = 1
        EndSelect
      EndSelect
    EndIf
  EndSelect
  
  ProcedureReturn result
EndProcedure 

Verfasst: 19.01.2008 12:44
von hjbremer
Hallo ANDREAS, Danke für die Info. Das hatte ich nicht verstanden und darum auch nicht ausprobiert. Aber das ist mir nun dank dir klar geworden.
Aber dieser Style #MNS_MODELESS verändert nun auch die Farbe der Umrandung und es scheint so als ob es flackert bzw. die blaue Farbe wird hell, wenn das Popup erscheint.

Kann man das noch irgendwie abstellen ?
Und hast du eine Ahnung wie man diese TimeOut Zeit vom Style #MNS_AUTODISMISS ändert.
Und meine Methode das Handle des PopUpWindows heraus zubekommen und ich meine nicht das Handle vom Menu, ist das nun der einzige Weg oder kennst du einen besseren Weg.

grüße hjbremer

Verfasst: 19.01.2008 13:58
von Andreas
hjbremer hat geschrieben:Hallo ANDREAS, Danke für die Info. Das hatte ich nicht verstanden und darum auch nicht ausprobiert. Aber das ist mir nun dank dir klar geworden.
Aber dieser Style #MNS_MODELESS verändert nun auch die Farbe der Umrandung und es scheint so als ob es flackert bzw. die blaue Farbe wird hell, wenn das Popup erscheint.

Kann man das noch irgendwie abstellen ?
Und hast du eine Ahnung wie man diese TimeOut Zeit vom Style #MNS_AUTODISMISS ändert.
Und meine Methode das Handle des PopUpWindows heraus zubekommen und ich meine nicht das Handle vom Menu, ist das nun der einzige Weg oder kennst du einen besseren Weg.
Das die Farbe wechselt kann ich bei mir nicht feststellen, wird aber wohl am XP-Style liegen, ich bevorzuge die klassische Ansicht und da passiert das nicht.
Wie man die Timeoutzeit umstellen kann ist mir nicht bekannt, ebenso wie man das Handle anders feststellen könnte.

Mal sehen ob ich noch eine gute Lösung finden kann.

Verfasst: 19.01.2008 15:11
von hjbremer
Hallo ANDREAS:
Wie man die Timeoutzeit umstellen kann ist mir nicht bekannt, ebenso wie man das Handle anders feststellen könnte
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 !

Verfasst: 19.01.2008 15:37
von AND51
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...