Sushi Posted March 9, 2015 Posted March 9, 2015 Hi, I am having some trouble working around creating inputs within smaller windows in different tabs. Basically, I want to press a button on one tab and create inputs on the second and third tab. My trouble is having the label and inputs display correctly on the child windows within these tabs. Without the child windows, I can just use GUISwitch() to manage tabs and create inputs. Is there a function or method used to correctly switch the handle to the child windows? I am posting the code for reference of what I am trying to do. expandcollapse popup#include <WindowsConstants.au3> #include <StaticConstants.au3> #include <guiconstants.au3> ;Set a HotKey HotKeySet("{ESC}", "Quit") Main() Func Main() ;Create a GUI Global $handleGUI = GUICreate("", 800, 600) ;Create label GUICtrlCreateLabel("", 0, 0, 1, 1, BitOR($SS_NOTIFY, $SS_CENTER, $SS_SUNKEN)) ;Create tab Global $Tab = GUICtrlCreateTab(5, 5, 790, 550) ;Create Tab item 1 and set color Global $Tab1 = GUICtrlCreateTabItem ("Tab1") Global $Button = GUICtrlCreateButton("Button", 350, 250, 85, 25) GUICtrlCreateTabItem("") GUISetState(@SW_SHOW) ;Create Tab item 2 and set color Global $Tab2 = GUICtrlCreateTabItem ("Tab2") GUICtrlCreateLabel("", 15, 95) GUICtrlCreateTabItem("") ;Create Tab item 3 and set color Global $Tab3 = GUICtrlCreateTabItem ("Tab3") GUICtrlCreateTabItem("") ;Create small window in Tab 3 Global $Window = GUICreate("", 780, 520, 9, 30, $WS_POPUP, BitOR($WS_EX_CLIENTEDGE, $WS_EX_MDICHILD), $handleGUI) GUISetBkColor(0xF5F5F5) ; Just to show the GUI clearly GUISetState(@SW_SHOW, $Window) GUICtrlCreateTabItem ("") ;Create small window in Tab 2 GUISwitch($handleGUI, $Tab2) Global $Window1 = GUICreate("", 780, 520, 9, 30, $WS_POPUP, BitOR($WS_EX_CLIENTEDGE, $WS_EX_MDICHILD), $handleGUI) GUISetBkColor(0xF5F5F5) ; Just to show the GUI clearly GUISetState(@SW_HIDE, $Window1) GUICtrlCreateTabItem("") ; Loop until the user exits While 1 If GUICtrlRead($Tab) = 0 Then GUISetState(@SW_HIDE, $Window) GUISetState(@SW_HIDE, $Window1) EndIf If GUICtrlRead($Tab) = 1 Then GUISetState(@SW_HIDE, $Window) GUISetState(@SW_SHOW, $Window1) EndIf If GUICtrlRead($Tab) = 2 Then GUISetState(@SW_SHOW, $Window) GUISetState(@SW_HIDE, $Window1) EndIf Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $Button ;Create Inputs GUICtrlDelete($Button) CreateInputTab2() CreateInputTab3() EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($handleGUI) EndFunc ;==>Main Func Quit() Exit EndFunc Func CreateInputTab2() GUISwitch($handleGUI, $Tab2) GUICtrlCreateLabel("Input 2 :", 150, 150) GuiCtrlCreateInput("", 200, 150) EndFunc Func CreateInputTab3() GUISwitch($handleGUI, $Tab3) GUICtrlCreateLabel("Input 3 :", 150, 150) GuiCtrlCreateInput("", 200, 150) EndFunc
Moderators Melba23 Posted March 9, 2015 Moderators Posted March 9, 2015 Sushi,This seems to work as you wish: expandcollapse popup#include <WindowsConstants.au3> #include <StaticConstants.au3> #include <guiconstants.au3> ;Set a HotKey HotKeySet("{ESC}", "Quit") Main() Func Main() ;Create a GUI Global $handleGUI = GUICreate("", 800, 600) ;Create label GUICtrlCreateLabel("", 0, 0, 1, 1, BitOR($SS_NOTIFY, $SS_CENTER, $SS_SUNKEN)) ;Create tab Global $Tab = GUICtrlCreateTab(5, 5, 790, 550) ;Create Tab item 1 and set color Global $Tab1 = GUICtrlCreateTabItem ("Tab1") Global $Button = GUICtrlCreateButton("Button", 350, 250, 85, 25) ;Create Tab item 2 and set color Global $Tab2 = GUICtrlCreateTabItem ("Tab2") GUICtrlCreateLabel("", 15, 95) ;Create Tab item 3 and set color Global $Tab3 = GUICtrlCreateTabItem ("Tab3") GUICtrlCreateTabItem("") ; Only needed once ;Create small window in Tab 3 Global $Window = GUICreate("Tab 3 GUI", 780, 520, 9, 30, $WS_POPUP, BitOR($WS_EX_CLIENTEDGE, $WS_EX_MDICHILD), $handleGUI) GUISetBkColor(0xFF0000) ; Just to show the GUI clearly GUISetState(@SW_HIDE, $Window) ;Create small window in Tab 2 GUISwitch($handleGUI, $Tab2) Global $Window1 = GUICreate("Tab 2 GUI", 780, 520, 9, 30, $WS_POPUP, BitOR($WS_EX_CLIENTEDGE, $WS_EX_MDICHILD), $handleGUI) GUISetBkColor(0x00FF00) ; Just to show the GUI clearly GUISetState(@SW_HIDE, $Window1) GUISetState(@SW_SHOW, $handleGUI) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $Button ;Create Inputs GUICtrlDelete($Button) CreateInputTab2() CreateInputTab3() Case $Tab Switch GUICtrlRead($Tab) Case 0 GUISetState(@SW_HIDE, $Window) GUISetState(@SW_HIDE, $Window1) Case 1 GUISetState(@SW_HIDE, $Window) GUISetState(@SW_SHOW, $Window1) Case 2 GUISetState(@SW_SHOW, $Window) GUISetState(@SW_HIDE, $Window1) EndSwitch EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($handleGUI) EndFunc ;==>Main Func Quit() Exit EndFunc Func CreateInputTab2() ; Switch to the child GUI GUISwitch($Window1) ; Create controls GUICtrlCreateLabel("Input 2 :", 150, 150) GuiCtrlCreateInput("", 200, 150) ; Switch back GUISwitch($handleGUI) EndFunc Func CreateInputTab3() GUISwitch($Window) GUICtrlCreateLabel("Input 3 :", 150, 150) GuiCtrlCreateInput("", 200, 150) GUISwitch($handleGUI) EndFuncPlease ask if you have any questions. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Solution mpower Posted March 10, 2015 Solution Posted March 10, 2015 (edited) I would use @SW_SHOWNOACTIVATE for a more elegant approach when switching tabs, otherwise the main GUI loses focus. Case $Tab Switch GUICtrlRead($Tab) Case 0 GUISetState(@SW_HIDE, $Window) GUISetState(@SW_HIDE, $Window1) Case 1 GUISetState(@SW_HIDE, $Window) GUISetState(@SW_SHOWNOACTIVATE, $Window1) Case 2 GUISetState(@SW_SHOWNOACTIVATE, $Window) GUISetState(@SW_HIDE, $Window1) EndSwitch I would also probably look into resolving the issues of clicking on the child gui resulting in loss of focus. For ideas on how to tackle the focus issue see here: /?do=embed' frameborder='0' data-embedContent>> Final solution: expandcollapse popup#include <WindowsConstants.au3> #include <StaticConstants.au3> #include <guiconstants.au3> ;Set a HotKey HotKeySet("{ESC}", "Quit") Main() Func Main() ;Create a GUI Global $handleGUI = GUICreate("", 800, 600) ;Create label GUICtrlCreateLabel("", 0, 0, 1, 1, BitOR($SS_NOTIFY, $SS_CENTER, $SS_SUNKEN)) ;Create tab Global $Tab = GUICtrlCreateTab(5, 5, 790, 550) ;Create Tab item 1 and set color Global $Tab1 = GUICtrlCreateTabItem ("Tab1") Global $Button = GUICtrlCreateButton("Button", 350, 250, 85, 25) ;Create Tab item 2 and set color Global $Tab2 = GUICtrlCreateTabItem ("Tab2") GUICtrlCreateLabel("", 15, 95) ;Create Tab item 3 and set color Global $Tab3 = GUICtrlCreateTabItem ("Tab3") GUICtrlCreateTabItem("") ; Only needed once ;Create small window in Tab 3 Global $Window = GUICreate("Tab 3 GUI", 780, 520, 9, 30, $WS_POPUP, BitOR($WS_EX_CLIENTEDGE, $WS_EX_MDICHILD), $handleGUI) GUISetBkColor(0xFF0000) ; Just to show the GUI clearly GUISetState(@SW_HIDE, $Window) ;Create small window in Tab 2 GUISwitch($handleGUI, $Tab2) Global $Window1 = GUICreate("Tab 2 GUI", 780, 520, 9, 30, $WS_POPUP, BitOR($WS_EX_CLIENTEDGE, $WS_EX_MDICHILD), $handleGUI) GUISetBkColor(0x00FF00) ; Just to show the GUI clearly GUISetState(@SW_HIDE, $Window1) GUISetState(@SW_SHOW, $handleGUI) GUIRegisterMsg( $WM_NCACTIVATE, "WM_NCACTIVATE" ) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $Button ;Create Inputs GUICtrlDelete($Button) CreateInputTab2() CreateInputTab3() Case $Tab Switch GUICtrlRead($Tab) Case 0 GUISetState(@SW_HIDE, $Window) GUISetState(@SW_HIDE, $Window1) Case 1 GUISetState(@SW_HIDE, $Window) GUISetState(@SW_SHOWNOACTIVATE, $Window1) Case 2 GUISetState(@SW_SHOWNOACTIVATE, $Window) GUISetState(@SW_HIDE, $Window1) EndSwitch EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($handleGUI) EndFunc ;==>Main Func Quit() Exit EndFunc ; Prevent child windows in making GUI title bar dimmed Func WM_NCACTIVATE( $hWnd, $iMsg, $wParam ) If $hWnd = $handleGUI Then If Not $wParam Then Return 1 EndIf Return $GUI_RUNDEFMSG EndFunc Func CreateInputTab2() ; Switch to the child GUI GUISwitch($Window1) ; Create controls GUICtrlCreateLabel("Input 2 :", 150, 150) GuiCtrlCreateInput("", 200, 150) ; Switch back GUISwitch($handleGUI) EndFunc Func CreateInputTab3() GUISwitch($Window) GUICtrlCreateLabel("Input 3 :", 150, 150) GuiCtrlCreateInput("", 200, 150) GUISwitch($handleGUI) EndFunc Edited March 10, 2015 by mpower
Sushi Posted March 10, 2015 Author Posted March 10, 2015 Thank you guys so much! I didn't even realize I was losing focus on my main GUI. To better understand Func WM_NCACTIVATE( $hWnd, $iMsg, $wParam ), I have read over the MSDN and still am a bit confused. From what I am understanding, windows sends a WM_NCACTIVATE message every time a window handle parameter is changed? I am having trouble seeing where all of the arguments are coming from.
mpower Posted March 10, 2015 Posted March 10, 2015 Sushi, They way I understand is that the WM_NCACTIVATE message is sent any time the non-client area (i.e. title bar, title icon etc) needs to change state - to become active or not active (in simpler terms, to gain or lose focus). Usually this happens when you click a control in a client area or the client area itself. So by intercepting the message we can prevent the child GUI from becoming active even though we're clicking on the client area/controls within client area. Hope this helps Cheers!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now