Jump to content

WM_NOTIFY Issue with resize?


Go to solution Solved by binhnx,

Recommended Posts

Added WM_NOTIFY to my code to handle events from a couple controls (Toolbar button clicks and Treeview events) 

Simply defining WM_NOTIFY and putting in the function makes my GUI go crazy when I resize it, more so when I maximize. 

If I comment out all the WM_NOTIFY code - it resizes and runs correctly. 

Any advice?

(The code below runs correctly, to see the problem uncomment  the WM_NOTIFY function.)

Edit**** 

I have verified that this isn't anything inside of the WM_NOTIFY function. It is simply the function itself. 

If you uncomment only the function, the force ref, the return and the endfunc. It will still produce the same issue when you maximize / resize the window. 

#Region Includes
#include <winapi.au3>
#include <WinAPIEx.au3>
#include <GuiToolbar.au3>
#include <GuiImageList.au3>
#include <GUIConstants.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUITab.au3>
#include <GuiTreeView.au3>

#EndRegion

AutoItSetOption('MouseCoordMode', 2)

GUIRegisterMsg($WM_SIZE, "WM_SIZE")
;~ GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

#Region Vars
;Only Tested on Win7 64 machine
Local $fIconsLoc1 = "imageres.dll"
Local $fIconsLoc2 = "Resources\Icons\Undo.ico"

Global $aStrings[12]
Local $iNew,$iBrowse,$iEdit,$iDelete,$iSave,$iPrint
Global Enum $e_new =1000, $e_edit, $e_delete, $e_save, $e_print, $e_undo
Global $aOffsets_1, $aOffsets_inner1,$aOffsets_inner2
Global $iItem, $cTreeView1, $cTreeView2

; Icon Index from DLL
$iNew = 2
;$iBrowse = 202
$iEdit = 111
$iDelete = 84
$iSave = 23
$iPrint = 46

$iGuiWidth = 660
$iGUIHeight = 320

$DividerOffset = 250
Global $aOffsets_1[2],$aOffsets_inner1[2],$aOffsets_inner2[2]

$BkColor = 0xf0f0f0

;Create Form, Toobar and ImageList
$hGui = GUICreate("EDM and CNC Schedule",$iGuiWidth,$iGUIHeight,-1,-1, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP,$WS_CLIPCHILDREN))
_WinAPI_SetClassLongEx($hGui, $GCL_STYLE, BitAND(_WinAPI_GetClassLongEx($hGui, $GCL_STYLE), BitNOT(1), BitNOT(2)))
GUISetState()

Global $hToolbar1 = _GUICtrlToolbar_Create($hGui)
$imgs = _GUIImageList_Create(32,32,5) ; change first 2 params to Size the icons accordingly.

#EndRegion Vars

#Region Toolbar
;Populate Image List
_GUIImageList_AddIcon($imgs, $fIconsLoc1,$iNew,True)
_GUIImageList_AddIcon($imgs, $fIconsLoc1,$iEdit,True)
_GUIImageList_AddIcon($imgs, $fIconsLoc1,$iDelete,True)
_GUIImageList_AddIcon($imgs, $fIconsLoc1,$iSave,True)
_GUIImageList_AddIcon($imgs, $fIconsLoc1,$iPrint,True)
_GUIImageList_AddIcon($imgs, $fIconsLoc2,0,True)

;Add Text to Buttons in Toolbar
$aStrings[0] = _GUICtrlToolbar_AddString($hToolbar1, "&New")
$aStrings[1] = _GUICtrlToolbar_AddString($hToolbar1, "&Edit")
$aStrings[2] = _GUICtrlToolbar_AddString($hToolbar1, "&Delete")
$aStrings[3] = _GUICtrlToolbar_AddString($hToolbar1, "&Save")
$aStrings[4] = _GUICtrlToolbar_AddString($hToolbar1, "&Print")
$aStrings[5] = _GUICtrlToolbar_AddString($hToolbar1, "&Undo")

;Set Imagelist of Toolbar to my ImageList
$t = _GUICtrlToolbar_SetImageList($hToolbar1, $imgs)

;Add buttons to toolbar
$cBtn_New = _GUICtrlToolbar_AddButton($hToolbar1, $e_new, 0,$aStrings[0])
$cBtn_Edit =_GUICtrlToolbar_AddButton($hToolbar1, $e_edit, 1,$aStrings[1])
$cBtn_Delete =_GUICtrlToolbar_AddButton($hToolbar1, $e_delete, 2,$aStrings[2])
$cBtn_Save =_GUICtrlToolbar_AddButton($hToolbar1, $e_save, 3,$aStrings[3])
$cBtn_Print =_GUICtrlToolbar_AddButton($hToolbar1, $e_print, 4,$aStrings[4])
$cBtn_Undo =_GUICtrlToolbar_AddButton($hToolbar1, $e_undo, 5,$aStrings[5])
GUISetState()

#EndRegion Toolbar


#Region Create Tabs
$hGui1 = GUICreate("",$iGuiWidth-10,$iGUIHeight-70,-1,60, $WS_POPUP, $WS_EX_MDICHILD, $hgui)
; Create top level Tab Items
$hTab1 = GUICtrlCreateTab(-1,1,665,265)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH,$GUI_DOCKRIGHT))
$hTab1_0 = GUICtrlCreateTabItem("Schedule1")

;cTreeView 1
$cTreeView1  = GUICtrlCreateTreeView(0, 25, 245, 225, BitOR($TVS_HASBUTTONS,  $TVS_HASLINES, $TVS_LINESATROOT, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
GUICtrlSetResizing(-1,BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
;Set TreeView Data
$generalitem = GUICtrlCreateTreeViewItem("parent1", $cTreeView1)
GUICtrlSetColor(-1, 0x0000C0)
$displayitem = GUICtrlCreateTreeViewItem("parent2", $cTreeView1)
GUICtrlSetColor(-1, 0x0000C0)
GUICtrlCreateTreeViewItem("node1", $generalitem)
GUICtrlCreateTreeViewItem("node2", $generalitem)
GUICtrlCreateTreeViewItem("node3", $generalitem)
GUICtrlCreateTreeViewItem("node4", $displayitem)
GUICtrlCreateTreeViewItem("node5", $displayitem)
GUICtrlSetState($generalitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON))
GUICtrlSetState($displayitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON))

GUISetState()
$hTab1_1 = GUICtrlCreateTabItem("Schedule2 ")

;cTreeView 2
$cTreeView2  = GUICtrlCreateTreeView(0, 25, 245, 225, BitOR($TVS_HASBUTTONS,  $TVS_HASLINES, $TVS_LINESATROOT, $TVS_SHOWSELALWAYS),$WS_EX_CLIENTEDGE)
GUICtrlSetResizing(-1,BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
$generalitem = GUICtrlCreateTreeViewItem("parent1a", $cTreeView2)
GUICtrlSetColor(-1, 0x0000C0)
$displayitem = GUICtrlCreateTreeViewItem("parent2a", $cTreeView2)
GUICtrlSetColor(-1, 0x0000C0)
GUICtrlCreateTreeViewItem("node1", $generalitem)
GUICtrlCreateTreeViewItem("node2", $generalitem)
GUICtrlCreateTreeViewItem("node3", $generalitem)
GUICtrlCreateTreeViewItem("node4", $displayitem)
GUICtrlCreateTreeViewItem("node5", $displayitem)
GUICtrlSetState($generalitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "General"-item and paint in bold
GUICtrlSetState($displayitem, BitOR($GUI_EXPAND, $GUI_DEFBUTTON)) ; Expand the "Display"-item and paint in bold.

GUICtrlCreateTabItem("")

GUISetState()

;Create Inner GUI to hold the listviews for first tab
$hGuiInner1 = GUICreate("",  403, 225, 252,28, $WS_POPUP, $WS_EX_MDICHILD, $hgui1)
$hTab2 = GUICtrlCreateTab(0,0,403,225)
$hTab2_0 = GUICtrlCreateTabItem("1 ")
$ListView5 = GUICtrlCreateListView("col1|col2|col3",  0, 20, 403, 205)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT))
$hTab2_1 = GUICtrlCreateTabItem("2")
$ListView6 = GUICtrlCreateListView("col1|col2|col3",  0, 20, 403, 205)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT))
GUICtrlCreateTabItem("")
GUISetState()

;Create Inner GUI to hold the listviews for second tab
$hGuiInner2 = GUICreate("", 403, 225, 252,28, $WS_POPUP, $WS_EX_MDICHILD, $hgui1)
$hTab3 = GUICtrlCreateTab(0,0,403,225)
$hTab3_0 = GUICtrlCreateTabItem("1")
$ListView7 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 403, 205)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT))
$hTab3_1 = GUICtrlCreateTabItem("2")
$ListView8 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 403, 205)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT))
$hTab3_2 = GUICtrlCreateTabItem("3")
$ListView9 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 403, 205)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT))
$hTab3_3 = GUICtrlCreateTabItem("4")
$ListView10 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 403, 205)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT))
$hTab3_4 = GUICtrlCreateTabItem("5")
$ListView11 = GUICtrlCreateListView("col1|col2|col3", 0, 20, 403, 205)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT))
GUICtrlCreateTabItem("")
GUISetState()

$aOffsets_1 = _GetGuiOffset($hGUI1)
$aOffsets_inner1 = _GetGuiOffset($hGuiInner1)
$aOffsets_inner2 = _GetGuiOffset($hGuiInner2)

#EndRegion End tabs

#Region GUI Message Loop

While 1
    $idMsg = GUIGetMsg()
    Switch $idMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $htab1
            Switch GUICtrlRead($htab1)
                Case 0
                    ; Adjust child GUIs accordingly
                    GUISetState(@SW_HIDE, $hGuiInner1)
                    GUISetState(@SW_SHOW, $hGuiInner2)
                Case 1
                    GUISetState(@SW_HIDE, $hGuiInner2)
                    GUISetState(@SW_SHOW, $hGuiInner1)
            EndSwitch
    EndSwitch
WEnd
#EndRegion GUI Message Loop

#Region Functions

Func WM_SIZE($hWndGUI, $MsgID, $wParam, $lParam)
    _WinAPI_SetWindowPos($hgui1, 0, 0, 0, _WinAPI_LoWord($lParam)-$aOffsets_1[0]+16, _WinAPI_HiWord($lParam)-$aOffsets_1[1]+38,BitOR($SWP_NOMOVE, $SWP_NOZORDER))
    _WinAPI_SetWindowPos($hGuiInner1, 0, 0, 0, _WinAPI_LoWord($lParam)-$aOffsets_inner1[0]+16, _WinAPI_HiWord($lParam)-$aOffsets_inner1[1]+38,BitOR($SWP_NOMOVE, $SWP_NOZORDER))
    _WinAPI_SetWindowPos($hGuiInner2, 0, 0, 0, _WinAPI_LoWord($lParam)-$aOffsets_inner2[0]+16, _WinAPI_HiWord($lParam)-$aOffsets_inner2[1]+38,BitOR($SWP_NOMOVE, $SWP_NOZORDER))
    Return $GUI_RUNDEFMSG
EndFunc ;==> WM_SIZE

; WM_NOTIFY event handler
;~ Func _WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
;~     #forceref $hWndGUI, $MsgID, $wParam
;~     Local $tNMHDR, $event, $hwndFrom, $icode, $i_idNew, $dwFlags, $lResult, $idFrom, $i_idOld, $sButtonName, $hTreeView1, $hTreeView2
;~     Local $tNMTOOLBAR, $tNMTBHOTITEM
;~     $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
;~     $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom")
;~     $idFrom = DllStructGetData($tNMHDR, "IDFrom")
;~     $icode = DllStructGetData($tNMHDR, "Code")
;~  $hTreeview1 = $cTreeView1
;~  $hTreeview2 = $cTreeView2
;~  If Not IsHWnd($cTreeView1) Then $hTreeview1 = GUICtrlGetHandle($cTreeView1)
;~  If Not IsHWnd($cTreeView2) Then $hTreeview2 = GUICtrlGetHandle($cTreeView2)
;~     Switch $hwndFrom
;~         Case $hToolbar1
;~             Switch $icode
;~              Case $NM_LDOWN
;~                  ;case for which button was clicked
;~                     Switch $iItem
;~                      Case $e_new
;~                          _button_Click($e_new)
;~                      Case $e_edit
;~                          _button_Click($e_edit)
;~                      Case $e_save
;~                          _button_Click($e_save)
;~                      Case $e_delete
;~                          _button_Click($e_delete)
;~                      Case $e_print
;~                          _button_Click($e_print)
;~                      Case $e_undo
;~                          _button_Click($e_undo)
;~                  EndSwitch
;~                 Case $TBN_HOTITEMCHANGE
;~                     $tNMTBHOTITEM = DllStructCreate($tagNMTBHOTITEM, $lParam)
;~                     $i_idOld = DllStructGetData($tNMTBHOTITEM, "idOld")
;~                     $i_idNew = DllStructGetData($tNMTBHOTITEM, "idNew")
;~                     $iItem = $i_idNew
;~                     $dwFlags = DllStructGetData($tNMTBHOTITEM, "dwFlags")
;~          EndSwitch
;~      Case $hTreeView1, $hTreeView2
;~          Switch $icode
;~              Case $NM_CLICK ; The user has clicked the left mouse button within the control
;~                  _DebugPrint("$NM_CLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                          "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _
;~                          "-->Code:" & @TAB & $iCode)
;~                  ; Return 1 ; nonzero to not allow the default processing
;~                  Return 0 ; zero to allow the default processing
;~              Case $NM_DBLCLK ; The user has double-clicked the left mouse button within the control
;~                  _DebugPrint("$NM_DBLCLK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                          "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _
;~                          "-->Code:" & @TAB & $iCode)
;~                  ; Return 1 ; nonzero to not allow the default processing
;~                  Return 0 ; zero to allow the default processing
;~              Case $NM_RCLICK ; The user has clicked the right mouse button within the control
;~                  _DebugPrint("$NM_RCLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                          "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _
;~                          "-->Code:" & @TAB & $iCode)
;~                  ; Return 1 ; nonzero to not allow the default processing
;~                  Return 0 ; zero to allow the default processing
;~              Case $NM_RDBLCLK ; The user has double-clicked the right mouse button within the control
;~                  _DebugPrint("$NM_RDBLCLK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                          "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _
;~                          "-->Code:" & @TAB & $iCode)
;~                  ; Return 1 ; nonzero to not allow the default processing
;~                  Return 0 ; zero to allow the default processing
;~              Case $NM_KILLFOCUS ; control has lost the input focus
;~                  _DebugPrint("$NM_KILLFOCUS" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                          "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _
;~                          "-->Code:" & @TAB & $iCode)
;~                  ; No return value
;~              Case $NM_RETURN ; control has the input focus and that the user has pressed the key
;~                  _DebugPrint("$NM_RETURN" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                          "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _
;~                          "-->Code:" & @TAB & $iCode)
;~                  ; Return 1 ; nonzero to not allow the default processing
;~                  Return 0 ; zero to allow the default processing
;~                  ; Case $NM_SETCURSOR ; control is setting the cursor in response to a WM_SETCURSOR message
;~                  ; Local $tInfo = DllStructCreate($tagNMMOUSE, $lParam)
;~                  ; $hWndFrom = HWnd(DllStructGetData($tInfo, "hWndFrom"))
;~                  ; $iIDFrom = DllStructGetData($tInfo, "IDFrom")
;~                  ; $iCode = DllStructGetData($tInfo, "Code")
;~                  ; _DebugPrint("$NM_SETCURSOR" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                  ; "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
;~                  ; "-->Code:" & @TAB & $iCode & @CRLF & _
;~                  ; "-->ItemSpec:" & @TAB & DllStructGetData($tInfo, "ItemSpec") & @CRLF & _
;~                  ; "-->ItemData:" & @TAB & DllStructGetData($tInfo, "ItemData") & @CRLF & _
;~                  ; "-->X:" & @TAB & DllStructGetData($tInfo, "X") & @CRLF & _
;~                  ; "-->Y:" & @TAB & DllStructGetData($tInfo, "Y") & @CRLF & _
;~                  ; "-->HitInfo:" & @TAB & DllStructGetData($tInfo, "HitInfo"))
;~                  ; Return 0 ; to enable the control to set the cursor
;~                  ; Return 1 ; nonzero to prevent the control from setting the cursor
;~              Case $NM_SETFOCUS ; control has received the input focus
;~                  _DebugPrint("$NM_SETFOCUS" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                          "-->IDFrom:" & @TAB & $iDFrom & @CRLF & _
;~                          "-->Code:" & @TAB & $iCode)
;~                  ; No return value
;~              Case $TVN_BEGINDRAGA, $TVN_BEGINDRAGW
;~                  _DebugPrint("$TVN_BEGINDRAG")
;~              Case $TVN_BEGINLABELEDITA, $TVN_BEGINLABELEDITW
;~                  _DebugPrint("$TVN_BEGINLABELEDIT")
;~              Case $TVN_BEGINRDRAGA, $TVN_BEGINRDRAGW
;~                  _DebugPrint("$TVN_BEGINRDRAG")
;~              Case $TVN_DELETEITEMA, $TVN_DELETEITEMW
;~                  _DebugPrint("$TVN_DELETEITEM")
;~              Case $TVN_ENDLABELEDITA, $TVN_ENDLABELEDITW
;~                  _DebugPrint("$TVN_ENDLABELEDIT")
;~              Case $TVN_GETDISPINFOA, $TVN_GETDISPINFOW
;~                  _DebugPrint("$TVN_GETDISPINFO")
;~              Case $TVN_GETINFOTIPA, $TVN_GETINFOTIPW
;~                  _DebugPrint("$TVN_GETINFOTIP")
;~              Case $TVN_ITEMEXPANDEDA, $TVN_ITEMEXPANDEDW
;~                  _DebugPrint("$TVN_ITEMEXPANDED")
;~              Case $TVN_ITEMEXPANDINGA, $TVN_ITEMEXPANDINGW
;~                  _DebugPrint("$TVN_ITEMEXPANDING")
;~              Case $TVN_KEYDOWN
;~                  _DebugPrint("$TVN_KEYDOWN")
;~              Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
;~                  _DebugPrint("$TVN_SELCHANGED")
;~              Case $TVN_SELCHANGINGA, $TVN_SELCHANGINGW
;~                  _DebugPrint("$TVN_SELCHANGING")
;~              Case $TVN_SETDISPINFOA, $TVN_SETDISPINFOW
;~                  _DebugPrint("$TVN_SETDISPINFO")
;~              Case $TVN_SINGLEEXPAND
;~                  _DebugPrint("$TVN_SINGLEEXPAND")
;~          EndSwitch

;~     EndSwitch
;~     Return $GUI_RUNDEFMSG
;~  EndFunc

Func _GetGuiOffset($hTargGUI)
    Local $aGUIPos[4]
    $aWin1 = WinGetPos($hGUI)
    $aWin2 = WinGetPos($hTargGUI)
    $aGUIPos[0] = $aWin1[2]-$aWin2[2]
    $aGUIPos[1] = $aWin1[3]-$aWin2[3]
    return $aGUIPos
EndFunc  ;==> _GetGuiOffset

func _button_Click($btn_ID)
    Switch $btn_ID
        Case $e_new
            _DebugPrint("Clicked New button" & @LF)
        case $e_edit
            _DebugPrint("Clicked Edit button" & @LF)
        Case $e_save
            _DebugPrint("Clicked Save button" & @LF)
        Case $e_delete
            _DebugPrint("Clicked Delete button" & @LF)
        Case $e_print
            _DebugPrint("Clicked Print button" & @LF)
        Case $e_undo
            _DebugPrint("Clicked Undo button" & @LF)
    EndSwitch
endfunc  ;==>_button_Click

Func _DebugPrint($s_Text , $sLine = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @CRLF & _
            "+======================================================" & @CRLF & _
            "-->Line(" & StringFormat("%04d", $sLine) & "):" & @TAB & $s_Text  & @CRLF & _
            "+======================================================" & @CRLF)
EndFunc   ;==>_DebugPrint
#EndRegion functions
Edited by JakeKenmode
Link to comment
Share on other sites

Have you tried to add a ConsoleWrite( "WM_SIZE" & @CRLF ) and a ConsoleWrite( "WM_NOTIFY" & @CRLF )?

Link to comment
Share on other sites

@LarjS: It definitely cannot help. He fucks up the GUI hierarchy way too much. 

Edit: What make you (and DCoder) don't want to use a single GUI , as AutoIt designed to be?

Two you use all the child windows the wrongest way!

Edited by binhnx

99 little bugs in the code

99 little bugs!

Take one down, patch it around

117 little bugs in the code!

Link to comment
Share on other sites

The ConsoleWrites will show, that the WM_SIZE code generates so many WM_NOTIFY events, that the script becomes unresponsive.

Link to comment
Share on other sites

First of all - if you are going to speak my language - be considerate enough to use google translate to communicate with me so I can understand what you are saying please. This way I don't mistake you for a sarcastic, arrogant, counterproductive forum poster. I'm sure you are the opposite right?

Second of all -https://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateTab.htm clearly tells users that a GUI can only hold ONE Tab control, I am using 2 tab controls. Therefore 2 GUI, aside from my main form GUI. 

If there is a better way - please, clue me in as this is clearly not my "go to" IDE.  

why don't we discuss the real issue here. 

@LarsJ

Yes I am monitoring the messages although the reason I am posting in the forums, is because I'm not really understanding what I can do to handle this condition. 

I need WM_SIZE to resize all of the GUI's which are required by the Tabs (1 per each Tab control) 

and if I am using any custom controls like the toolbar, I need to use WM_NOTIFY to handle events. 

Is there something else I can do to use these both in the same script?

This form isn't even close to done - and I am already hitting big issues - Is Binhnx correct in his statement that maybe I am reaching too far with AutoIT? That it truly is just meant for a single GUI?

Edited by JakeKenmode
Link to comment
Share on other sites

An easy solution that will work: Disable the WM_NOTIFY code while the WM_SIZE code is running. Let me know if you need more details.

You can make much more advanced forms with AutoIt than this form. Without any issues at all.

I also do not understand the comment by binhnx.

Link to comment
Share on other sites

  • Solution

@LarsJ: You can also read this thread: 

Basically, yes, you can create a far more advanced forms with AutoIt, with a condition, you know what you're doing.

The OP overuse the child window. With his problem, he should really using one form. But he not. So he totally mess with his resize code.  (Yes it my fucking bad, the 2 tab controls make him cannot use only 1 form)

Look at his GUI hierarchy:

- MainForm ($hGui)

- Toolbar

- Nested child 1 ($hGui2) (using $WS_EX_MDICHILD,but then reposition manually by intercepting WM_SIZE)

- Tab Control1 (This contain 2 tab items)

- TreeView1 (contained in 1st tab item)

- TreeView2 (contained in 2nd tab item)

- Nested child 1.1 ($hGuiInner1) (again, a $WS_POPUP with $WS_EX_MDICHILD and manually position during resize). This is contained in the first item of the tab below tab

- Nested tab, with 5 tab items

- Nested child 1.2 ($hGuiInner2) (again, a $WS_POPUP with $WS_EX_MDICHILD and manually position during resize). This is positioned in the second item of the TabControl1

- Nested tab, with 2 items

 

So what's going wrong?

AutoIt intercept all its GUI message. Guess?

When processing WM_SIZE, the OP resize all 3 Gui!!!
Then? Let's look

- First, main form, $hGUI is resized by user. The system send a WM_SIZE indicate that the window has been resized.

- In response to it, the OP resize its direct child, $hGui2 and 2 nested: $hGuiInner1 and hGuiInner2

- $hGui2 resize make the system send another WM_SIZE, and he continue to resize $hGui2 here. It bad.

- Its terrible but not disaster, he also resize 2 most nested child: $hGuiInner1 and $hGuiInner2 in his message handler. So bulks of WM_SIZE sent recursive here. Assume that the system code was fast enough or/and he's too lucky so he doesn't see the problems.

- The disaster come in when he switch from system-handled-WM_NOTIFY to his own WM_NOTIFY handler. Each resize, multiple WM_NOTIFY is sent. So bulks of (unnecessary) resize * multiples of WM_NOTIFY = disaster.

@To the OP:

- Edit - : I re-read the tab control problem. So 1 Gui for all is not suitable here. So sorry!

Just modify your WM_SIZE handler like this:

Func WM_SIZE($hWndGUI, $MsgID, $wParam, $lParam)
    if ($hWndGUI = $hGui) Then
        _WinAPI_SetWindowPos($hgui1, 0, 0, 0, _WinAPI_LoWord($lParam)-$aOffsets_1[0]+16, _WinAPI_HiWord($lParam)-$aOffsets_1[1]+38,BitOR($SWP_NOMOVE, $SWP_NOZORDER))
    ElseIf ($hWndGUI = $hgui1) Then
        _WinAPI_SetWindowPos($hGuiInner1, 0, 0, 0, _WinAPI_LoWord($lParam)-$aOffsets_inner1[0]+16, _WinAPI_HiWord($lParam)-$aOffsets_inner1[1]+38,BitOR($SWP_NOMOVE, $SWP_NOZORDER))
        _WinAPI_SetWindowPos($hGuiInner2, 0, 0, 0, _WinAPI_LoWord($lParam)-$aOffsets_inner2[0]+16, _WinAPI_HiWord($lParam)-$aOffsets_inner2[1]+38,BitOR($SWP_NOMOVE, $SWP_NOZORDER))
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc ;==> WM_SIZE

And you will feel much better.

PS: And also, take a look at the >thread by @TheDCoder, you will find a solution for the appearing order of your child Guis.

Edited by binhnx

99 little bugs in the code

99 little bugs!

Take one down, patch it around

117 little bugs in the code!

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...