Window that behaves like a popup menu

Just starting out? Need help? Post your questions and find answers here.
javabean
User
User
Posts: 60
Joined: Sat Nov 08, 2003 10:29 am
Location: Austria

Window that behaves like a popup menu

Post by javabean »

Hi,
I need a window, that more or less behaves like a popup menu. That means a click somewhere outside of the window (i.e. the window loses its focus) will close the window.
I know that sounds easy to do, but I'm not able to get my testcode running without an IMA (when I try to open the window again)...

Code: Select all

Macro LOWORD(Value)
  Value & $FFFF
EndMacro


Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  
  If IsWindow(1)
    If uMsg = #WM_ACTIVATE And LOWORD(wParam) = #WA_INACTIVE  ;window loses focus
      
      If hWnd = WindowID(1)
        CloseWindow(1)
      EndIf
        
    EndIf 
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 



If OpenWindow(0,0,0,320,240,"parent",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(0,10,10,100,25,"Show Popup")
  
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        
        Select EventWindow()
          Case  0
            quit = 1
            
          Case  1
            CloseWindow(1)          
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
          Case  0
            If IsWindow(1) = 0
              If OpenWindow(1,0,0,250,120,"Popup",#PB_Window_SystemMenu, WindowID(0))      
                ButtonGadget(1,10,10,100,25,"Close Popup")
                SetWindowCallback(@WinCallback(), 1)
              EndIf
            EndIf
            
          Case  1
            If IsWindow(1)
            CloseWindow(1)
            SetWindowCallback(#Null, 1)   
            EndIf      
            
        EndSelect       
        
    EndSelect
    
  Until quit = 1
  
EndIf
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Window that behaves like a popup menu

Post by RASHAD »

Code: Select all

Macro LOWORD(Value)
  Value & $FFFF
EndMacro


Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  
  If IsWindow(1)
    If uMsg = #WM_ACTIVATE And LOWORD(wParam) = #WA_INACTIVE  ;window loses focus
      
      If hWnd = WindowID(1)
        SetWindowCallback(0, 1) 
        CloseWindow(1)
      EndIf
        
    EndIf 
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 



If OpenWindow(0,0,0,320,240,"parent",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(0,10,10,100,25,"Show Popup")
  
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        
        Select EventWindow()
          Case  0
            quit = 1
            
          Case  1
            CloseWindow(1)          
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
          Case  0
            If IsWindow(1) = 0
              If OpenWindow(1,0,0,250,120,"Popup",#PB_Window_SystemMenu, WindowID(0))      
                ButtonGadget(1,10,10,100,25,"Close Popup")
                SetWindowCallback(@WinCallback(), 1)
              EndIf
            EndIf
            
          Case  1
            If IsWindow(1)
            SetWindowCallback(0, 1)  
            CloseWindow(1)             
            EndIf      
            
        EndSelect       
        
    EndSelect
    
  Until quit = 1
  
EndIf

Egypt my love
Nituvious
Addict
Addict
Posts: 1027
Joined: Sat Jul 11, 2009 4:57 am
Location: United States

Re: Window that behaves like a popup menu

Post by Nituvious »

Would something like this be useable?

Code: Select all

Macro LOWORD(Value)
  Value & $FFFF
EndMacro


Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  
  If IsWindow(1)
    If uMsg = #WM_ACTIVATE And LOWORD(wParam) = #WA_INACTIVE  ;window loses focus
      
      If hWnd = WindowID(1)
        HideWindow(1, 1)
      EndIf
        
    EndIf 
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 



If OpenWindow(0,0,0,320,240,"parent",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ButtonGadget(0,10,10,100,25,"Show Popup")
  OpenWindow(1, 0, 0, 200, 200, "popup", #PB_Window_BorderLess| #PB_Window_Invisible, WindowID(0))
  ButtonGadget(1,10,10,100,25,"Close Popup")
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        
        Select EventWindow()
          Case  0
            quit = 1
            
          Case  1
            CloseWindow(1)          
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
          Case  0
            ;If IsWindow(1) = 0
              ;If OpenWindow(1,0,0,250,120,"Popup",#PB_Window_SystemMenu, WindowID(0))      
              ;  ButtonGadget(1,10,10,100,25,"Close Popup")
              	HideWindow(1, 0)
                SetWindowCallback(@WinCallback(), 1)
              ;EndIf
           ; EndIf
            
          Case  1
            If IsWindow(1)
            HideWindow(1, 1)
            SetWindowCallback(#Null, 1)   
            EndIf      
            
        EndSelect       
        
    EndSelect
    
  Until quit = 1
  
EndIf
▓▓▓▓▓▒▒▒▒▒░░░░░
javabean
User
User
Posts: 60
Joined: Sat Nov 08, 2003 10:29 am
Location: Austria

Re: Window that behaves like a popup menu

Post by javabean »

Thanks again, Rashad
I haven't seen the wood for the trees...

@Nituvious:
Thanks for your suggestion, but I really want to close the window...
User avatar
Michael Vogel
Addict
Addict
Posts: 2797
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Window that behaves like a popup menu

Post by Michael Vogel »

Another variation...

Code: Select all

Global MainHandle

Enumeration
	#PopOn
	#PopOff
	#WinMain
	#WinPopup
	#WinClose
EndEnumeration

#PB_Shortcut_SrodFlag=1<<16

Procedure WinCallback(hWnd, uMsg, wParam, lParam)

	If uMsg=#WM_ACTIVATE And wParam&$FFFF=#WA_INACTIVE
		If hWnd=WindowID(#WinPopup)
			PostMessage_(MainHandle,#WM_COMMAND,#PB_Shortcut_SrodFlag|#PopOff,0)
		EndIf
	EndIf

	ProcedureReturn #PB_ProcessPureBasicEvents

EndProcedure

MainHandle=OpenWindow(#WinMain,0,0,320,240,"parent",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#PopOn,10,10,100,25,"Show Popup")
AddKeyboardShortcut(#WinMain,#PB_Shortcut_P,#PopOn)
AddKeyboardShortcut(#WinMain,#PB_Shortcut_Escape,#WinClose)

OpenWindow(#WinPopup,0,0,200, 200, "popup",#PB_Window_Invisible,MainHandle)
ButtonGadget(#PopOff,10,10,100,25,"Close Popup")
AddKeyboardShortcut(#WinPopup,#PB_Shortcut_P,#PopOff)
AddKeyboardShortcut(#WinPopup,#PB_Shortcut_Escape,#WinClose)

Repeat

	Select WaitWindowEvent()

	Case #PB_Event_CloseWindow
		PostMessage_(MainHandle,#WM_COMMAND,#PB_Shortcut_SrodFlag|#WinClose,0)

	Case #PB_Event_Gadget,#PB_Event_Menu
		Select EventGadget()
		Case #PopOn
			If IsWindowVisible_(WindowID(#WinPopup))=#False
				ResizeWindow(#WinPopup,DesktopMouseX(),DesktopMouseY(),#PB_Ignore,#PB_Ignore)
				;DisableWindow(#WinMain,1)
				HideWindow(#WinPopup,0)
				SetWindowCallback(@WinCallback(),#WinPopup)
			EndIf

		Case #PopOff
			If IsWindow(#WinPopup)
				SetWindowCallback(0,#WinPopup)
				HideWindow(#WinPopup,1)
				;DisableWindow(#WinMain,0)
				SetActiveWindow(#WinMain)
			EndIf

		Case #WinClose
			Select EventWindow()
			Case #WinMain
				quit=#True

			Case #WinPopup
				PostMessage_(MainHandle,#WM_COMMAND,#PB_Shortcut_SrodFlag|#PopOff,0)
			EndSelect

		EndSelect
	EndSelect
Until quit

Post Reply