Jump to content

Recommended Posts

Posted (edited)

I present to your attention an alternative version of the window dividers CtrlSplitter. The Static element is used as a splitter separator, and the functioning of the separators is fully implemented in their window procedure.

Example.au3

Spoiler
;Make this script high DPI aware
;AutoIt3Wrapper directive for exe files, DllCall for au3/a3x files
#AutoIt3Wrapper_Res_HiDpi=y
If not @Compiled then DllCall("User32.dll", "bool", "SetProcessDPIAware")


#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <UpdownConstants.au3>
#include <GuiStatusBar.au3>
#include <GuiButton.au3>
#include <WinAPITheme.au3>
#include <GuiImageList.au3>
#include <IE.au3>
#include <WinAPISysWin.au3>
#include <WinAPIShPath.au3>
#include <GuiMenu.au3>
#include <GuiEdit.au3>
#include <GuiRichEdit.au3>
#include <GuiListView.au3>
#include <GuiTreeView.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIShellEx.au3>
#include <File.au3>

#include "CtrlSplit.au3"
#include "CtrlSplitNotify.au3"

Opt('TrayAutoPause', 0)
Opt('WinTitleMatchMode', 3)
Opt('WinWaitDelay', 0)
Opt('WinSearchChildren', 1)
Opt("GUIOnEventMode", 1)
Opt('GUICloseOnESC', 0)
Opt('MustDeclareVars', 1)

Global Const $SIZE_RESTORED = 0 ; The window size has been changed, but neither SIZE_MINIMIZED nor SIZE_MAXIMIZED values are applied.
Global Const $SIZE_MINIMIZED = 1 ; The window was rolled up
Global Const $SIZE_MAXIMIZED = 2 ; The window is expanded to the full screen

Global $gui1, $hStatus, $ListViewTemplates, $TreeViewTemplates, $hTreeViewTemplates, $hListViewTemplates, $hListViewAddress, $hlistviewHeader, $UserImage, $UserName, $CompanyName, $oIE, $Obj, $hConsole, _
        $hContent, $addressBar, $hAddressBar, $ispl0, $ispl1, $ispl2, $ispl3
Global Enum $ExplorerWindow = 2000, $ListWindow, $ConsoleWindow, $ContentWindow
Global Const $WM_POSTSIZE = _WinAPI_RegisterWindowMessage("WM_POSTSIZE")
Global $hStatus_PartsWidth[6] = [100, 100, 100, 100, 100, -1]
Global Const $DefSettingFile = "setting.ini"

_SetAware()
_GuiCreate()

While 1
    Sleep(250)
WEnd

Func _SetAware()
    Local $AWARENESS
    Switch @OSBuild
        Case 9200 To 13999
            $AWARENESS = $DPI_AWARENESS_PER_MONITOR_AWARE
        Case @OSBuild > 13999
            $AWARENESS = $DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
    EndSwitch
    _WinAPI_SetDPIAwareness($AWARENESS, 2)
EndFunc   ;==>_SetAware


Func _GuiCreate()
    Local $iDPI = _WinAPI_GetDpiForPrimaryMonitor()
    Local $fscale = $iDPI / 96
    Local $fscale2 = 96 / _WinAPI_GetDpiForSystem()
    Local $cxFrame = _WinAPI_GetSystemMetricsForDpi($SM_CXSIZEFRAME, $iDPI)
    Local $cyFrame = _WinAPI_GetSystemMetricsForDpi($SM_CYSIZEFRAME, $iDPI)
    Local $cyCapt = _WinAPI_GetSystemMetricsForDpi($SM_CYCAPTION, $iDPI)
    
    Local $iW = 1110, $iH = 710
    Local $istyle = BitOR($WS_BORDER, $WS_CAPTION, $WS_GROUP, $WS_SIZEBOX, $WS_TABSTOP, $WS_OVERLAPPEDWINDOW)
    $gui1 = GUICreate('', $iW, $iH, -1, -1, $istyle)
    
    GUISetBkColor(_WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOW)))
    
    GUIRegisterMsg($WM_SYSCOMMAND, 'GuiMessageProc')
    GUIRegisterMsg($WM_THEMECHANGED, 'GuiMessageProc')
    GUIRegisterMsg($WM_GETDPISCALEDSIZE, 'GuiMessageProc')
    GUIRegisterMsg($WM_DPICHANGED, 'GuiMessageProc')
    GUIRegisterMsg($WM_GETMINMAXINFO, 'GuiMessageProc')
    GUIRegisterMsg($WM_WINDOWPOSCHANGED, 'GuiMessageProc')
    GUIRegisterMsg($WM_ENTERSIZEMOVE, 'GuiMessageProc')
    GUIRegisterMsg($WM_EXITSIZEMOVE, 'GuiMessageProc')
    GUIRegisterMsg($WM_SIZE, 'GuiMessageProc')
    GUIRegisterMsg($WM_POSTSIZE, 'GuiMessageProc')
    GUIRegisterMsg($WM_COMMAND, 'GuiMessageProc')
    GUIRegisterMsg($WM_NOTIFY, 'GuiMessageProc')
    GUIRegisterMsg($WM_UAHDRAWMENU, 'GuiMessageProc')
    
    _GuiMenuCreate()
    Global $hMenu = _GUICtrlMenu_GetMenu($gui1)
    $hStatus = _GUICtrlStatusBar_Create($gui1)

    _GUICtrlStatusBar_SetParts($hStatus, -1, $hStatus_PartsWidth)

    $TreeViewTemplates = GUICtrlCreateTreeView(16, 144, 165, 224, -1, $WS_EX_CLIENTEDGE)
    $hTreeViewTemplates = GUICtrlGetHandle(-1)
    Local $hImage = _GUIImageList_Create(21 * $fscale, 21 * $fscale, 5, 3)
    _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', 3, 21 * $fscale, 21 * $fscale))
    _GUICtrlTreeView_SetNormalImageList($hTreeViewTemplates, $hImage)
    TemplatesTreeUpdate()
    _GUICtrlTreeView_SelectItem($hTreeViewTemplates, _GUICtrlTreeView_GetFirstItem($hTreeViewTemplates), $TVGN_CARET)

    $ListViewTemplates = GUICtrlCreateListView("|", 196, 144, 294, 224)
    GUICtrlSetStyle(-1, BitOR($LVS_AUTOARRANGE, $LVS_ICON, $LVS_SHOWSELALWAYS, $LVS_SINGLESEL))
    $hListViewTemplates = GUICtrlGetHandle(-1)
    _GUICtrlListView_SetExtendedListViewStyle($hListViewTemplates, BitOR($LVS_EX_DOUBLEBUFFER, $WS_EX_CLIENTEDGE))
    
    $hImage = _GUIImageList_Create(48 * $fscale, 48 * $fscale, 5, 3)
    _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\imageres.dll', 15, 48 * $fscale, 48 * $fscale))
    _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', 3, 48 * $fscale, 48 * $fscale))
    _GUICtrlListView_SetImageList($hListViewTemplates, $hImage, 0)
    TemplatesListUpdate(@DesktopDir)
    
    Global $ListViewAddress = GUICtrlCreateListView("|Name|Company|Email|Phone|Date", 16, 386, 474, 209)
    GUICtrlSetStyle(-1, BitOR($LVS_SHOWSELALWAYS, $LVS_AUTOARRANGE, $LVS_REPORT, $LVS_EDITLABELS))
    $hListViewAddress = GUICtrlGetHandle(-1)
    _GUICtrlListView_SetExtendedListViewStyle($hListViewAddress, BitOR($LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE, $LVS_EX_DOUBLEBUFFER, $LVS_EX_CHECKBOXES))
    _GUICtrlListView_RegisterSortCallBack($hListViewAddress)
    
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50 * $fscale)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150 * $fscale)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 200 * $fscale)
    
    $hImage = _GUIImageList_Create(21 * $fscale, 21 * $fscale, 5, 3)
    _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\imageres.dll', 83, 21 * $fscale, 21 * $fscale))
    _GUICtrlListView_SetImageList($hListViewAddress, $hImage, 1)
    
    $UserImage = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', -161, 16, 15, 100, 100)
    
    $UserName = GUICtrlCreateLabel("Name", 153, 32, 337, 35, $SS_CENTERIMAGE)
    GUICtrlSetColor(-1, 0x000080)
    
    $CompanyName = GUICtrlCreateLabel("Organization", 155, 77, 327, 30, $SS_CENTERIMAGE)
    GUICtrlSetColor(-1, 0x000080)
    
    $oIE = _IECreateEmbedded()
    $Obj = GUICtrlCreateObj($oIE, 506, 8, 596, 550)
    
    $addressBar = GUICtrlCreateInput("Paste the url or the path to the html page file", 506, 570, 594, 25, -1, $WS_EX_CLIENTEDGE)
    GUICtrlSetColor(-1, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_GRAYTEXT)))
    $hAddressBar = GUICtrlGetHandle(-1)
    
    $ispl0 = _CtrlSplit_Create(184, 144, 224, $SPS_VERTICAL) ; вертикальный малый
    $ispl1 = _CtrlSplit_Create(495, 0, 605, $SPS_VERTICAL) ; вертикальный большой
    $ispl2 = _CtrlSplit_Create(10, 374, 486, $SPS_HORIZONTAL) ; горизонтальный малый
    $ispl3 = _CtrlSplit_Create(10, 607, 1090, $SPS_HORIZONTAL) ; горизонтальный большой
    
    $hConsole = _GUICtrlRichEdit_Create($gui1, "", 10 * $fscale, 603, 1090, 40 * $fscale, BitOR($WS_VSCROLL, $WS_HSCROLL, $ES_LEFT, $ES_READONLY, $ES_MULTILINE), 0)
    
    _GUICtrlRichEdit_SetBkColor($hConsole, _WinAPI_GetSysColor($COLOR_3DFACE))
    _GUICtrlRichEdit_SetCharColor($hConsole, _WinAPI_GetSysColor($COLOR_GRAYTEXT))
    
    $hContent = ControlGetHandle($gui1, "", "[CLASS:Shell Embedding]")
    
    _GUICtrlStatusBar_SetText($hStatus, "Sender", 0)
    _GUICtrlStatusBar_SetText($hStatus, "Recipients", 1)
    _GUICtrlStatusBar_SetText($hStatus, "Accomplishment", 2, $SBT_NOBORDERS)
    _GUICtrlStatusBar_SetText($hStatus, "Successfully:", 4)
    _GUICtrlStatusBar_SetText($hStatus, "Failed:", 5)
    SetPart($iDPI)
    
    __setautoresizing()
    
    GUISetState(@SW_HIDE, $gui1)
    
    _WinAPI_SetWindowPos($gui1, 0, 0, 0, Round($iW * $fscale), Round($iH * $fscale), BitOR($SWP_NOMOVE, $SWP_NOREDRAW))
    
    _CtrlSplit_AddItem($ispl0, $SPL_LEFT, $TreeViewTemplates, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl0, $SPL_RIGHT, $ListViewTemplates, $SP_RESIZING)
    
    _CtrlSplit_ItemSetDistance($ispl0, $SPL_LEFT, $TreeViewTemplates, 2, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl0, $SPL_RIGHT, $ListViewTemplates, 2, $SP_USEITEM)
    _CtrlSplit_ItemSetMinimal($ispl0, $SPL_LEFT, $TreeViewTemplates, 0, $SP_USEITEM)
    _CtrlSplit_ItemSetMinimal($ispl0, $SPL_RIGHT, $ListViewTemplates, 0, $SP_USEITEM)
    
    _CtrlSplit_AddItem($ispl1, $SPL_LEFT, $UserName, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl1, $SPL_LEFT, $CompanyName, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl1, $SPL_LEFT, $ListViewTemplates, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl1, $SPL_LEFT, $ispl2, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl1, $SPL_LEFT, $ListViewAddress, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl1, $SPL_RIGHT, $hContent, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl1, $SPL_RIGHT, $addressBar, $SP_RESIZING)

    _CtrlSplit_ItemSetMinimal($ispl1, $SPL_LEFT, $UserName, 0, $SP_USEITEM)
    _CtrlSplit_ItemSetMinimal($ispl1, $SPL_LEFT, $CompanyName, 0, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl1, $SPL_LEFT, $UserName, 5, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl1, $SPL_LEFT, $CompanyName, 5, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl1, $SPL_RIGHT, $hContent, 5, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl1, $SPL_RIGHT, $addressBar, 5, $SP_USEITEM)
    
    _CtrlSplit_AddItem($ispl2, $SPL_TOP, $TreeViewTemplates, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl2, $SPL_TOP, $ispl0, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl2, $SPL_TOP, $ListViewTemplates, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl2, $SPL_BOTTOM, $ListViewAddress, $SP_RESIZING)

    _CtrlSplit_ItemSetDistance($ispl2, $SPL_TOP, $TreeViewTemplates, 2, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl2, $SPL_TOP, $ispl0, 2, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl2, $SPL_TOP, $ListViewTemplates, 2, $SP_USEITEM)
    _CtrlSplit_ItemSetDistance($ispl2, $SPL_BOTTOM, $ListViewAddress, 2, $SP_USEITEM)

    _CtrlSplit_AddItem($ispl3, $SPL_TOP, $ListViewAddress, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl3, $SPL_TOP, $addressBar, $SP_NORESIZING)
    _CtrlSplit_AddItem($ispl3, $SPL_TOP, $ispl1, $SP_RESIZING)
    _CtrlSplit_AddItem($ispl3, $SPL_TOP, $hContent, $SP_RESIZING)
    
    _CtrlSplit_AddItem($ispl3, $SPL_BOTTOM, $hConsole, $SP_RESIZING)
    _CtrlSplit_ItemSetDistance($ispl3, $SPL_BOTTOM, $hConsole, 5, $SP_USEITEM)
    _CtrlSplit_ItemSetMinimal($ispl3, $SPL_BOTTOM, $hConsole, 0, $SP_USEITEM)
    
    _CtrlSplit_SetParam($ispl0, _WinAPI_MakeLong(_GetLeft($ispl0), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl0)))
    _CtrlSplit_SetParam($ispl1, _WinAPI_MakeLong(_GetLeft($ispl1), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl1)))
    _CtrlSplit_SetParam($ispl2, _WinAPI_MakeLong(_GetTop($ispl2), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl2)))
    _CtrlSplit_SetParam($ispl3, _WinAPI_MakeLong(_GetTop($ispl3), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl3)))
    
    __setdefresizing()
    
    _GUICtrlListView_SortItems($hListViewAddress, 1)
    
    _SendMessage($gui1, $WM_THEMECHANGED)
    
    Local $iX0 = IniRead($DefSettingFile, "metrics", "spl_0x" & $iDPI, _GetLeft($ispl0))
    Local $iX1 = IniRead($DefSettingFile, "metrics", "spl_1x" & $iDPI, _GetLeft($ispl1))
    Local $iY2 = IniRead($DefSettingFile, "metrics", "spl_2x" & $iDPI, _GetTop($ispl2))
    Local $iY3 = IniRead($DefSettingFile, "metrics", "spl_3x" & $iDPI, _GetTop($ispl3))
    GUISetState(@SW_SHOW, $gui1)
    
    _CtrlSplit_SetPos($ispl2, Default, $iY2)
    _CtrlSplit_SetPos($ispl3, Default, $iY3)
    _CtrlSplit_SetPos($ispl1, $iX1)
    _CtrlSplit_SetPos($ispl0, $iX0)
    
    If _CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, 0, $SPM_HIDE) == 0 And _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPM_HIDE) == 0 Then
        _CtrlSplit_SetParam($ispl0, _WinAPI_MakeLong(_GetLeft($ispl0), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl0)))
    EndIf
    
    If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPM_HIDE) == 0 And _CtrlSplit_ItemGetState($ispl2, $SPL_BOTTOM, 0, $SPM_HIDE) == 0 Then
        _CtrlSplit_SetParam($ispl2, _WinAPI_MakeLong(_GetTop($ispl2), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl2)))
    EndIf
    
    If _CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, 0, $SPM_HIDE) == 0 And _CtrlSplit_ItemGetState($ispl1, $SPL_RIGHT, 0, $SPM_HIDE) == 0 Then
        _CtrlSplit_SetParam($ispl1, _WinAPI_MakeLong(_GetLeft($ispl1), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl1)))
    EndIf
    
    If _CtrlSplit_ItemGetState($ispl3, $SPL_BOTTOM, 0, $SPM_HIDE) == 0 Then
        _CtrlSplit_SetParam($ispl3, _WinAPI_MakeLong(_GetTop($ispl3), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl3)))
    EndIf
    
    _IENavigate($oIE, "https://www.autoitscript.com", 0)
EndFunc   ;==>_GuiCreate

Func __setautoresizing()
    For $iCtrlID = $TreeViewTemplates To $ispl3
        GUICtrlSetResizing($iCtrlID, $GUI_DOCKAUTO)
    Next
EndFunc   ;==>__setautoresizing

Func __setdefresizing()
    GUICtrlSetResizing($TreeViewTemplates, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
    GUICtrlSetResizing($ListViewTemplates, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
    GUICtrlSetResizing($ListViewAddress, BitOR($GUI_DOCKLEFT, $GUI_DOCKBOTTOM, $GUI_DOCKSIZE))
    GUICtrlSetResizing($UserImage, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
    GUICtrlSetResizing($UserName, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
    GUICtrlSetResizing($CompanyName, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
    GUICtrlSetResizing($Obj, $GUI_DOCKBORDERS)
    GUICtrlSetResizing($addressBar, BitOR($GUI_DOCKLEFT, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT, $GUI_DOCKHEIGHT))
    GUICtrlSetResizing($ispl0, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
    GUICtrlSetResizing($ispl1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
    GUICtrlSetResizing($ispl2, BitOR($GUI_DOCKLEFT, $GUI_DOCKBOTTOM, $GUI_DOCKSIZE))
    GUICtrlSetResizing($ispl3, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKHEIGHT))
EndFunc   ;==>__setdefresizing

Func _GuiMenuCreate()
    Local $hFile = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hFile, 1, 'Open', 0)
    _GUICtrlMenu_InsertMenuItem($hFile, 2, 'Save', 0)
    _GUICtrlMenu_InsertMenuItem($hFile, 3, 'Save as', 0)
    _GUICtrlMenu_InsertMenuItem($hFile, 4, '')
    _GUICtrlMenu_InsertMenuItem($hFile, 5, "Exit", 0)
    
    Local $hWindow = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hWindow, 0, "Explorer", $ExplorerWindow)
    _GUICtrlMenu_InsertMenuItem($hWindow, 1, "The address book", $ListWindow)
    _GUICtrlMenu_InsertMenuItem($hWindow, 2, "Event Console", $ConsoleWindow)
    _GUICtrlMenu_InsertMenuItem($hWindow, 3, "IE Browser", $ContentWindow)
    
    For $iItemMenu = $ExplorerWindow To $ContentWindow
        _GUICtrlMenu_SetItemChecked($hWindow, $iItemMenu, 1, 0)
    Next
    
    Local $hMain = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hMain, 0, 'File', 0, $hFile)
    _GUICtrlMenu_InsertMenuItem($hMain, 1, 'Window', 0, $hWindow)
    
    _GUICtrlMenu_SetMenu($gui1, $hMain)
    
EndFunc   ;==>_GuiMenuCreate

Func SetPart($iDPI)
    Local $fscale = $iDPI / 96
    Local $Length = _WinAPI_GetClientWidth($gui1)
    For $i = 0 To _GUICtrlStatusBar_GetCount($hStatus) - 1
        If $i == 3 Then ContinueLoop
        $hStatus_PartsWidth[$i] = _GetTextWidth($hStatus, _GUICtrlStatusBar_GetText($hStatus, $i)) + 40 * $fscale
        $Length -= $hStatus_PartsWidth[$i]
    Next
    $hStatus_PartsWidth[3] = $Length
    _GUICtrlStatusBar_SetParts($hStatus, -1, $hStatus_PartsWidth)
EndFunc   ;==>SetPart

Func __OpenMenu($CtrlID, $lParam, $iDPI)
    Switch $CtrlID
        Case $ContentWindow, $ExplorerWindow, $ListWindow, $ConsoleWindow
            Local $hMenu = _GUICtrlMenu_GetMenu($gui1)
            Local $hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 1)
            Switch $CtrlID
                Case $ExplorerWindow
                    If _GUICtrlMenu_GetItemChecked($hSubMenu, 0) Then
                        _GUICtrlMenu_SetItemChecked($hSubMenu, 0, False)
                        _CtrlSplit_SetPos($ispl2, Default, 0)
                    Else
                        _GUICtrlMenu_SetItemChecked($hSubMenu, 0)
                        Select
                            Case _CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, 0, $SPM_HIDE) == $SPST_HIDE
                                If _CtrlSplit_ItemGetState($ispl2, $SPL_BOTTOM, 0, $SPM_HIDE) == 0 Then _GUICtrlMenu_SetItemChecked($hSubMenu, 1)
                                _CtrlSplit_SetPos($ispl1, _WinAPI_GetClientWidth($gui1) - _WinAPI_HiWord(_CtrlSplit_GetParam($ispl1)))
                                _CtrlSplit_SetParam($ispl1, _WinAPI_MakeLong(_GetLeft($ispl1), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl1)))
                                If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPM_HIDE) == $SPST_HIDE Then ContinueCase
                            Case Else
                                _CtrlSplit_SetPos($ispl2, Default, _WinAPI_LoWord(_CtrlSplit_GetParam($ispl2)))
                                _CtrlSplit_SetParam($ispl2, _WinAPI_MakeLong(_GetTop($ispl2), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl2)))
                        EndSelect
                    EndIf
                Case $ListWindow
                    If _GUICtrlMenu_GetItemChecked($hSubMenu, 1) Then
                        ;_GUICtrlMenu_SetItemChecked($hSubMenu, 1, False)
                        
                    Else
                        _GUICtrlMenu_SetItemChecked($hSubMenu, 1)
                        If _CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, 0, $SPM_HIDE) == $SPST_HIDE Then
                            If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPM_HIDE) == 0 Then _GUICtrlMenu_SetItemChecked($hSubMenu, 0)
                            _CtrlSplit_SetPos($ispl1, _WinAPI_GetClientWidth($gui1) - _WinAPI_HiWord(_CtrlSplit_GetParam($ispl1)))
                            _CtrlSplit_SetParam($ispl1, _WinAPI_MakeLong(_GetLeft($ispl1), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl1)))
                        Else
                            
                        EndIf
                    EndIf
                Case $ConsoleWindow
                    If _GUICtrlMenu_GetItemChecked($hSubMenu, 2) Then
                        _GUICtrlMenu_SetItemChecked($hSubMenu, 2, False)
                        _CtrlSplit_SetPos($ispl3, Default, _GetTop($hStatus))
                    Else
                        _GUICtrlMenu_SetItemChecked($hSubMenu, 2)
                        _CtrlSplit_SetPos($ispl3, Default, _WinAPI_GetClientHeight($gui1) - _WinAPI_HiWord(_CtrlSplit_GetParam($ispl3)))
                        _CtrlSplit_SetParam($ispl3, _WinAPI_MakeLong(_GetTop($ispl3), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl3)))
                    EndIf
                Case $ContentWindow
                    If _GUICtrlMenu_GetItemChecked($hSubMenu, 3) Then
                        _GUICtrlMenu_SetItemChecked($hSubMenu, 3, False)
                        _CtrlSplit_SetPos($ispl1, _WinAPI_GetClientWidth($gui1) - 1)
                    Else
                        _GUICtrlMenu_SetItemChecked($hSubMenu, 3)
                        _CtrlSplit_SetPos($ispl1, _WinAPI_GetClientWidth($gui1) - _WinAPI_HiWord(_CtrlSplit_GetParam($ispl1)))
                        _CtrlSplit_SetParam($ispl1, _WinAPI_MakeLong(_GetLeft($ispl1), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl1)))
                        _WinAPI_RedrawWindow($hContent, 0, 0, BitOR($RDW_INVALIDATE, $RDW_ALLCHILDREN))
                    EndIf
            EndSwitch
    EndSwitch
EndFunc   ;==>__OpenMenu

Func GuiMessageProc($hWnd, $iMsg, $wParam, $lParam)
    Local Static $iDPI = _WinAPI_GetDpiForPrimaryMonitor()
    Local Static $fscale = $iDPI / 96
    Local Static $cxFrame = _WinAPI_GetSystemMetricsForDpi($SM_CXSIZEFRAME, $iDPI)
    Local Static $cyFrame = _WinAPI_GetSystemMetricsForDpi($SM_CYSIZEFRAME, $iDPI)
    Local Static $cyCapt = _WinAPI_GetSystemMetricsForDpi($SM_CYCAPTION, $iDPI)
    Local Static $SysCommand = 0
    Local Static $iMenuBarHeight
    Local Static $guiLeft, $guiTop, $guiWidth, $guiHeight
    Local Static $iOldState
    Local Static $splhide1 = -1, $splhide2 = -1
    Switch $iMsg
        Case $WM_THEMECHANGED
            Local $fscale2 = 96 / _WinAPI_GetDpiForSystem()
            GUISetFont(9 * $fscale * $fscale2, 400, 0, Default, $gui1)
            GUICtrlSetFont($UserName, 30 * $fscale * $fscale2, 800)
            GUICtrlSetFont($CompanyName, 18 * $fscale * $fscale2, 800)
            GUICtrlSetFont($addressBar, 9 * $fscale * $fscale2)
            
            Local $tFont = _WinAPI_GetThemeSysFont(0, $TMT_ICONTITLEFONT)
            DllStructSetData($tFont, "Height", __SizeToHeight(9 * $fscale * $fscale2))
            _WinAPI_SetFont($hTreeViewTemplates, _WinAPI_CreateFontIndirect($tFont))
            _WinAPI_SetFont($hListViewTemplates, _WinAPI_CreateFontIndirect($tFont))
            _WinAPI_SetFont($hListViewAddress, _WinAPI_CreateFontIndirect($tFont))
            
            DllStructSetData($tFont, "Height", __SizeToHeight(11 * $fscale * $fscale2))
            DllStructSetData($tFont, "Weight", 500)
            _WinAPI_SetFont($hlistviewHeader, _WinAPI_CreateFontIndirect($tFont))
            
            DllStructSetData($tFont, "Height", __SizeToHeight(8 * $fscale * $fscale2))
            DllStructSetData($tFont, "Weight", 300)
            _WinAPI_SetFont($hConsole, _WinAPI_CreateFontIndirect($tFont))
            
            _WinAPI_SetWindowTheme($hTreeViewTemplates, 'explorer')
            _WinAPI_SetWindowTheme($hListViewTemplates, 'explorer')
            _WinAPI_SetWindowTheme($hListViewAddress, 'explorer')
            _WinAPI_SetWindowTheme($hConsole, 'explorer')
            _WinAPI_SetWindowTheme($hStatus, 'explorer')
            
            SetPart($iDPI)
            
        Case $WM_GETDPISCALEDSIZE
            
            _WinAPI_LockWindowUpdate($hWnd)
            
            Select
                Case _CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, 0, $SPM_HIDE) == $SPST_HIDE
                    $splhide1 = $SPL_LEFT
                Case _CtrlSplit_ItemGetState($ispl1, $SPL_RIGHT, 0, $SPM_HIDE) == $SPST_HIDE
                    $splhide1 = $SPL_RIGHT
            EndSelect
            
            If $splhide1 > -1 Then _CtrlSplit_SetPos($ispl1, _WinAPI_GetClientWidth($hWnd) - _WinAPI_HiWord(_CtrlSplit_GetParam($ispl1)))
            
            Select
                Case _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPM_HIDE) == $SPST_HIDE
                    $splhide2 = $SPL_TOP
                Case _CtrlSplit_ItemGetState($ispl2, $SPL_BOTTOM, 0, $SPM_HIDE) == $SPST_HIDE
                    $splhide2 = $SPL_BOTTOM
            EndSelect
            
            If $splhide2 > -1 Then _CtrlSplit_SetPos($ispl2, Default, _WinAPI_GetClientHeight($hWnd) - _WinAPI_HiWord(_CtrlSplit_GetParam($ispl2)))
            
            Local $hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 1)
            _GUICtrlMenu_SetItemChecked($hSubMenu, 0)
            _GUICtrlMenu_SetItemChecked($hSubMenu, 1)
            _GUICtrlMenu_SetItemChecked($hSubMenu, 3)
            
        Case $WM_DPICHANGED
            $iDPI = _WinAPI_LoWord($wParam)
            $fscale = $iDPI / 96
            Local $fscale2 = 96 / _WinAPI_GetDpiForSystem()
            $cxFrame = _WinAPI_GetSystemMetricsForDpi($SM_CXSIZEFRAME, $iDPI)
            $cyFrame = _WinAPI_GetSystemMetricsForDpi($SM_CYSIZEFRAME, $iDPI)
            $cyCapt = _WinAPI_GetSystemMetricsForDpi($SM_CYCAPTION, $iDPI)
            $iMenuBarHeight = __GetHeightMenuBar($hWnd)
            
            GUICtrlSetPos($UserImage, 16 * $fscale2, 15 * $fscale, 100 * $fscale, 100 * $fscale)
            GUICtrlSetPos($UserName, 153 * $fscale, 32 * $fscale, Default, 35 * $fscale)
            GUICtrlSetPos($CompanyName, 155 * $fscale, 77 * $fscale, Default, 30 * $fscale)
            GUICtrlSetPos($TreeViewTemplates, 16 * $fscale, 144 * $fscale, Default, _GetBottom($TreeViewTemplates) - 144 * $fscale)
            GUICtrlSetPos($ListViewTemplates, Default, 144 * $fscale, Default, _GetBottom($ListViewTemplates) - 144 * $fscale)
            GUICtrlSetPos($ispl0, Default, 144 * $fscale, Default, _GetBottom($ispl0) - 144 * $fscale)
            GUICtrlSetPos($ListViewAddress, 16 * $fscale, Default, _GetRight($ListViewAddress) - 16 * $fscale, _GetTop($ispl3) - _CtrlSplit_ItemGetDistance($ispl3, $SPL_TOP, $ListViewAddress, $SP_USEITEM) * $fscale - _GetTop($ListViewAddress))
            GUICtrlSetPos($ispl2, 10 * $fscale, Default, _GetRight($ispl2) - 10 * $fscale)
            
            GUICtrlSetPos($Obj, Default, 8 * $fscale, (_WinAPI_GetClientWidth($hWnd) - 8 * $fscale) - _GetLeft($hContent), _GetTop($ispl3) - _CtrlSplit_ItemGetDistance($ispl3, $SPL_TOP, $hContent, $SP_USEITEM) * $fscale - 8 * $fscale)
            GUICtrlSetPos($addressBar, Default, _GetBottom($hContent) + 12 * $fscale, (_WinAPI_GetClientWidth($hWnd) - 8 * $fscale) - _GetLeft($addressBar), 25 * $fscale)
            
            Local $tRECT = DllStructCreate($tagRECT, $lParam)
            Local $iWidth = DllStructGetData($tRECT, 3) - DllStructGetData($tRECT, 1)
            Local $iHeight = DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2)
            Local $guiOldWidth = $guiWidth, $guiOldHeight = $guiHeight
            
            _WinAPI_SetWindowPos($hWnd, 0, DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2), $iWidth, $iHeight, BitOR($SWP_NOACTIVATE, $SWP_NOZORDER, $SWP_NOREDRAW))
            
            Switch $splhide1
                Case $SPL_LEFT
                    _CtrlSplit_SetPos($ispl1, 0)
                Case $SPL_RIGHT
                    _CtrlSplit_SetPos($ispl1, _WinAPI_GetClientWidth($hWnd))
            EndSwitch
            
            Switch $splhide2
                Case $SPL_TOP
                    _CtrlSplit_SetPos($ispl2, Default, 0)
                Case $SPL_BOTTOM
                    
            EndSwitch
            
            __splreposition($guiWidth / $guiOldWidth, $guiHeight / $guiOldHeight, $iDPI)
            
            $splhide1 = -1
            $splhide2 = -1
            
            _SendMessage($hWnd, $WM_THEMECHANGED)
            
            Local $hImage = _GUICtrlTreeView_GetNormalImageList($hTreeViewTemplates)
            _GUIImageList_SetIconSize($hImage, 21 * $fscale, 21 * $fscale)
            _GUIImageList_Remove($hImage)
            _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', 3, 21 * $fscale, 21 * $fscale))
            _GUICtrlTreeView_SetNormalImageList($hTreeViewTemplates, $hImage)
            
            $hImage = _GUICtrlListView_GetImageList($hListViewTemplates, 0)
            _GUIImageList_SetIconSize($hImage, 48 * $fscale, 48 * $fscale)
            _GUIImageList_Remove($hImage)
            _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\imageres.dll', 15, 48 * $fscale, 48 * $fscale))
            _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', 3, 48 * $fscale, 48 * $fscale))
            _GUICtrlListView_SetImageList($hListViewTemplates, $hImage, 0)
            
            $hImage = _GUICtrlListView_GetImageList($hListViewAddress, 1)
            _GUIImageList_SetIconSize($hImage, 21 * $fscale, 21 * $fscale)
            _GUIImageList_Remove($hImage)
            _GUIImageList_ReplaceIcon($hImage, -1, _WinAPI_ShellExtractIcon(@SystemDir & '\imageres.dll', 83, 21 * $fscale, 21 * $fscale))
            _GUICtrlListView_SetImageList($hListViewAddress, $hImage, 1)
            
            ;__SetColumnWidthAuto($hListViewAddress)
            
            _WinAPI_LockWindowUpdate(0)
            
            Return 0
        Case $WM_UAHDRAWMENU
            $iMenuBarHeight = __GetHeightMenuBar($hWnd)
            If Not $lParam Then Return 0
        Case $WM_GETMINMAXINFO
            Local $tMINMAXINFO = DllStructCreate($tagPOINT & ";" & _
                    "int MaxSizeX; int MaxSizeY;" & _
                    "int MaxPositionX;int MaxPositionY;" & _
                    "int MinTrackSizeX; int MinTrackSizeY;" & _
                    "int MaxTrackSizeX; int MaxTrackSizeY", $lParam)
            Switch $SysCommand
                Case 0xF012, 0xF030, 0xF032, 0xF120
                    Return 0
            EndSwitch
            ; минимальные размеры окна
            
            Select
                Case Not _CtrlSplit_ItemGetState($ispl1, $SPL_RIGHT, $hContent, $SPST_MOVE, $SP_USEITEM)
                    DllStructSetData($tMINMAXINFO, "MinTrackSizeX", _GetRight($ispl1) + $cxFrame * 4 + 1 * $fscale)
                Case Else
                    DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 800 * $fscale)
            EndSelect
            
            Select
                Case Not _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, $TreeViewTemplates, $SPST_MOVE, $SP_USEITEM)
                    Local $iInterval = _CtrlSplit_ItemGetMinimal($ispl2, $SPL_TOP, $TreeViewTemplates, $SP_USEITEM) * $fscale
                    $iInterval += _CtrlSplit_ItemGetDistance($ispl2, $SPL_TOP, $TreeViewTemplates, $SP_USEITEM) * $fscale
                    $iInterval += ($guiHeight - _GetTop($ispl2))
                    DllStructSetData($tMINMAXINFO, "MinTrackSizeY", _GetTop($TreeViewTemplates) + $iInterval + $iMenuBarHeight + $cyFrame * 4 + $cyCapt)
                Case Else
                    DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 710 * $fscale)
            EndSelect
            
        Case $WM_SYSCOMMAND
            $SysCommand = $wParam
            Switch $wParam
                Case 0xF060
                    
                    _GUICtrlListView_UnRegisterSortCallBack($hListViewAddress)
                    
                    GUIDelete($hWnd)
                    Exit
                Case 0xF030
                    
            EndSwitch
            
        Case $WM_WINDOWPOSCHANGED
            Local $tPOS = DllStructCreate($tagWINDOWPOS, $lParam)
            
            Switch $SysCommand
                Case 0xF012, 0xF032 ;, 0xF030, 0xF120
                Case Else
                    $guiLeft = DllStructGetData($tPOS, "X") + $cxFrame * 2
                    $guiTop = DllStructGetData($tPOS, "Y") + $cyFrame * 2 + $cyCapt
                    $guiHeight = DllStructGetData($tPOS, "CY") - $cyFrame * 4 - $cyCapt - $iMenuBarHeight
                    $guiWidth = DllStructGetData($tPOS, "CX") - $cxFrame * 4
                    __ControlSetPos($hWnd, $guiWidth, $guiHeight, $iDPI)
            EndSwitch
        Case $WM_SIZE
            _WinAPI_PostMessage($hWnd, $WM_POSTSIZE, $wParam, $lParam)
        Case $WM_POSTSIZE
            Local Static $guiOldWidth = 0, $guiOldHeight = 0
            
            Switch Int($wParam)
                Case $SIZE_MINIMIZED
                    
                Case $SIZE_MAXIMIZED
                    __ControlSetPos($hWnd, $guiWidth, $guiHeight, $iDPI)
                    __splreposition($guiWidth / $guiOldWidth, $guiHeight / $guiOldHeight, $iDPI)
                    _WinAPI_RedrawWindow($hContent, 0, 0, BitOR($RDW_INVALIDATE, $RDW_ALLCHILDREN))
                Case $SIZE_RESTORED
                    Switch $iOldState
                        Case $SIZE_MAXIMIZED
                            __ControlSetPos($hWnd, $guiWidth, $guiHeight, $iDPI)
                            __splreposition($guiWidth / $guiOldWidth, $guiHeight / $guiOldHeight, $iDPI)
                            ContinueCase
                        Case $SIZE_MINIMIZED
                            _WinAPI_RedrawWindow($hContent, 0, 0, BitOR($RDW_INVALIDATE, $RDW_ALLCHILDREN))
                    EndSwitch
            EndSwitch
            $iOldState = Int($wParam)
            $guiOldWidth = $guiWidth
            $guiOldHeight = $guiHeight
            Return 0
        Case $WM_ENTERSIZEMOVE
            Switch $SysCommand
                Case 0xF012, 0xF030, 0xF032, 0xF120
                    Return 0
                Case 0xF006
                    
            EndSwitch
            
            _GUICtrlListView_BeginUpdate($hListViewAddress)
        Case $WM_EXITSIZEMOVE
            Switch $SysCommand
                Case 0xF032, 0xF030, 0xF120, 0xF012
                    Return 0
            EndSwitch
            
            __ControlSetPos($hWnd, $guiWidth, $guiHeight, $iDPI)
            
            _GUICtrlListView_EndUpdate($hListViewAddress)
            
        Case $WM_NOTIFY
            Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
            Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
            Local $iCtrlID = DllStructGetData($tNMHDR, "IDFrom")
            Local $iCode = DllStructGetData($tNMHDR, "Code")
            
            Switch $iCtrlID
                Case $ispl0 To $ispl3
                    Return _SplNotify($hWnd, $wParam, $lParam, $iDPI)
            EndSwitch
        Case $WM_COMMAND
            Local $iCode = _WinAPI_HiWord($wParam)
            Local $CtrlID = _WinAPI_LoWord($wParam)
            Switch $CtrlID
                Case $ExplorerWindow To $ContentWindow
                    Switch $iCode
                        Case $BN_CLICKED
                            Return __OpenMenu($CtrlID, $lParam, $iDPI)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>GuiMessageProc

Func __splreposition($ratio_x, $ratio_y, $iDPI)
    
    ;If $ratio_x == 1 And $ratio_y == 1 Then Return
    If _CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, 0, $SPM_HIDE) == 0 And _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPM_HIDE) == 0 Then
        Local $iX = _WinAPI_LoWord(_CtrlSplit_GetParam($ispl0))
        If $iX Then
            _CtrlSplit_SetPos($ispl0, Round($iX * $ratio_x))
            _CtrlSplit_SetParam($ispl0, _WinAPI_MakeLong(_GetLeft($ispl0), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl0)))
            ;IniWrite($DefSettingFile, "metrics", "spl_0x" & $iDPI, _GetLeft($ispl0))
        EndIf
    EndIf
    
    If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPM_HIDE) == 0 And _CtrlSplit_ItemGetState($ispl2, $SPL_BOTTOM, 0, $SPM_HIDE) == 0 Then
        Local $iY = _WinAPI_LoWord(_CtrlSplit_GetParam($ispl2))
        If $iY Then
            _CtrlSplit_SetPos($ispl2, Default, Round($iY * $ratio_y))
            _CtrlSplit_SetParam($ispl2, _WinAPI_MakeLong(_GetTop($ispl2), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl2)))
            ;IniWrite($DefSettingFile, "metrics", "spl_2x" & $iDPI, _GetTop($ispl2))
        EndIf
    EndIf
    
    If _CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, 0, $SPM_HIDE) == 0 And _CtrlSplit_ItemGetState($ispl1, $SPL_RIGHT, 0, $SPM_HIDE) == 0 Then
        Local $iX = _WinAPI_LoWord(_CtrlSplit_GetParam($ispl1))
        If $iX Then
            _CtrlSplit_SetPos($ispl1, Round($iX * $ratio_x))
            _CtrlSplit_SetParam($ispl1, _WinAPI_MakeLong(_GetLeft($ispl1), _WinAPI_GetClientWidth($gui1) - _GetLeft($ispl1)))
            ;IniWrite($DefSettingFile, "metrics", "spl_1x" & $iDPI, _GetLeft($ispl1))
        EndIf
    EndIf
    
    If _CtrlSplit_ItemGetState($ispl3, $SPL_BOTTOM, 0, $SPM_HIDE) == 0 Then
        Local $iY = _WinAPI_LoWord(_CtrlSplit_GetParam($ispl3))
        If $iY Then
            _CtrlSplit_SetPos($ispl3, Default, Round($iY * $ratio_y))
            _CtrlSplit_SetParam($ispl3, _WinAPI_MakeLong(_GetTop($ispl3), _WinAPI_GetClientHeight($gui1) - _GetTop($ispl3)))
            ;IniWrite($DefSettingFile, "metrics", "spl_3x" & $iDPI, _GetTop($ispl3))
        EndIf
    EndIf
    
EndFunc   ;==>__splreposition

Func __ControlSetPos($hWnd, $guiWidth, $guiHeight, $iDPI)
    Local $fscale = $iDPI / 96
    _GUICtrlStatusBar_Resize($hStatus)
    Local $tRECT = _WinAPI_GetWindowRect($hStatus)
    __rectScreenToClient($hWnd, $tRECT)
    Local $iHeightStatus = DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2)
    Local $iConsolHeight = $guiHeight - _GetBottom($ispl3) - _CtrlSplit_ItemGetDistance($ispl3, $SPL_BOTTOM, $hConsole, $SP_USEITEM) * $fscale - $iHeightStatus - 5 * $fscale
    _WinAPI_SetWindowPos($hConsole, 0, 5 * $fscale, DllStructGetData($tRECT, 2) - $iConsolHeight - 5 * $fscale, $guiWidth - 10 * $fscale, $iConsolHeight, BitOR($SWP_NOACTIVATE, $SWP_NOZORDER))
    Local $Length = $guiWidth
    For $iPart = 0 To _GUICtrlStatusBar_GetCount($hStatus) - 1
        If $iPart == 3 Then ContinueLoop
        $Length -= $hStatus_PartsWidth[$iPart]
    Next
    $hStatus_PartsWidth[3] = $Length
    _GUICtrlStatusBar_SetParts($hStatus, -1, $hStatus_PartsWidth)
EndFunc   ;==>__ControlSetPos

Func __HeightToSize($size, $hWnd = _WinAPI_GetDesktopWindow())
    Local $hDC = _WinAPI_GetDC($hWnd)
    Return -Round(_WinAPI_MulDiv($size, 72, _WinAPI_GetDeviceCaps($hDC, $LOGPIXELSY)), 1)
EndFunc   ;==>__HeightToSize

Func __SizeToHeight($size, $hWnd = _WinAPI_GetDesktopWindow())
    Local $hDC = _WinAPI_GetDC($hWnd)
    Return -Round(_WinAPI_MulDiv($size, _WinAPI_GetDeviceCaps($hDC, $LOGPIXELSY), 72), 1)
EndFunc   ;==>__SizeToHeight

Func TemplatesTreeUpdate()
    _GUICtrlTreeView_DeleteAll($hTreeViewTemplates)
    Local $hItem = _GUICtrlTreeView_AddFirst($hTreeViewTemplates, 0, "Рабочий стол", 0)
    FileChangeDir(@UserProfileDir)
    __TreeViewCreate("Desktop", $hItem)
    FileChangeDir(@ScriptDir)
    _GUICtrlTreeView_EnsureVisible($hTreeViewTemplates, _GUICtrlTreeView_GetFirstChild($hTreeViewTemplates, $hItem))
    _GUICtrlTreeView_EnsureVisible($hTreeViewTemplates, $hItem)
EndFunc   ;==>TemplatesTreeUpdate

Func __TreeViewCreate($sPath, $hParent)
    Local $hSearch = FileFindFirstFile($sPath & "\*")
    If $hSearch = -1 Then Return
    Local $sFile, $hItem
    While 1
        $sFile = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        If IsFile($sFile) Then ContinueLoop
        $hItem = _GUICtrlTreeView_AddChild($hTreeViewTemplates, $hParent, $sFile, 0)
        __TreeViewCreate($sPath & '\' & $sFile, $hItem)
    WEnd
EndFunc   ;==>__TreeViewCreate

Func TemplatesListUpdate($sPath)
    
    _GUICtrlListView_DeleteAllItems($hListViewTemplates)
    Local $hSearch = FileFindFirstFile($sPath & "\*")
    If $hSearch = -1 Then Return
    Local $sFile
    While 1
        $sFile = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        
        If IsFile($sFile) Then
            _GUICtrlListView_AddItem($hListViewTemplates, $sFile, 0)
        Else
            _GUICtrlListView_AddItem($hListViewTemplates, $sFile, 1)
        EndIf
    WEnd
    
    _GUICtrlListView_Arrange($hListViewTemplates, 1)
EndFunc   ;==>TemplatesListUpdate

Func IsFile($Path)
    Local $error = 0
    If Not FileExists($Path) Then
        Local $sDrive = "", $sDir = "", $sFileName = "", $sExtension = ""
        Local $aPath = _PathSplit($Path, $sDrive, $sDir, $sFileName, $sExtension)
        $error = 1
        If $aPath[4] Then Return SetError($error, 0, True)
    Else
        If Not StringInStr(FileGetAttrib($Path), 'D') Then Return SetError($error, 0, True)
    EndIf
    Return SetError($error, 0, False)
EndFunc   ;==>IsFile

Func __GetHeightMenuBar($hWnd)
    Local $tInfo = DllStructCreate($tagMENUBARINFO)
    DllStructSetData($tInfo, "Size", DllStructGetSize($tInfo))
    
    Local $aResult = DllCall("user32.dll", "bool", "GetMenuBarInfo", "hwnd", $hWnd, "long", $OBJID_MENU, "long", 0, "struct*", $tInfo)
    If @error Then Return SetError(@error, @extended, 0)
    Return DllStructGetData($tInfo, "Bottom") - DllStructGetData($tInfo, "Top")
EndFunc   ;==>__GetHeightMenuBar

Func _GetTextWidth($CtrlID, $sText, $hFont = 0)
    Local $hWnd = (IsHWnd($CtrlID) ? $CtrlID : GUICtrlGetHandle($CtrlID))
    If Not $hFont Then $hFont = _SendMessage($hWnd, $WM_GETFONT)
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $hSelectObject = _WinAPI_SelectObject($hDC, $hFont)
    Local $tSIZE = _WinAPI_GetTextExtentPoint32($hDC, $sText)
    _WinAPI_SelectObject($hDC, $hSelectObject)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    If IsDllStruct($tSIZE) Then Return SetError(0, $tSIZE.Y, $tSIZE.X)
    Return SetError(1, 0, 0)
EndFunc   ;==>_GetTextWidth

 

CtrlSplitNotify.au3

Spoiler
;CtrlSplitNotify.au3

#include-once

Func _SplNotify($hWnd, $wParam, $lParam, $iDPI)
    Local Static $fscale = $iDPI / 96
    Local Static $cxFrame = _WinAPI_GetSystemMetricsForDpi($SM_CXSIZEFRAME, $iDPI)
    Local Static $cyFrame = _WinAPI_GetSystemMetricsForDpi($SM_CYSIZEFRAME, $iDPI)
    Local Static $cyCapt = _WinAPI_GetSystemMetricsForDpi($SM_CYCAPTION, $iDPI)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    Local $iCtrlID = DllStructGetData($tNMHDR, "IDFrom")
    Local $iCode = DllStructGetData($tNMHDR, "Code")
    
    
    Switch $iCode
        Case $SPN_GETMINMAXINFO ; setting the maximum end position of the splitter
            Local $tMINMAXINFO = DllStructCreate($tagSPLMINMAXINFO, $lParam)
            ; setting values applies only to those splitters that have the $WM_NCLBUTTONDOWN state.
            Switch $iCtrlID
                Case $ispl0
                    Local $iVal = 16 * $fscale
                    If (_CtrlSplit_ItemGetState($ispl1, $SPL_LEFT, $iCtrlID, $SPM_MOVE, $SP_USEITEM) == $SPST_MOVE) Then $iVal = 0
                    DllStructSetData($tMINMAXINFO, "MinPositionLeft", $iVal)
                Case $ispl1
                    DllStructSetData($tMINMAXINFO, "MinPositionRight", Round(1 * $fscale))
                Case $ispl2
                    ;DllStructSetData($tMINMAXINFO, "MinPositionTop", Round(1 * $fscale))
                Case $ispl3
                    DllStructSetData($tMINMAXINFO, "MinPositionBottom", _GetHeight($hStatus) - Round(_CtrlSplit_GetThickness($ispl3) * $fscale))
                    DllStructSetData($tMINMAXINFO, "MinPositionTop", _WinAPI_GetClientHeight($hWnd) /2)
            EndSwitch
        Case $SPN_LIMITPOS ; the splitter has reached the end position specified in SPN_GETMINMAXINFO
            ;ConsoleWrite('! '& $iCtrlID& ' set limit pos ' & __s($wParam) & @CR)
            Switch $wParam
                Case $SPL_LEFT
                    Switch $iCtrlID
                        Case $ispl1, $ispl0
                            _CtrlSplit_ItemSetState($iCtrlID, $wParam, 0, $SPM_HIDE, $SPST_HIDE)
                    EndSwitch
                Case $SPL_RIGHT
                    Switch $iCtrlID
                        Case $ispl1
                            _CtrlSplit_ItemSetState($iCtrlID, $wParam, 0, $SPM_HIDE, $SPST_HIDE)
                    EndSwitch
                Case $SPL_TOP
                    Switch $iCtrlID
                        Case $ispl2
                            _CtrlSplit_ItemSetState($iCtrlID, $wParam, 0, $SPM_HIDE, $SPST_HIDE)
                    EndSwitch
                Case $SPL_BOTTOM
                    Switch $iCtrlID
                        Case $ispl3
                            _CtrlSplit_ItemSetState($iCtrlID, $wParam, 0, $SPM_HIDE, $SPST_HIDE)
                    EndSwitch
            EndSwitch
        Case $SPN_CAPTURECHANGED
            
        Case $SPN_LBUTTONDBLCLK
            
        Case $SPN_LBUTTONCLK
            ; When releasing the mouse button, we hide the elements marked as $SPST_HIDE, along with the splitter containing these elements.
            For $SPL_POS = $SPL_LEFT To $SPL_BOTTOM
                For $iIndex = 0 To _CtrlSplit_ItemGetCount($iCtrlID, $SPL_POS) -1
                    If _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE) == $SPST_HIDE Then 
                        _CtrlSplit_ShowItem($iCtrlID, $SPL_POS, $iIndex, False)
                        _CtrlSplit_Show($iCtrlID, 0)
                        
                        Local $hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 1)
                        
                        Switch $iCtrlID
                            Case $ispl0
                                
                            Case $ispl1
                                Switch $SPL_POS
                                    Case $SPL_LEFT
                                        _GUICtrlMenu_SetItemChecked($hSubMenu, 0, False)
                                        _GUICtrlMenu_SetItemChecked($hSubMenu, 1, False)
                                    Case $SPL_RIGHT
                                        _GUICtrlMenu_SetItemChecked($hSubMenu, 3, False)
                                EndSwitch
                            Case $ispl2
                                Switch $SPL_POS
                                    Case $SPL_TOP
                                        _GUICtrlMenu_SetItemChecked($hSubMenu, 0, False)
                                EndSwitch
                            Case $ispl3
                                _GUICtrlMenu_SetItemChecked($hSubMenu, 2, False)
                        EndSwitch
                    EndIf
                Next
            Next
            Return 0
        Case $SPN_COLLAPSING ; the child element in the splitter has reached the minimum size
            ; in the $TPOs structure, we get the coordinates of the stop
            Local $tInfo = DllStructCreate($tagSPLITPOS, $lParam)
            Local $tPOS = DllStructCreate($tagWINDOWPOS, DllStructGetData($tInfo, "pntpos"))
            Local $SPL_POS = DllStructGetData($tInfo, "spPosition")
            Local $iIndex = DllStructGetData($tInfo, "spIndex")
            Local $iItem = (__iswindow(DllStructGetData($tInfo, "spItem")) ? DllStructGetData($tInfo, "spItem") : Int(DllStructGetData($tInfo, "spItem")))
            If Not @Compiled Then ConsoleWrite('! '& $iCtrlID& ' set minimal ' & __s($SPL_POS) & ' '  & $iItem & ' [' &$iIndex& '] [' & __cls($iItem) & ']' & @CR)
            Switch $SPL_POS
                Case $SPL_LEFT, $SPL_RIGHT
                    Switch $iCtrlID
                        Case $ispl0; vertical small
                            If _CtrlSplit_FindItem($ispl1, $iCtrlID, $SPL_LEFT) == -1 Then Return 0
                            Switch $SPL_POS
                                Case $SPL_LEFT
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_NORESIZING)
                                    _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS)
                                    Return 1
                            EndSwitch
                        Case $ispl1 ; vertical large
                            Switch $SPL_POS
                                Case $SPL_LEFT
                                    Switch $iItem
                                        Case $UserName
                                            _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $UserImage, $SP_NORESIZING)
                                        Case $ListViewTemplates
                                            Local $i = _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $ispl0, $SP_NORESIZING)
                                            _CtrlSplit_ItemSetMinimal($iCtrlID, $SPL_POS, $i, _WinAPI_GetClientWidth(GUICtrlGetHandle($ispl0)))
                                            _CtrlSplit_ItemDelete($ispl0, $SPL_RIGHT, $ListViewTemplates, $SP_USEITEM)
                                            _CtrlSplit_Lock($ispl0, 0)
                                        Case $ispl0
                                            
                                    EndSwitch
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_NORESIZING)
                                    _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS)
                                    Return 1
                                Case $SPL_RIGHT
                                    Switch $iItem
                                        Case $hContent
                                            GUICtrlSetResizing($iCtrlID, BitOR($GUI_DOCKTOP, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
                                            GUICtrlSetResizing($Obj, BitOR($GUI_DOCKTOP, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
                                            
                                            For $i = 0 To _CtrlSplit_ItemGetCount($iCtrlID, $SPL_LEFT) -1
                                                $iItem = _CtrlSplit_GetItem($iCtrlID, $SPL_LEFT, $i)
                                                Switch $iItem
                                                    Case $ispl2
                                                        If _CtrlSplit_ItemGetState($iItem, $SPL_TOP, 0, $SPST_MOVE) Then 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKRIGHT, $GUI_DOCKHEIGHT))
                                                        Else 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKHEIGHT))
                                                        EndIf
                                                    Case $ListViewAddress
                                                        If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPST_MOVE) Then 
                                                            GUICtrlSetResizing($iItem, $GUI_DOCKBORDERS)
                                                        Else 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKHEIGHT))
                                                        EndIf
                                                    Case $ListViewTemplates
                                                        If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, $iItem, $SPST_MOVE, $SP_USEITEM) Then 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKRIGHT, $GUI_DOCKHEIGHT))
                                                        Else 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM))
                                                        EndIf
                                                    Case Else 
                                                        GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKRIGHT, $GUI_DOCKHEIGHT))
                                                EndSwitch
                                            Next
                                        Case Else 
                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKSIZE))
                                    EndSwitch
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_NORESIZING)
                                    _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS)
                                    Return 1
                            EndSwitch
                    EndSwitch
                Case $SPL_TOP, $SPL_BOTTOM
                    Switch $iCtrlID
                        Case $ispl2 ; horizontal small
                            Switch $SPL_POS
                                Case $SPL_TOP
                                    ;Return 0
                                    If _CtrlSplit_FindItem($ispl3, $iCtrlID, $SPL_TOP) > -1 Then
                                        Local $iY = _GetBottom($ispl2) + _CtrlSplit_ItemGetDistance($ispl3, $SPL_TOP, $ispl2, $SP_USEITEM) * $fscale
                                        _CtrlSplit_SetPosLimit($ispl3, _WinAPI_MakeLong(0, $iY))
                                        ;_WinAPI_Mouse_Event($MOUSEEVENTF_LEFTUP)
                                        Return 0
                                    EndIf
                                    Local $iResizing = (_CtrlSplit_ItemGetState($ispl1, $SPL_RIGHT, $hContent, $SPST_MOVE, $SP_USEITEM) ? $GUI_DOCKRIGHT : $GUI_DOCKWIDTH)
                                    Switch $iItem
                                        Case $TreeViewTemplates
                                            _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $UserImage, $SP_NORESIZING)
                                            _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $UserName, $SP_NORESIZING)
                                            _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $CompanyName, $SP_NORESIZING)
                                            
                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
                                            GUICtrlSetResizing($ListViewAddress, BitOR($iResizing, $GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM))
                                            GUICtrlSetResizing($iCtrlID, BitOR($iResizing, $GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKHEIGHT))
                                        Case Else 
                                            If _CtrlSplit_IsSpl($iItem) Then 
                                                GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
                                            Else 
                                                GUICtrlSetResizing($iItem, BitOR($iResizing, $GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKHEIGHT))
                                            EndIf
                                    EndSwitch
                                    
                                    ConsoleWrite("pos " & DllStructGetData($tPOS, "Y") & @CR)
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_NORESIZING)
                                    _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS)
                                    Return 1
                                Case $SPL_BOTTOM
                                    
                            EndSwitch
                        Case $ispl3 ; horizontal large
                            Switch $SPL_POS
                                Case $SPL_TOP
                                    Return 0
;~                                     Switch $iItem
;~                                         Case $ispl2
;~                                             ConsoleWrite('set' & @CR)
;~                                             Return 0
;~                                         Case $ListViewAddress
;~                                             _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_NORESIZING)
;~                                             _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $ispl2, $SP_NORESIZING), $SPM_MOVE, $SPST_STOP)
;~                                             _CtrlSplit_ItemSetResizing($ispl2, $SPL_BOTTOM, $iItem, $SP_NORESIZING, $SP_USEITEM)
;~                                             
;~                                             _CtrlSplit_ItemUpdate($ispl2, $SPL_BOTTOM)
;~                                             _CtrlSplit_Lock($ispl2, 0)
;~                                             _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS)
;~                                             Return 1
;~                                     EndSwitch
                                Case $SPL_BOTTOM
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_NORESIZING)
                                    _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS)
                                    Return 1
                            EndSwitch
                    EndSwitch
            EndSwitch
            Return 0
        Case $SPN_UNCOLLAPSING ; before changing the position of the splitter.
            ; By setting values in the $TPOs structure, you can limit the movement or set the size of the splitter.
            Local $tInfo = DllStructCreate($tagSPLITPOS, $lParam)
            Local $tPOS = DllStructCreate($tagWINDOWPOS, DllStructGetData($tInfo, "pntpos"))
            Local $SPL_POS = DllStructGetData($tInfo, "spPosition")
            Local $iIndex = DllStructGetData($tInfo, "spIndex")
            Local $iItem = (__iswindow(DllStructGetData($tInfo, "spItem")) ? DllStructGetData($tInfo, "spItem") : Int(DllStructGetData($tInfo, "spItem")))
            Local $state = _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, 0x0FF0)
            Select
                Case BitAND($state, $SPM_MOVE) ; if the element is minimized and moves without resizing
                    
                    If Not @Compiled Then ConsoleWrite('- '& $iCtrlID& ' unset ' & __s($SPL_POS) & ' ' & $iItem & ' [' &$iIndex& '] [' & __cls($iItem) & ']' & @CR)
                    
                    Switch $SPL_POS
                        Case $SPL_LEFT
                            Switch $iCtrlID
                                Case $ispl0 ; vertical small
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_RESIZING)
                                    If _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE) == $SPST_HIDE Then 
                                        _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE, 0)
                                        _CtrlSplit_ShowItem($iCtrlID, $SPL_POS, $iIndex)
                                        _CtrlSplit_Show($iCtrlID)
                                    EndIf
                                Case $ispl1 ; vertical large
                                    Switch $iItem
                                        Case $ListViewTemplates
                                            _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS, $ispl0, $SP_USEITEM)
                                            _CtrlSplit_Lock($ispl0)
                                            _CtrlSplit_AddItem($ispl0, $SPL_RIGHT, $ListViewTemplates, $SP_RESIZING)
                                            _CtrlSplit_ItemUpdate($ispl0, $SPL_POS)
                                            _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_RESIZING)
                                        Case $UserName
                                            _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS, $UserImage, $SP_USEITEM)
                                            ContinueCase 
                                        Case Else 
                                            _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_RESIZING)
                                    EndSwitch
                                    If _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE) == $SPST_HIDE Then 
                                        _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE, 0)
                                        _CtrlSplit_ShowItem($iCtrlID, $SPL_POS, $iIndex)
                                        _CtrlSplit_Show($iCtrlID)
                                    EndIf
                            EndSwitch
                        Case $SPL_RIGHT
                            Switch $iCtrlID
                                Case $ispl1 ; vertical large
                                    Switch $iItem
                                        Case $hContent
                                            GUICtrlSetResizing($iCtrlID, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
                                            GUICtrlSetResizing($Obj, $GUI_DOCKBORDERS)
                                            
                                            For $i = 0 To _CtrlSplit_ItemGetCount($iCtrlID, $SPL_LEFT) -1
                                                $iItem = _CtrlSplit_GetItem($iCtrlID, $SPL_LEFT, $i)
                                                Switch $iItem
                                                    Case $ispl2
                                                        If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPST_MOVE) Then 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
                                                        Else 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKBOTTOM, $GUI_DOCKSIZE))
                                                        EndIf
                                                    Case $ListViewAddress
                                                        If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, 0, $SPST_MOVE) Then 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
                                                        Else 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKBOTTOM, $GUI_DOCKSIZE))
                                                        EndIf
                                                    Case Else 
                                                        If _CtrlSplit_ItemGetState($ispl2, $SPL_TOP, $iItem, $SPST_MOVE, $SP_USEITEM) Then 
                                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
                                                        Else 
                                                            Switch $iItem
                                                                Case $ListViewTemplates
                                                                    GUICtrlSetResizing($iItem, BitOR($GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT, $GUI_DOCKWIDTH))
                                                                Case Else 
                                                                    GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
                                                            EndSwitch
                                                        EndIf
                                                EndSwitch
                                            Next
                                            
                                        Case Else 
                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKBOTTOM, $GUI_DOCKRIGHT, $GUI_DOCKHEIGHT))
                                    EndSwitch
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_RESIZING)
                                    If _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE) == $SPST_HIDE Then 
                                        _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE, 0)
                                        _CtrlSplit_ShowItem($iCtrlID, $SPL_POS, $iIndex)
                                        _CtrlSplit_Show($iCtrlID)
                                    EndIf
                            EndSwitch
                        Case $SPL_TOP
                            Switch $iCtrlID
                                Case $ispl2 ; horizontal small
                                    Switch $iItem
                                        Case $TreeViewTemplates
                                            If _CtrlSplit_FindItem($ispl3, $iCtrlID, $SPL_TOP) == -1 Then
                                                _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS, $UserImage, $SP_USEITEM)
                                                _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS, $UserName, $SP_USEITEM)
                                                _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS, $CompanyName, $SP_USEITEM)
                                                GUICtrlSetResizing($ispl3, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKHEIGHT))
                                            EndIf
                                            GUICtrlSetResizing($ListViewAddress, BitOR($GUI_DOCKBOTTOM, $GUI_DOCKLEFT, $GUI_DOCKSIZE))
                                            GUICtrlSetResizing($iCtrlID, BitOR($GUI_DOCKLEFT, $GUI_DOCKBOTTOM, $GUI_DOCKSIZE))
                                            ContinueCase 
                                        Case Else 
                                            GUICtrlSetResizing($iItem, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKWIDTH))
                                    EndSwitch
                                    
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_RESIZING)
                                    If _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE) == $SPST_HIDE Then 
                                        _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE, 0)
                                        _CtrlSplit_ShowItem($iCtrlID, $SPL_POS, $iIndex)
                                        _CtrlSplit_Show($iCtrlID)
                                    EndIf
                                    
                                Case $ispl3
                                    Switch $iItem
                                        Case $ListViewAddress
                                            _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS, $ispl2, $SP_USEITEM)
                                            _CtrlSplit_ItemSetResizing($ispl2, $SPL_BOTTOM, $ListViewAddress, $SP_RESIZING, $SP_USEITEM)
                                            _CtrlSplit_Lock($ispl2)
                                            _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_RESIZING)
                                    EndSwitch
                            EndSwitch
                        Case $SPL_BOTTOM
                            Switch $iCtrlID
                                Case $ispl2 ; horizontal small
                                    
                                Case $ispl3
                                    _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $SP_RESIZING)
                                    If _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE) == $SPST_HIDE Then 
                                        _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, $iIndex, $SPM_HIDE, 0)
                                        _CtrlSplit_ShowItem($iCtrlID, $SPL_POS, $iIndex)
                                        _CtrlSplit_Show($iCtrlID)
                                    EndIf
                            EndSwitch
                    EndSwitch
                    
                    _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS)
                    Return 0
            EndSelect
            
            Return 0
        Case $SPN_POSCHANGED ; after changing the position of the splitter
            ; If SPN_COLLAPSING returned 1, then the $TPOs structure contains the new coordinates and the specified dimensions of the splitter.
            
            Local $tInfo = DllStructCreate($tagSPLITPOS, $lParam)
            Local $tPOS = DllStructCreate($tagWINDOWPOS, DllStructGetData($tInfo, "pntpos"))
            Local $SPL_POS = DllStructGetData($tInfo, "spPosition")
;~             Local $iIndex = DllStructGetData($tInfo, "spIndex")
;~             Local $iItem = (_WinAPI_IsWindow(DllStructGetData($tInfo, "spItem")) ? DllStructGetData($tInfo, "spItem") : Int(DllStructGetData($tInfo, "spItem")))
;~             Local $Param = _CtrlSplit_ItemGetParam($iCtrlID, $SPL_POS, $iIndex)
;~             Local $distance = _CtrlSplit_ItemGetDistance($iCtrlID, $SPL_POS, $iIndex)
;~             Local $min = _CtrlSplit_ItemGetMinimal($iCtrlID, $SPL_POS, $iIndex)
;~             Local $state = _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, 0x0FF0)
;~             Local $resizing = _CtrlSplit_ItemGetResizing($iCtrlID, $SPL_POS, $iIndex)
            
            Switch $iCtrlID
                Case $ispl1
                    Switch $SPL_POS
                        Case $SPL_LEFT
                            Local $iCount = _GUICtrlListView_GetColumnCount($hListViewAddress)
                            Local $tRECT = _GUICtrlHeader_GetItemRectEx(_GUICtrlListView_GetHeader($hListViewAddress), $iCount -2)
                            If DllStructGetData($tRECT, 3) < DllStructGetData($tPOS, "X") + _GetWidth($iCtrlID) Then 
                                _GUICtrlListView_SetColumnWidth($hListViewAddress, $iCount -1, _WinAPI_GetClientWidth($hListViewAddress) - DllStructGetData($tRECT, 3))
                            EndIf
                    EndSwitch
                Case $ispl3
                    
            EndSwitch
            Return 0
        Case $SPN_ENTERSIZEMOVE
            Switch $iCtrlID
                Case $ispl0
                    Local $iIndex = _CtrlSplit_FindItem($ispl1, $ispl0, $SPL_LEFT)
                    If $iIndex > -1 Then
                        _CtrlSplit_ItemDelete($ispl1, $SPL_LEFT, $iIndex)
                        _CtrlSplit_ItemSetResizing($ispl0, $SPL_RIGHT, $ListViewTemplates, $SP_RESIZING, $SP_USEITEM)
                        _CtrlSplit_ItemSetResizing($ispl1, $SPL_LEFT, $ListViewTemplates, $SP_RESIZING, $SP_USEITEM)
                        _CtrlSplit_ItemSetState($ispl1, $SPL_LEFT, $ListViewTemplates, $SPM_MOVE, 0, $SP_USEITEM)
                    EndIf
                Case $ispl1
                    If _CtrlSplit_FindItem($iCtrlID, $ispl0, $SPL_LEFT) > -1 Then _CtrlSplit_Lock($ispl0, 0)
                    _GUICtrlListView_BeginUpdate($hListViewAddress)
                Case $ispl2
                    _GUICtrlListView_BeginUpdate($hListViewAddress)
                Case $ispl3
                    If _CtrlSplit_FindItem($iCtrlID, $ispl2, $SPL_TOP) > -1 Then _CtrlSplit_Lock($ispl2, 0)
                    _GUICtrlListView_BeginUpdate($hListViewAddress)
            EndSwitch
            
            Select 
                Case BitAND(_CtrlSplit_GetStyle($iCtrlID), $SPS_VERTICAL)
                    If Not (_CtrlSplit_ItemGetState($iCtrlID, $SPL_LEFT, 0, $SPM_HIDE) == $SPST_HIDE Or _CtrlSplit_ItemGetState($iCtrlID, $SPL_RIGHT, 0, $SPM_HIDE) == $SPST_HIDE) Then 
                        _CtrlSplit_SetParam($iCtrlID, _WinAPI_MakeLong(_GetLeft($iCtrlID), _WinAPI_GetClientWidth($gui1) -_GetLeft($iCtrlID)))
                    EndIf
                Case BitAND(_CtrlSplit_GetStyle($iCtrlID), $SPS_HORIZONTAL)
                    If Not (_CtrlSplit_ItemGetState($iCtrlID, $SPL_TOP, 0, $SPM_HIDE) == $SPST_HIDE Or _CtrlSplit_ItemGetState($iCtrlID, $SPL_BOTTOM, 0, $SPM_HIDE) == $SPST_HIDE) Then 
                        _CtrlSplit_SetParam($iCtrlID, _WinAPI_MakeLong(_GetTop($iCtrlID), _WinAPI_GetClientHeight($gui1) -_GetTop($iCtrlID)))
                    EndIf
            EndSelect
            
        Case $SPN_EXITSIZEMOVE
            Switch $iCtrlID
                Case $ispl0
                    
                Case $ispl1
                    If _CtrlSplit_FindItem($iCtrlID, $ispl0, $SPL_LEFT) > -1 Then _CtrlSplit_Lock($ispl0, 1)
                    _GUICtrlListView_EndUpdate($hListViewAddress)
                    _WinAPI_RedrawWindow($hContent, 0, 0, BitOR($RDW_INVALIDATE, $RDW_ALLCHILDREN))
                Case $ispl2
                    _GUICtrlListView_EndUpdate($hListViewAddress)
                Case $ispl3
                    If _CtrlSplit_FindItem($iCtrlID, $ispl2, $SPL_TOP) > -1 Then _CtrlSplit_Lock($ispl2, 1)
                    _GUICtrlListView_EndUpdate($hListViewAddress)
                    _WinAPI_RedrawWindow($hContent, 0, 0, BitOR($RDW_INVALIDATE, $RDW_ALLCHILDREN))
            EndSwitch
    EndSwitch
    Return 0
EndFunc   ;==>_SplNotify

Func __s($SPL_POS)
    Switch $SPL_POS
        Case $SPL_LEFT
            Return "left"
        Case $SPL_RIGHT
            Return "right"
        Case $SPL_TOP
            Return "top"
        Case $SPL_BOTTOM
            Return "bottom"
    EndSwitch
EndFunc   ;==>__s

Func __cls($iCtrlID)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Return _WinAPI_GetClassName($hControl)
EndFunc

 

CtrlSplit.au3

Spoiler
;CtrlSplit.au3

#include-once

#include <ApiDPI.au3>
OnAutoItExitRegister("__ctrlSplitExit")
Global $__h_DllSubclassCtrlSplit = DllCallbackRegister('__ctrlSplitProc', 'lresult', 'hwnd;uint;wparam;lparam;uint_ptr;dword_ptr')

#Region Constants
; Window messages
Global Const $WM_SPL_CREATE = _WinAPI_RegisterWindowMessage("WM_SPL_CREATE")
Global Const $WM_SPL_ADDITEM = _WinAPI_RegisterWindowMessage("WM_SPL_ADDITEM")
Global Const $WM_SPL_DELITEM = _WinAPI_RegisterWindowMessage("WM_SPL_DELITEM")
Global Const $WM_SPL_GETINFO = _WinAPI_RegisterWindowMessage("WM_SPL_GETINFO")
Global Const $WM_SPL_GETITEMCOUNT = _WinAPI_RegisterWindowMessage("WM_SPL_GETITEMCOUNT")
Global Const $WM_SPL_GETITEM = _WinAPI_RegisterWindowMessage("WM_SPL_GETITEM")
Global Const $WM_SPL_GETINDEX = _WinAPI_RegisterWindowMessage("WM_SPL_GETINDEX")
Global Const $WM_SPL_GETITEMRECT = _WinAPI_RegisterWindowMessage("WM_SPL_GETITEMRECT")
Global Const $WM_SPL_GETLOCKSPLITTING = _WinAPI_RegisterWindowMessage("WM_SPL_GETLOCKSPLITTING")
Global Const $WM_SPL_SETLOCKSPLITTING = _WinAPI_RegisterWindowMessage("WM_SPL_SETLOCKSPLITTING")
Global Const $WM_SPL_STOPSPLIT = _WinAPI_RegisterWindowMessage("WM_SPL_STOPSPLIT")
Global Const $WM_SPL_GETPARAM = _WinAPI_RegisterWindowMessage("WM_SPL_GETPARAM")
Global Const $WM_SPL_SETPARAM = _WinAPI_RegisterWindowMessage("WM_SPL_SETPARAM")
Global Const $WM_SPL_GETSIZE = _WinAPI_RegisterWindowMessage("WM_SPL_GETSIZE")
Global Const $WM_SPL_GETSTYLE = _WinAPI_RegisterWindowMessage("WM_SPL_GETSTYLE")
Global Const $WM_SPL_GETPARENT = _WinAPI_RegisterWindowMessage("WM_SPL_GETPARENT")
Global Const $WM_SPL_EXISTS = _WinAPI_RegisterWindowMessage("WM_SPL_EXISTS")
Global Const $WM_SPL_SHOW = _WinAPI_RegisterWindowMessage("WM_SPL_SHOW")

; Notify
Global Const $SPN_FIRST = 0x1200
Global Const $SPN_UNCOLLAPSING = ($SPN_FIRST + 10)
Global Const $SPN_POSCHANGED = ($SPN_FIRST + 11)
Global Const $SPN_ENTERSIZEMOVE = ($SPN_FIRST + 12)
Global Const $SPN_EXITSIZEMOVE = ($SPN_FIRST + 13)
Global Const $SPN_COLLAPSING = ($SPN_FIRST + 14)
Global Const $SPN_GETMINMAXINFO = ($SPN_FIRST + 15)
Global Const $SPN_LIMITPOS = ($SPN_FIRST + 16)
Global Const $SPN_CAPTURECHANGED = ($SPN_FIRST + 17)
Global Const $SPN_LBUTTONUP = ($SPN_FIRST + 18)
Global Const $SPN_LBUTTONCLK = ($SPN_FIRST + 19)
Global Const $SPN_LBUTTONDBLCLK = ($SPN_FIRST + 20)

; Style
Global Const $SPS_VERTICAL = 0x00000001
Global Const $SPS_HORIZONTAL = 0x00000002

;Parameters
Global Const $SP_NORESIZING = 0
Global Const $SP_RESIZING = 1
Global Const $SP_USEINDEX = 0
Global Const $SP_USEITEM = 1
Global Const $SP_UPDATE = 1

; Mask
Global Const $SPM_SIZE = 0x000F
Global Const $SPM_MOVE = 0x00F0
Global Const $SPM_HIDE = 0x0F00

; State
Global Const $SPST_STOP = 0x0010
Global Const $SPST_MOVE = 0x0020
Global Const $SPST_HIDE = 0x0100

Global Const $tagSPLITITEMINFO = $tagRECT & ";hwnd spItem;int distance;int minsize;bool resizing;int state;int Param"
Global Const $tagSPLITPOS = $tagNMHDR & ";" & _
        "int spPosition;" & _ ; the position of the element in the splitter $SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM
        "int    spIndex;" & _ ; the index of the element in the splitter
        "hwnd    spItem;" & _ ; ID or Handle of the element in the splitter
        "ptr      pntpos" ; a pointer to the WINDOWPOS structure

Global Const $tagSPLMINMAXINFO = $tagNMHDR & ";" & _
        "int  MinPositionLeft;" & _ ; minimum margin on the left
        "int   MinPositionTop;" & _ ; minimum margin at the top
        "int MinPositionRight;" & _ ; minimum margin on the right
        "int MinPositionBottom" ; minimum bottom margin

Global Enum $SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM, $SPL_PARENT, $SPL_LOCK, $SPL_LDOWN, $SPL_SIZE, $SPL_STYLE, $SPL_STOP, $SPL_SHOW, $SPL_PARAM, $SPL_MAX
Global Const $DefMinSize = 5

#EndRegion Constants

#Region User functions
; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_Create
; Description ...: Creates a new splitter
; Syntax ........: _CtrlSplit_Create($iX, $iY, $iLength [, $iStyle = -1 [, $iExStyle = -1]])
; Parameters ....: $iX                  - Position X.
;                  $iY                  - Position Y.
;                  $iLength             - Splitter length.
;                  $iStyle              - [optional] Splitter Style. Default is -1 [$SS_NOTIFY, $SS_LEFT]
;                  $iExStyle            - [optional] Extended Splitter style. Default is -1 [$SS_BLACKFRAME, $WS_EX_TOPMOST], forced $WS_EX_CONTROLPARENT.
; Return values .: ID of the new splitter
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_Create($iX, $iY, $iLength, $iStyle = 0, $iExStyle = -1)
    If $iExStyle == -1 Then $iExStyle = BitOR($SS_BLACKFRAME, $WS_EX_TOPMOST)
    Local $iDPI = _WinAPI_GetDpiForPrimaryMonitor()
    Local $fscale = $iDPI / 96
    Local $iSplit
    Select
        Case BitAND($iStyle, $SPS_HORIZONTAL)
            $iSplit = GUICtrlCreateLabel("", $iX, $iY, $iLength, Round($DefMinSize * $fscale), -1, BitOR($iExStyle, $WS_EX_CONTROLPARENT))
            GUICtrlSetCursor(-1, 11)
        Case BitAND($iStyle, $SPS_VERTICAL)
            $iSplit = GUICtrlCreateLabel("", $iX, $iY, Round($DefMinSize * $fscale), $iLength, -1, BitOR($iExStyle, $WS_EX_CONTROLPARENT))
            GUICtrlSetCursor(-1, 13)
        Case Else
            Return SetError(1, 0, 0)
    EndSelect
    GUICtrlSetState($iSplit, BitOR($GUI_ONTOP, $GUI_SHOW))
    __ctrlEnable($iSplit)
    _SendMessage(GUICtrlGetHandle(-1), $WM_SPL_CREATE, $DefMinSize, $iStyle)
    _SendMessage(GUICtrlGetHandle(-1), $WM_SPL_SETLOCKSPLITTING, 1)
    Return $iSplit
EndFunc   ;==>_CtrlSplit_Create

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_AddItem
; Description ...: Adds a new element to the splitter
; Syntax ........: _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $iCtrlIDSplitting [, $resizing = 1])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iCtrlIDSplitting    - Added element for splitting.
;                  $resizing            - [optional] Specifies whether to resize the element or keep it unchanged. Default is 1 - the size is changing.
;                                         If the size does not change, then the element moves..
; Return values .: The index of the added element. If -1 is an error
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================;
Func _CtrlSplit_AddItem($iCtrlID, $SPL_POS, $iCtrlIDSplitting, $resizing = 1)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Local $iIndex = _SendMessage($hControl, $WM_SPL_ADDITEM, _WinAPI_MakeLong($SPL_POS, Int($resizing)), $iCtrlIDSplitting)
    Return $iIndex
EndFunc   ;==>_CtrlSplit_AddItem

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemDelete
; Description ...: Removes an element from the splitter
; Syntax ........: _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS [, $iIndex = -1 [, $ByItem = False]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: $iIndex = -1 deletes all elements in the specified position of $SPL_POS. 
;                  If $ByItem = True, then the value that was passed to _CtrlSplit_AddItem should be specified as $iIndex.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemDelete($iCtrlID, $SPL_POS, $iIndex = -1, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    If $iIndex == -1 And $ByItem Then Return 0
    _SendMessage($hControl, $WM_SPL_DELITEM, $SPL_POS, $iIndex)
EndFunc   ;==>_CtrlSplit_ItemDelete

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_FindItem
; Description ...: Finding an element in the splitter
; Syntax ........: _CtrlSplit_FindItem($iCtrlID, $iCtrlIDSplitting [, $SPL_POS = -1])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $iCtrlIDSplitting    - ID of the item you are looking for.
;                  $SPL_POS             - [optional] The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM]. Default is -1.
; Return values .: Element index or -1 - not found
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: If $SPL_POS = -1, then the element is searched on all sides of the splitter.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_FindItem($iCtrlID, $iCtrlIDSplitting, $SPL_POS = -1)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $SPL_POS < 0 Then
        For $SPL_POS = $SPL_LEFT To $SPL_BOTTOM
            $iIndex = _SendMessage($hControl, $WM_SPL_GETINDEX, $SPL_POS, $iCtrlIDSplitting)
            If $iIndex > -1 Then Return SetError(0, $SPL_POS, $iIndex)
        Next
        Return -1
    Else
        Return _SendMessage($hControl, $WM_SPL_GETINDEX, $SPL_POS, $iCtrlIDSplitting)
    EndIf
EndFunc   ;==>_CtrlSplit_FindItem

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetCount
; Description ...: Gets the number of elements in the splitter
; Syntax ........: _CtrlSplit_ItemGetCount($iCtrlID, $SPL_POS)
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
; Return values .: The number of elements on the specified side of the splitter $SPL_POS.
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetCount($iCtrlID, $SPL_POS)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Return _SendMessage($hControl, $WM_SPL_GETITEMCOUNT, $SPL_POS)
EndFunc   ;==>_CtrlSplit_ItemGetCount

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_GetItem
; Description ...: Retrieves the ID or descriptor of an element in the splitter by its index
; Syntax ........: _CtrlSplit_GetItem($iCtrlID, $SPL_POS, $iIndex)
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
; Return values .: Element ID or Handle
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_GetItem($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return (__iswindow(DllStructGetData($tInfo, "spItem")) ? DllStructGetData($tInfo, "spItem") : Int(DllStructGetData($tInfo, "spItem")))
EndFunc   ;==>_CtrlSplit_GetItem

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_GetItemIndex
; Description ...: Gets the index of the element in the splitter by its ID and Handle
; Syntax ........: _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iCtrlIDSplitting)
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iCtrlIDSplitting    - Element ID or Handle.
; Return values .: The index of the element in the splitter
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: In $iCtrlIDSplitting, specify exactly the value that was specified when executing _CtrlSplit_AddItem.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iCtrlIDSplitting)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Return _SendMessage($hControl, $WM_SPL_GETINDEX, $SPL_POS, $iCtrlIDSplitting)
EndFunc   ;==>_CtrlSplit_GetItemIndex

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetState
; Description ...: Gets the current state of the element
; Syntax ........: _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex [, $iMask = 0xFFFF [, $ByItem = False]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
;                  $iMask               - [optional] Mask ($SPM_SIZE, $SPST_MOVE, $SPST_HIDE). Default is 0xFFFF.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: The value of the state relative to the mask
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: If $ByItem = True, then the value that was passed to _CtrlSplit_AddItem should be specified as $iIndex.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetState($iCtrlID, $SPL_POS, $iIndex, $iMask = 0xFFFF, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return BitAND($iMask, DllStructGetData($tInfo, "state"))
EndFunc   ;==>_CtrlSplit_ItemGetState

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemSetState
; Description ...: Sets the new state of the element
; Syntax ........: _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, $iIndex, $iMask, $iVal [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
;                  $iMask               - Маска ($SPM_SIZE, $SPST_MOVE, $SPST_HIDE).
;                  $iVal                - Status Value.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Returns the value that is read back from the structure, or 0 is an error.
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: If $ByItem = True, then the value that was passed to _CtrlSplit_AddItem should be specified as $iIndex.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemSetState($iCtrlID, $SPL_POS, $iIndex, $iMask, $iVal, $ByItem = False)
    Local $hControl = (__iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID))
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return DllStructSetData($tInfo, "state", BitOR(BitAND(DllStructGetData($tInfo, "state"), BitXOR(0xFFFF, $iMask)), $iVal))
EndFunc   ;==>_CtrlSplit_ItemSetState

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetResizing
; Description ...: Gets the set value for the behavior of the element when moving the splitter
; Syntax ........: _CtrlSplit_ItemGetResizing($iCtrlID, $SPL_POS, $iIndex [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: $SP_RESIZING - the element is resized and does not move, $SP_NORESIZING - moves without resizing.
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: If $ByItem = True, then the value that was passed to _CtrlSplit_AddItem should be specified as $iIndex.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetResizing($iCtrlID, $SPL_POS, $iIndex, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return BitAND(0x000F, DllStructGetData($tInfo, "state"))
EndFunc   ;==>_CtrlSplit_ItemGetResizing

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemSetResizing
; Description ...: Changes the behavior value of an element in the splitter
; Syntax ........: _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex [, $resizing = 1 [, $ByItem = False]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
;                  $resizing            - [optional] $SP_RESIZING - the element is resized and does not move, $SP_NORESIZING - moves without resizing. Default is $SP_RESIZING.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Returns the value that is read back from the structure, or 0 is an error.
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: If $ByItem = True, then the value that was passed to _CtrlSplit_AddItem should be specified as $iIndex.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemSetResizing($iCtrlID, $SPL_POS, $iIndex, $resizing = 1, $ByItem = False)
    Local $hControl = (__iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID))
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return DllStructSetData($tInfo, "state", BitOR(BitAND(DllStructGetData($tInfo, "state"), 0xFFF0), $resizing))
EndFunc   ;==>_CtrlSplit_ItemSetResizing

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetMinimal
; Description ...: Returns the specified minimum size of the element
; Syntax ........: _CtrlSplit_ItemGetMinimal($iCtrlID, $SPL_POS, $iIndex [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Число Int
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: DPI is not taken into account
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetMinimal($iCtrlID, $SPL_POS, $iIndex, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return DllStructGetData($tInfo, "minsize")
EndFunc   ;==>_CtrlSplit_ItemGetMinimal

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemSetMinimal
; Description ...: Sets the minimum size of the element
; Syntax ........: _CtrlSplit_ItemSetMinimal($iCtrlID, $SPL_POS, $iIndex [, $min = $DefMinSize [, $ByItem = False]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
;                  $min                 - [optional] Новое значение. Default is $DefMinSize.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Returns the value that is read back from the structure, or 0 is an error.
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: There is no need to take DPI into account here
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemSetMinimal($iCtrlID, $SPL_POS, $iIndex, $min = $DefMinSize, $ByItem = False)
    Local $hControl = (__iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID))
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return DllStructSetData($tInfo, "minsize", $min)
EndFunc   ;==>_CtrlSplit_ItemSetMinimal

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemUpdate
; Description ...: Updates the data of all child elements of the splitter
; Syntax ........: _CtrlSplit_ItemUpdate($iCtrlID [, $SPL_POS = 0 [, $iIndex = 0 [, $ByItem = False]]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: The function performs the same operation that always happens before the start of the splitter movement [$WM_ENTERSIZEMOVE]
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemUpdate($iCtrlID, $SPL_POS = 0, $iIndex = 0, $ByItem = False)
    Local $hControl = (__iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID))
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $Lock = _SendMessage($hControl, $WM_SPL_GETLOCKSPLITTING)
    _SendMessage($hControl, $WM_ENTERSIZEMOVE, $SPL_POS, $iIndex)
    _CtrlSplit_Lock($iCtrlID, $Lock)
EndFunc   ;==>_CtrlSplit_ItemUpdate

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetParam
; Description ...: Returns a custom associative value for the element
; Syntax ........: _CtrlSplit_ItemGetParam($iCtrlID, $SPL_POS, $iIndex [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Значение Param
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetParam($iCtrlID, $SPL_POS, $iIndex, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    If $iIndex == -1 Then Return 0
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return DllStructGetData($tInfo, "Param")
EndFunc   ;==>_CtrlSplit_ItemGetParam

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemSetParam
; Description ...: Sets a custom associative value for the element
; Syntax ........: _CtrlSplit_ItemSetParam($iCtrlID, $SPL_POS, $iIndex, $Param [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
;                  $Param               - The value to be set.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Returns the value that is read back from the structure, or 0 is an error.
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemSetParam($iCtrlID, $SPL_POS, $iIndex, $Param, $ByItem = False)
    Local $hControl = (__iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID))
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return DllStructSetData($tInfo, "Param", $Param)
EndFunc   ;==>_CtrlSplit_ItemSetParam

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetDistance
; Description ...: Gets the set value of the element's distance from the splitter
; Syntax ........: _CtrlSplit_ItemGetDistance($iCtrlID, $SPL_POS, $iIndex [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: The Int number
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetDistance($iCtrlID, $SPL_POS, $iIndex, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    Return DllStructGetData($tInfo, "Distance")
EndFunc   ;==>_CtrlSplit_ItemGetDistance

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemSetDistance
; Description ...: Sets the value of the element's distance from the splitter
; Syntax ........: _CtrlSplit_ItemSetDistance($iCtrlID, $SPL_POS, $iIndex [, $iDistance = 5 [, $ByItem = False]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - The index or ID of the element in the splitter on the specified side is $SPL_POS.
;                  $iDistance           - [optional] New value. Default is 5.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Returns the value that is read back from the structure, or 0 is an error.
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: There is no need to take DPI into account here
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemSetDistance($iCtrlID, $SPL_POS, $iIndex, $iDistance = 5, $ByItem = False)
    Local $hControl = (__iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID))
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tInfo = DllStructCreate($tagSPLITITEMINFO, _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex))
    If @error Then Return 0
    
    Local $Item = DllStructGetData($tInfo, "spItem")
    Local $iDPI = _WinAPI_GetDpiForPrimaryMonitor()
    Local $fscale = $iDPI / 96
    
    Switch $SPL_POS
        Case $SPL_LEFT
            If __iswindow($Item) Then
                _WinAPI_SetWindowPos($Item, 0, 0, 0, _GetLeft($iCtrlID) - Round($iDistance * $fscale) - _GetLeft($Item), _WinAPI_GetClientHeight($Item), BitOR($SWP_NOMOVE, $SWP_NOACTIVATE, $SWP_NOREDRAW, $SWP_NOZORDER))
            Else
                GUICtrlSetPos($Item, Default, Default, _GetLeft($iCtrlID) - Round($iDistance * $fscale) - _GetLeft($Item))
            EndIf
        Case $SPL_RIGHT
            Local $iX = _GetRight($iCtrlID) + Round($iDistance * $fscale)
            If __iswindow($Item) Then
                _WinAPI_SetWindowPos($Item, 0, $iX, _GetTop($Item), _GetRight($Item) - $iX, _WinAPI_GetClientHeight($Item), BitOR($SWP_NOACTIVATE, $SWP_NOREDRAW, $SWP_NOZORDER))
            Else
                GUICtrlSetPos($Item, $iX, Default, _GetRight($Item) - $iX)
            EndIf
        Case $SPL_TOP
            If __iswindow($Item) Then
                _WinAPI_SetWindowPos($Item, 0, 0, 0, _WinAPI_GetClientWidth($Item), _GetTop($iCtrlID) - Round($iDistance * $fscale) - _GetTop($Item), BitOR($SWP_NOMOVE, $SWP_NOACTIVATE, $SWP_NOREDRAW, $SWP_NOZORDER))
            Else
                GUICtrlSetPos($Item, Default, Default, Default, _GetTop($iCtrlID) - Round($iDistance * $fscale) - _GetTop($Item))
            EndIf
        Case $SPL_BOTTOM
            Local $iY = _GetBottom($iCtrlID) + Round($iDistance * $fscale)
            If __iswindow($Item) Then
                _WinAPI_SetWindowPos($Item, 0, _GetLeft($Item), $iY, _WinAPI_GetClientWidth($Item), _GetBottom($Item) - $iY, BitOR($SWP_NOACTIVATE, $SWP_NOREDRAW, $SWP_NOZORDER))
            Else
                GUICtrlSetPos($Item, Default, $iY, Default, _GetBottom($Item) - $iY)
            EndIf
        Case Else 
            Return 0
    EndSwitch
    
    Return DllStructSetData($tInfo, "distance", $iDistance)
    
EndFunc   ;==>_CtrlSplit_ItemSetDistance

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_SetItemsAround
; Description ...: Updates the distance of all elements in the splitter
; Syntax ........: _CtrlSplit_SetItemsAround($iCtrlID)
; Parameters ....: $iCtrlID             - The ID of the splitter.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: Necessary when changing DPI
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_SetItemsAround($iCtrlID)
    For $SPL_POS = $SPL_LEFT To $SPL_BOTTOM
        For $iIndex = 0 To _CtrlSplit_ItemGetCount($iCtrlID, $SPL_POS) - 1
            _CtrlSplit_ItemSetDistance($iCtrlID, $SPL_POS, $iIndex, _CtrlSplit_ItemGetDistance($iCtrlID, $SPL_POS, $iIndex))
        Next
    Next
EndFunc   ;==>_CtrlSplit_SetItemsAround

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetRect
; Description ...: Gets the rectangle of the element
; Syntax ........: _CtrlSplit_ItemGetRect($iCtrlID, $SPL_POS, $iIndex [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: The $tagRECT structure
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetRect($iCtrlID, $SPL_POS, $iIndex, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Local $tRECT = DllStructCreate($tagRECT)
    DllStructSetData($tRECT, 1, $iIndex)
    _SendMessage($hControl, $WM_SPL_GETITEMRECT, $SPL_POS, DllStructGetPtr($tRECT))
    Return $tRECT
EndFunc   ;==>_CtrlSplit_ItemGetRect

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ItemGetInfo
; Description ...: Returns a pointer to the internal structure of the $tagSPLITITEMINFOT splitter
; Syntax ........: _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex [, $ByItem = False])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: Ptr
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ItemGetInfo($iCtrlID, $SPL_POS, $iIndex, $ByItem = False)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    If $ByItem Then $iIndex = _CtrlSplit_GetItemIndex($iCtrlID, $SPL_POS, $iIndex)
    Return Ptr(_SendMessage($hControl, $WM_SPL_GETINFO, $SPL_POS, $iIndex))
EndFunc   ;==>_CtrlSplit_ItemGetInfo

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_SetParam
; Description ...: Sets a custom associative value for the splitter
; Syntax ........: _CtrlSplit_SetParam($iCtrlID, $iParam)
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $iParam              - New value.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_SetParam($iCtrlID, $iParam)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    _SendMessage($hControl, $WM_SPL_SETPARAM, $iParam)
EndFunc   ;==>_CtrlSplit_SetParam

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_GetParam
; Description ...: Gets the custom associative value of the splitter
; Syntax ........: _CtrlSplit_GetParam($iCtrlID)
; Parameters ....: $iCtrlID             - The ID of the splitter.
; Return values .: The Param value
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_GetParam($iCtrlID)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Return _SendMessage($hControl, $WM_SPL_GETPARAM)
EndFunc   ;==>_CtrlSplit_GetParam

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_Show
; Description ...: Shows or hides the splitter
; Syntax ........: _CtrlSplit_Show($iCtrlID [, $iState = 1])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $iState              - [optional] 1 or 0. Default is 1.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: $iState == 1 - Shows, $iState == 0 - hides
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_Show($iCtrlID, $iState = 1)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    _SendMessage($hControl, $WM_SPL_SHOW, $iState)
EndFunc   ;==>_CtrlSplit_Show

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_SetPos
; Description ...: Moves the splitter or sets its new dimensions
; Syntax ........: _CtrlSplit_SetPos($iCtrlID [, $X = Default [, $Y = Default [, $CX = Default [, $CY = Default]]]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $X                   - [optional] pos X.
;                  $Y                   - [optional] pos Y.
;                  $CX                  - [optional] width.
;                  $CY                  - [optional] height.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: If Default, it does not change. In the vertical splitter, the width is unchanged, in the horizontal, the height is unchanged..
;                  The function simulates the movement of the splitter in the same way as if the user were moving it with the mouse.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_SetPos($iCtrlID, $X = Default, $Y = Default, $CX = Default, $CY = Default)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    _SendMessage($hControl, $WM_NCLBUTTONDOWN)
    _SendMessage($hControl, $WM_ENTERSIZEMOVE)
    GUICtrlSetPos($iCtrlID, $X, $Y, $CX, $CY)
    _SendMessage($hControl, $WM_CHILDACTIVATE)
    _SendMessage($hControl, $WM_EXITSIZEMOVE)
    _WinAPI_InvalidateRect(_CtrlSplit_GetParent($iCtrlID))
EndFunc   ;==>_CtrlSplit_SetPos

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_Lock
; Description ...: Allows or prohibits the splitter from resizing or moving its child elements
; Syntax ........: _CtrlSplit_Lock($iCtrlID [, $fEnabled = True])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $fEnabled            - [optional] True - disables work, False - allows it. Default is True.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......: 
; Remarks .......: When the user grabs the splitter with the mouse, the splitter unlocks and performs its functions, otherwise the splitter is Locked.
;                  The function forcibly changes this state. For example, when a splitter is a child of another splitter and moves,
;                  it is necessary that this movable splitter moves its children in the same way.
; Related .......: 
; Link ..........: 
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_Lock($iCtrlID, $fEnabled = True)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    _SendMessage($hControl, $WM_SPL_SETLOCKSPLITTING, $fEnabled)
EndFunc   ;==>_CtrlSplit_Lock

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_IsSpl
; Description ...: Checks whether the control is a splitter
; Syntax ........: _CtrlSplit_IsSpl($iCtrlIDSplitting)
; Parameters ....: $iCtrlIDSplitting    - The ID of the splitter.
; Return values .: Bool
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_IsSpl($iCtrlIDSplitting)
    Local $hControl = __iswindow($iCtrlIDSplitting) ? $iCtrlIDSplitting : GUICtrlGetHandle($iCtrlIDSplitting)
    Return _SendMessage($hControl, $WM_SPL_EXISTS)
EndFunc   ;==>_CtrlSplit_IsSpl

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_SetPosLimit
; Description ...: Severely restricts the movement of the splitter in the specified coordinates
; Syntax ........: _CtrlSplit_SetPosLimit($iCtrlID, $iParam)
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $iParam              - The lowest word is the X coordinate, the highest word is the Y coordinate.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: It is used only during the movement of the splitter. At the end of the movement of the splitter, this parameter is no longer valid..
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_SetPosLimit($iCtrlID, $iParam)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Local $iX = _WinAPI_LoWord($iParam), $iY = _WinAPI_HiWord($iParam)
    _SendMessage($hControl, $WM_SPL_STOPSPLIT, $iParam)
    ;GUICtrlSetPos($iCtrlID, $iX ? $iX : Default, $iY ? $iY : Default)
EndFunc   ;==>_CtrlSplit_SetPosLimit

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_ShowItem
; Description ...: Hides or displays the splitter element
; Syntax ........: _CtrlSplit_ShowItem($iCtrlID, $SPL_POS [, $iIndex = -1 [, $bState = True [, $ByItem = False]]])
; Parameters ....: $iCtrlID             - The ID of the splitter.
;                  $SPL_POS             - The position of the added element relative to the splitter [$SPL_LEFT, $SPL_RIGHT, $SPL_TOP, $SPL_BOTTOM].
;                  $iIndex              - [optional] The index or ID of the element in the splitter on the specified side is $SPL_POS. Default is -1.
;                  $bState              - [optional] True - Show it, False - hide it. Default is True.
;                  $ByItem              - [optional] If True, then $iIndex is an identifier or descriptor. Default is False.
; Return values .: None
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: If $iIndex = -1, the function is applied to all elements of the splitter on the specified side of $SPL_POS.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_ShowItem($iCtrlID, $SPL_POS, $iIndex = -1, $bState = True, $ByItem = False)
    If $iIndex == -1 Then
        Local $iCount = _CtrlSplit_ItemGetCount($iCtrlID, $SPL_POS)
        For $iIndex = 0 To $iCount - 1
            __controlshow(_CtrlSplit_GetItem($iCtrlID, $SPL_POS, $iIndex), $bState ? $GUI_SHOW : $GUI_HIDE)
        Next
    Else
        __controlshow(_CtrlSplit_GetItem($iCtrlID, $SPL_POS, $iIndex), $bState ? $GUI_SHOW : $GUI_HIDE)
    EndIf
EndFunc   ;==>_CtrlSplit_ShowItem

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_GetThickness
; Description ...: Returns the current thickness of the splitter line
; Syntax ........: _CtrlSplit_GetThickness($iCtrlID)
; Parameters ....: $iCtrlID             - The ID of the splitter.
; Return values .: The Int number
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......: The thickness of the splitter is Width or Height, depending on the style of $SPS_VERTICAL or $SPS_HORIZONTAL, respectively.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_GetThickness($iCtrlID)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Return _SendMessage($hControl, $WM_SPL_GETSIZE)
EndFunc   ;==>_CtrlSplit_GetThickness

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_GetStyle
; Description ...: Returns the current splitter style
; Syntax ........: _CtrlSplit_GetStyle($iCtrlID)
; Parameters ....: $iCtrlID             - The ID of the splitter.
; Return values .: Number
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_GetStyle($iCtrlID)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Return _SendMessage($hControl, $WM_SPL_GETSTYLE)
EndFunc   ;==>_CtrlSplit_GetStyle

; #FUNCTION# ====================================================================================================================
; Name ..........: _CtrlSplit_GetParent
; Description ...: Returns the parent window of the splitter
; Syntax ........: _CtrlSplit_GetParent($iCtrlID)
; Parameters ....: $iCtrlID             - The ID of the splitter.
; Return values .: hWnd
; Author ........: Stanislav Ka
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _CtrlSplit_GetParent($iCtrlID)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    Return _SendMessage($hControl, $WM_SPL_GETPARENT)
EndFunc   ;==>_CtrlSplit_GetParent

#EndRegion User functions

#Region Internal functions

Func __ctrlSplitProc($hWnd, $iMsg, $wParam, $lParam, $CtrlID, $pData)
    Local Static $aData[100][$SPL_MAX]
    Local Static $iDPI = _WinAPI_GetDpiForPrimaryMonitor()
    Local Static $fscale = $iDPI / 96
    Local Static $fscale2 = 96 / _WinAPI_GetDpiForSystem()
    
    If (UBound($aData) < $CtrlID + 1) Then
        ReDim $aData[$CtrlID + 1][$SPL_MAX]
    EndIf
    
    Switch $iMsg
        Case $WM_SPL_SHOW
            If Not $aData[$CtrlID][$SPL_LOCK] Then
                $aData[$CtrlID][$SPL_SHOW] = ($wParam ? @SW_SHOW : @SW_HIDE)
            Else
                _WinAPI_ShowWindow($hWnd, ($wParam ? @SW_SHOW : @SW_HIDE))
            EndIf
            Return 0
        Case $WM_DPICHANGED_BEFOREPARENT
            $iDPI = _WinAPI_GetDpiForWindow($hWnd)
            $fscale = $iDPI / 96
            $fscale2 = 96 / _WinAPI_GetDpiForSystem()
            
            Local $state, $iX, $iY
            For $SPL_POS = $SPL_LEFT To $SPL_BOTTOM
                For $iIndex = 0 To UBound($aData[$CtrlID][$SPL_POS]) - 1
                    $state = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state")
                    If BitAND($SPM_MOVE, $state) == $SPST_MOVE Or BitAND($SPM_SIZE, $state) Then
                        $iX = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX")
                        $iY = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY")
                        DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX", $iX * $fscale * $fscale2)
                        DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY", $iY * $fscale * $fscale2)
                    EndIf
                Next
            Next
            
            Return 0
        Case $WM_DPICHANGED_AFTERPARENT
            _SendMessage($hWnd, $WM_ENTERSIZEMOVE)
            Select
                Case BitAND(_CtrlSplit_GetStyle($hWnd), $SPS_VERTICAL)
                    GUICtrlSetPos($CtrlID, _GetLeft($hWnd))
                Case BitAND(_CtrlSplit_GetStyle($hWnd), $SPS_HORIZONTAL)
                    GUICtrlSetPos($CtrlID, Default, _GetTop($hWnd))
            EndSelect
            _SendMessage($hWnd, $WM_EXITSIZEMOVE)
            _CtrlSplit_SetItemsAround($CtrlID)
        Case $WM_SPL_EXISTS
            Return 1
        Case $WM_SPL_SETPARAM
            $aData[$CtrlID][$SPL_PARAM] = $wParam
            Return 0
        Case $WM_SPL_GETPARAM
            Return $aData[$CtrlID][$SPL_PARAM]
        Case $WM_SPL_GETSIZE
            Return $aData[$CtrlID][$SPL_SIZE]
        Case $WM_SPL_GETSTYLE
            Return $aData[$CtrlID][$SPL_STYLE]
        Case $WM_SPL_GETPARENT
            Return $aData[$CtrlID][$SPL_PARENT]
        Case $WM_SPL_CREATE
            $aData[$CtrlID][$SPL_SIZE] = $wParam
            $aData[$CtrlID][$SPL_STYLE] = $lParam
            $aData[$CtrlID][$SPL_SHOW] = -1
        Case $WM_SPL_GETITEMCOUNT
            Local $SPL_POS = Int($wParam)
            If UBound($aData) < $CtrlID - 1 Then Return -1
            If UBound($aData, 0) < $SPL_POS - 1 Then Return -1
            Return UBound($aData[$CtrlID][$SPL_POS])
        Case $WM_SPL_GETINDEX
            If Not $lParam Then Return -1
            If UBound($aData) < $CtrlID - 1 Then Return -1
            Local $SPL_POS = _WinAPI_LoWord($wParam)
            If UBound($aData, 0) < $SPL_POS - 1 Then Return -1
            If Not IsArray($aData[$CtrlID][$SPL_POS]) Then Return -1
            
            For $iIndex = 0 To UBound($aData[$CtrlID][$SPL_POS]) - 1
                If Not IsDllStruct(($aData[$CtrlID][$SPL_POS])[$iIndex]) Then ContinueLoop
                If Int(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem")) == Int($lParam) Then
                    Return $iIndex
                EndIf
            Next
            
            Return -1
        Case $WM_SPL_GETITEMRECT
            Local $tRECT = DllStructCreate($tagRECT, $lParam)
            Local $SPL_POS = Int($wParam), $iIndex = DllStructGetData($tRECT, 1)
            If UBound($aData) < $CtrlID - 1 Then Return -1
            If UBound($aData, 0) < $SPL_POS - 1 Then Return -1
            If $iIndex < 0 Or $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then Return 0
            Local $tRC = DllStructCreate($tagRECT, DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex], 1))
            If _WinAPI_RectIsEmpty($tRC) Then _SendMessage($hWnd, $WM_ENTERSIZEMOVE)
            For $i = 1 To 4
                DllStructSetData($tRECT, $i, DllStructGetData($tRC, $i))
            Next
            Return 0
        Case $WM_SPL_GETINFO
            Local $SPL_POS = Int($wParam), $iIndex = Int($lParam)
            If UBound($aData) < $CtrlID - 1 Then Return 0
            If UBound($aData, 0) < $SPL_POS - 1 Then Return 0
            If $iIndex < 0 Or $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then Return 0
            If Not IsDllStruct(($aData[$CtrlID][$SPL_POS])[$iIndex]) Then Return 0
            Return DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex])
        Case $WM_SPL_ADDITEM
            If Not $lParam Then Return -1
            Local $SPL_POS = _WinAPI_LoWord($wParam)
            If UBound($aData, 0) < $SPL_POS - 1 Then Return -1
            
            For $iIndex = 0 To UBound($aData[$CtrlID][$SPL_POS]) - 1
                If Int(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem")) == Int($lParam) Then
                    Return $iIndex
                EndIf
            Next
            
            If Not IsArray($aData[$CtrlID][$SPL_POS]) Then
                Local $Array[0]
                $aData[$CtrlID][$SPL_POS] = $Array
            EndIf
            
            $aData[$CtrlID][$SPL_PARENT] = _WinAPI_GetParent(__iswindow($lParam) ? $lParam : GUICtrlGetHandle($lParam))
            
            Local $iIndex = _ArrayAdd($aData[$CtrlID][$SPL_POS], DllStructCreate($tagSPLITITEMINFO & ";int PosX;int PosY"))
            DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem", $lParam)
            DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitAND(0x000F, _WinAPI_HiWord($wParam)))
            DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "minsize", $DefMinSize)
            
            Local $tClient = _WinAPI_GetWindowRect($hWnd)
            __rectScreenToClient($aData[$CtrlID][$SPL_PARENT], $tClient)
            Local $tRECT = DllStructCreate($tagRECT, DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex], 1))
            _WinAPI_GetWindowRectEx($lParam, $tRECT)
            
            Switch $SPL_POS
                Case $SPL_LEFT
                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance", Round((DllStructGetData($tClient, 1) - DllStructGetData($tRECT, 3)) / $fscale))
                Case $SPL_RIGHT
                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance", Round((DllStructGetData($tRECT, 1) - DllStructGetData($tClient, 3)) / $fscale))
                Case $SPL_TOP
                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance", Round((DllStructGetData($tClient, 2) - DllStructGetData($tRECT, 4)) / $fscale))
                Case $SPL_BOTTOM
                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance", Round((DllStructGetData($tRECT, 2) - DllStructGetData($tClient, 4)) / $fscale))
            EndSwitch
            
            Return $iIndex
        Case $WM_SPL_DELITEM
            Local $SPL_POS = Int($wParam), $iIndex = Int($lParam)
            If UBound($aData) < $CtrlID - 1 Then Return 0
            If UBound($aData, 0) < $SPL_POS - 1 Then Return 0
            If Not IsArray($aData[$CtrlID][$SPL_POS]) Then Return 0
            If $iIndex == -1 Then
                $aData[$CtrlID][$SPL_POS] = 0
            Else
                _ArrayDelete($aData[$CtrlID][$SPL_POS], $iIndex)
            EndIf
            Return 1
        Case $WM_SPL_GETLOCKSPLITTING
            If UBound($aData) < $CtrlID - 1 Then Return 0
            Return $aData[$CtrlID][$SPL_LOCK]
        Case $WM_SPL_SETLOCKSPLITTING
            If UBound($aData) < $CtrlID - 1 Then Return 0
            $aData[$CtrlID][$SPL_LOCK] = $wParam
            Return 0
        Case $WM_SPL_STOPSPLIT
            $aData[$CtrlID][$SPL_STOP] = $wParam
        Case $WM_WINDOWPOSCHANGING
            If $aData[$CtrlID][$SPL_LOCK] Then Return __WinAPI_DefSubclassProcEx($hWnd, $iMsg, $wParam, $lParam)
            Local $hParent = $aData[$CtrlID][$SPL_PARENT]
            Local $tPOS = DllStructCreate($tagWINDOWPOS, $lParam)
            
            ; setting the extreme positions of the splitter
            Local $tMINMAXINFO = DllStructCreate($tagSPLMINMAXINFO)
            DllStructSetData($tMINMAXINFO, "hWndFrom", $hWnd)
            DllStructSetData($tMINMAXINFO, "IDFrom", $CtrlID)
            DllStructSetData($tMINMAXINFO, "Code", $SPN_GETMINMAXINFO)
            _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tMINMAXINFO))
            For $i = 4 To 7
                If Not DllStructGetData($tMINMAXINFO, $i) Then DllStructSetData($tMINMAXINFO, $i, ($i < 6 ? Round(1 * $fscale) : Round(16 * $fscale)))
            Next
            
            Local $tClient = _WinAPI_GetWindowRect($hWnd)
            __rectScreenToClient($hParent, $tClient)
            Local $tInfo = DllStructCreate($tagSPLITPOS)
            DllStructSetData($tInfo, "hWndFrom", $hWnd)
            DllStructSetData($tInfo, "IDFrom", $CtrlID)
            DllStructSetData($tInfo, "pntpos", $lParam)
            Local $iX = DllStructGetData($tPOS, 'X') ; saving the current value
            Local $iY = DllStructGetData($tPOS, 'Y') ; saving the current value
            Local $tRECT, $distance, $min, $state
            Local $tPARENTRECT = _WinAPI_GetClientRect($hParent)
            Select
                Case BitAND($aData[$CtrlID][$SPL_STYLE], $SPS_VERTICAL) ; Vertical
                    DllStructSetData($tPOS, 'CX', Round($aData[$CtrlID][$SPL_SIZE] * $fscale))
                    DllStructSetData($tPOS, 'Y', DllStructGetData($tClient, 2))
                    
                    For $SPL_POS = $SPL_LEFT To $SPL_RIGHT
                        
                        ; restoring minimized splitter elements
                        For $iIndex = UBound($aData[$CtrlID][$SPL_POS]) - 1 To 0 Step -1
                            If $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then ExitLoop
                            $state = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state")
                            
                            If Not BitAND($SPM_MOVE, $state) Then ContinueLoop
                            Switch $SPL_POS
                                Case $SPL_LEFT
                                    If Not ($iX > DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX")) Then ContinueLoop
                                    DllStructSetData($tPOS, 'X', DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX")) ; setting the braking value
                                Case $SPL_RIGHT
                                    If Not ($iX < DllStructGetData($tPARENTRECT, 3) - DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX")) Then ContinueLoop
                                    DllStructSetData($tPOS, 'X', DllStructGetData($tPARENTRECT, 3) - DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX")) ; setting the braking value
                            EndSwitch
                            
                            If (BitAND($SPM_MOVE, $state) == $SPST_MOVE) Then _SendMessage($hWnd, $WM_WINDOWPOSCHANGED, $wParam, $lParam)
                            
                            DllStructSetData($tInfo, "spItem", DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem"))
                            DllStructSetData($tInfo, "spPosition", $SPL_POS)
                            DllStructSetData($tInfo, "spIndex", $iIndex)
                            DllStructSetData($tInfo, "Code", $SPN_UNCOLLAPSING)
                            If _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                            DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"), BitXOR(0xFFFF, $SPM_MOVE)), 0))
                            DllStructSetData($tPOS, 'X', $iX)
                        Next
                        
                        ; minimizing the elements of the splitter
                        For $iIndex = 0 To UBound($aData[$CtrlID][$SPL_POS]) - 1
                            If $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then ExitLoop
                            $state = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state")
                            If BitAND($SPM_MOVE, $state) == $SPST_MOVE Or Not BitAND($SPM_SIZE, $state) Then ContinueLoop ; if the element is minimized and moves, or the element does not resize.
                            DllStructSetData($tInfo, "spItem", DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem"))
                            DllStructSetData($tInfo, "spPosition", $SPL_POS)
                            DllStructSetData($tInfo, "spIndex", $iIndex)
                            DllStructSetData($tInfo, "Code", $SPN_COLLAPSING)
                            $tRECT = DllStructCreate($tagRECT, DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex], 1))
                            If _WinAPI_RectIsEmpty($tRECT) Then _SendMessage($hWnd, $WM_ENTERSIZEMOVE)
                            $distance = Round(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance") * $fscale)
                            $min = Round(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "minsize") * $fscale)
                            Switch $SPL_POS
                                Case $SPL_LEFT
                                    If Not ($iX < DllStructGetData($tRECT, 1) + $distance + $min) Then ContinueLoop
                                    DllStructSetData($tPOS, 'X', DllStructGetData($tRECT, 1) + $distance + $min) ; setting the braking value
                                    ; we bring the splitter to a breakpoint, all its child elements will also take up a position relative to the splitter.
                                    If Not BitAND($SPM_MOVE, $state) Then GUICtrlSetPos($CtrlID, DllStructGetData($tPOS, "X"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND($state, BitXOR(0xFFFF, $SPM_MOVE)), $SPST_STOP))
                                    If Not _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX", DllStructGetData($tPOS, "X"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"), BitXOR(0xFFFF, $SPM_MOVE)), $SPST_MOVE))
                                    
                                Case $SPL_RIGHT
                                    If Not ($iX + DllStructGetData($tPOS, 'CX') > DllStructGetData($tRECT, 3) - $distance - $min) Then ContinueLoop
                                    DllStructSetData($tPOS, 'X', DllStructGetData($tRECT, 3) - $distance - $min - DllStructGetData($tPOS, 'CX')) ; setting the braking value
                                    ; we bring the splitter to a breakpoint, all its child elements will also take up a position relative to the splitter.
                                    If Not BitAND($SPM_MOVE, $state) Then GUICtrlSetPos($CtrlID, DllStructGetData($tPOS, "X"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND($state, BitXOR(0xFFFF, $SPM_MOVE)), $SPST_STOP))
                                    If Not _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosX", DllStructGetData($tPARENTRECT, 3) - DllStructGetData($tPOS, "X"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"), BitXOR(0xFFFF, $SPM_MOVE)), $SPST_MOVE))
                                    
                            EndSwitch
                            DllStructSetData($tPOS, 'X', $iX) ; when returning [1] from $SPN_COLLAPSING, we restore the value and continue moving
                        Next
                    Next
                    
                    ; limiting the extreme position of the splitter
                    If $aData[$CtrlID][$SPL_LDOWN] Then
                        Local $tNMHDR = DllStructCreate($tagNMHDR, DllStructGetPtr($tInfo))
                        DllStructSetData($tNMHDR, "Code", $SPN_LIMITPOS)
                        Select
                            Case _WinAPI_HiWord($aData[$CtrlID][$SPL_STOP]) And DllStructGetData($tPOS, 'X') < _WinAPI_LoWord($aData[$CtrlID][$SPL_STOP])
                                DllStructSetData($tPOS, 'X', _WinAPI_LoWord($aData[$CtrlID][$SPL_STOP]))
                            Case DllStructGetData($tPOS, 'X') <= DllStructGetData($tMINMAXINFO, "MinPositionLeft") ; limiting the left position of the splitter
                                If Not _SendMessage($hParent, $WM_NOTIFY, $SPL_LEFT, DllStructGetPtr($tNMHDR)) Then
                                    DllStructSetData($tPOS, 'X', DllStructGetData($tMINMAXINFO, "MinPositionLeft"))
                                    ;_WinAPI_Mouse_Event($MOUSEEVENTF_LEFTUP)
                                EndIf
                            Case (DllStructGetData($tPOS, 'X') + DllStructGetData($tPOS, 'CX') >= DllStructGetData($tPARENTRECT, 3) - DllStructGetData($tMINMAXINFO, "MinPositionRight")) ; limiting the right position of the splitter
                                If Not _SendMessage($hParent, $WM_NOTIFY, $SPL_RIGHT, DllStructGetPtr($tNMHDR)) Then
                                    DllStructSetData($tPOS, 'X', DllStructGetData($tPARENTRECT, 3) - DllStructGetData($tMINMAXINFO, "MinPositionRight") - DllStructGetData($tPOS, 'CX'))
                                    ;_WinAPI_Mouse_Event($MOUSEEVENTF_LEFTUP)
                                EndIf
                        EndSelect
                    EndIf
                    
                Case BitAND($aData[$CtrlID][$SPL_STYLE], $SPS_HORIZONTAL) ; Horizontal
                    DllStructSetData($tPOS, 'CY', Round($aData[$CtrlID][$SPL_SIZE] * $fscale))
                    DllStructSetData($tPOS, 'X', DllStructGetData($tClient, 1))
                    
                    For $SPL_POS = $SPL_TOP To $SPL_BOTTOM
                        
                        ; restoring minimized splitter elements
                        For $iIndex = UBound($aData[$CtrlID][$SPL_POS]) - 1 To 0 Step -1
                            If $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then ExitLoop
                            $state = BitAND($SPM_MOVE, DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"))
                            If Not $state Then ContinueLoop
                            DllStructSetData($tInfo, "spItem", DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem"))
                            DllStructSetData($tInfo, "spPosition", $SPL_POS)
                            DllStructSetData($tInfo, "spIndex", $iIndex)
                            DllStructSetData($tInfo, "Code", $SPN_UNCOLLAPSING)
                            
                            Switch $SPL_POS
                                Case $SPL_TOP
                                    If Not ($iY > DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY")) Then ContinueLoop
                                    DllStructSetData($tPOS, 'Y', DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY"))
                                Case $SPL_BOTTOM
                                    If Not ($iY < DllStructGetData($tPARENTRECT, 4) - DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY")) Then ContinueLoop
                                    DllStructSetData($tPOS, 'Y', DllStructGetData($tPARENTRECT, 4) - DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY")) ; setting the braking value
                            EndSwitch
                            
                            If (BitAND($SPM_MOVE, $state) == $SPST_MOVE) Then _SendMessage($hWnd, $WM_WINDOWPOSCHANGED, $wParam, $lParam)
                            
                            If _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                            DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"), BitXOR(0xFFFF, $SPM_MOVE)), 0))
                            DllStructSetData($tPOS, 'Y', $iY)
                        Next
                        
                        ; minimizing the elements of the splitter
                        For $iIndex = 0 To UBound($aData[$CtrlID][$SPL_POS]) - 1
                            If $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then ExitLoop
                            $state = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state")
                            If BitAND($SPM_MOVE, $state) == $SPST_MOVE Or Not BitAND($SPM_SIZE, $state) Then ContinueLoop ; if the element is minimized and moves, or the element does not resize.
                            DllStructSetData($tInfo, "spPosition", $SPL_POS)
                            DllStructSetData($tInfo, "spIndex", $iIndex)
                            DllStructSetData($tInfo, "spItem", DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem"))
                            DllStructSetData($tInfo, "Code", $SPN_COLLAPSING)
                            
                            $tRECT = DllStructCreate($tagRECT, DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex], 1))
                            If _WinAPI_RectIsEmpty($tRECT) Then _SendMessage($hWnd, $WM_ENTERSIZEMOVE)
                            $distance = Round(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance") * $fscale)
                            $min = Round(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "minsize") * $fscale)
                            Switch $SPL_POS
                                Case $SPL_TOP
                                    If Not ($iY < DllStructGetData($tRECT, 2) + $distance + $min) Then ContinueLoop
                                    DllStructSetData($tPOS, 'Y', DllStructGetData($tRECT, 2) + $distance + $min) ; setting the braking value
                                    ; we bring the splitter to a breakpoint, all its child elements will also take up a position relative to the splitter.
                                    If Not BitAND($SPM_MOVE, $state) Then GUICtrlSetPos($CtrlID, Default, DllStructGetData($tPOS, "Y"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY", DllStructGetData($tPOS, "Y"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND($state, BitXOR(0xFFFF, $SPM_MOVE)), $SPST_STOP))
                                    If Not _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"), BitXOR(0xFFFF, $SPM_MOVE)), $SPST_MOVE))
                                    
                                Case $SPL_BOTTOM
                                    If Not ($iY + DllStructGetData($tPOS, 'CY') > DllStructGetData($tRECT, 4) - $distance - $min) Then ContinueLoop
                                    DllStructSetData($tPOS, 'Y', DllStructGetData($tRECT, 4) - $distance - $min - DllStructGetData($tPOS, 'CY')) ; setting the braking value
                                    ; we bring the splitter to a breakpoint, all its child elements will also take up a position relative to the splitter.
                                    If Not BitAND($SPM_MOVE, $state) Then GUICtrlSetPos($CtrlID, Default, DllStructGetData($tPOS, "Y"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND($state, BitXOR(0xFFFF, $SPM_MOVE)), $SPST_STOP))
                                    If Not _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "PosY", DllStructGetData($tPARENTRECT, 4) - DllStructGetData($tPOS, "Y"))
                                    DllStructSetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state", BitOR(BitAND(DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"), BitXOR(0xFFFF, $SPM_MOVE)), $SPST_MOVE))
                                    
                            EndSwitch
                            DllStructSetData($tPOS, 'Y', $iY) ; when returning [1] from $SPN_COLLAPSING, we restore the value and continue moving
                        Next
                        
                    Next
                    
                    ; limiting the extreme position of the splitter
                    If $aData[$CtrlID][$SPL_LDOWN] Then
                        Local $tNMHDR = DllStructCreate($tagNMHDR, DllStructGetPtr($tInfo))
                        DllStructSetData($tNMHDR, "Code", $SPN_LIMITPOS)
                        Select
                            Case _WinAPI_HiWord($aData[$CtrlID][$SPL_STOP]) And DllStructGetData($tPOS, 'Y') < _WinAPI_HiWord($aData[$CtrlID][$SPL_STOP])
                                DllStructSetData($tPOS, 'Y', _WinAPI_HiWord($aData[$CtrlID][$SPL_STOP]))
                            Case DllStructGetData($tPOS, 'Y') <= DllStructGetData($tMINMAXINFO, "MinPositionTop") ; limiting the upper position of the splitter
                                If Not _SendMessage($hParent, $WM_NOTIFY, $SPL_TOP, DllStructGetPtr($tNMHDR)) Then
                                    DllStructSetData($tPOS, 'Y', DllStructGetData($tMINMAXINFO, "MinPositionTop"))
                                    ;_WinAPI_Mouse_Event($MOUSEEVENTF_LEFTUP)
                                EndIf
                            Case (DllStructGetData($tPOS, 'Y') + DllStructGetData($tPOS, 'CY') >= DllStructGetData($tPARENTRECT, 4) - DllStructGetData($tMINMAXINFO, "MinPositionBottom")) ; limiting the bottom position of the splitter
                                If Not _SendMessage($hParent, $WM_NOTIFY, $SPL_BOTTOM, DllStructGetPtr($tNMHDR)) Then
                                    DllStructSetData($tPOS, 'Y', DllStructGetData($tPARENTRECT, 4) - DllStructGetData($tMINMAXINFO, "MinPositionBottom") - DllStructGetData($tPOS, 'CY'))
                                    ;_WinAPI_Mouse_Event($MOUSEEVENTF_LEFTUP)
                                EndIf
                        EndSelect
                    EndIf
                    
            EndSelect
        Case $WM_WINDOWPOSCHANGED
            If $aData[$CtrlID][$SPL_LOCK] Then Return __WinAPI_DefSubclassProcEx($hWnd, $iMsg, $wParam, $lParam)
            Local $hParent = $aData[$CtrlID][$SPL_PARENT]
            Local $tPOS = DllStructCreate($tagWINDOWPOS, $lParam)
            Local $tInfo = DllStructCreate($tagSPLITPOS)
            DllStructSetData($tInfo, "hWndFrom", $hWnd)
            DllStructSetData($tInfo, "IDFrom", $CtrlID)
            DllStructSetData($tInfo, "pntpos", $lParam)
            Local $tRECT, $iCtrlIDSplitting, $dock, $distance
            Select
                Case BitAND($aData[$CtrlID][$SPL_STYLE], $SPS_VERTICAL) ; Vertical
                    For $SPL_POS = $SPL_LEFT To $SPL_RIGHT
                        For $iIndex = 0 To UBound($aData[$CtrlID][$SPL_POS]) - 1
                            If $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then ExitLoop
                            $iCtrlIDSplitting = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem")
                            If Not $iCtrlIDSplitting Then ContinueLoop
                            DllStructSetData($tInfo, "Code", $SPN_POSCHANGED)
                            DllStructSetData($tInfo, "spPosition", $SPL_POS)
                            DllStructSetData($tInfo, "spIndex", $iIndex)
                            DllStructSetData($tInfo, "spItem", $iCtrlIDSplitting)
                            If _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                            
                            $dock = Not BitAND($SPM_SIZE, DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"))
                            $tRECT = DllStructCreate($tagRECT, DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex], 1))
                            $distance = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance")
                            __SetPos($iCtrlIDSplitting, $SPL_POS, $tPOS, $tRECT, Round($distance * $fscale), $dock)
                        Next
                    Next
                Case BitAND($aData[$CtrlID][$SPL_STYLE], $SPS_HORIZONTAL) ; Horizontal
                    For $SPL_POS = $SPL_TOP To $SPL_BOTTOM
                        For $iIndex = 0 To UBound($aData[$CtrlID][$SPL_POS]) - 1
                            If $iIndex > UBound($aData[$CtrlID][$SPL_POS]) - 1 Then ExitLoop
                            $iCtrlIDSplitting = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem")
                            If Not $iCtrlIDSplitting Then ContinueLoop
                            DllStructSetData($tInfo, "Code", $SPN_POSCHANGED)
                            DllStructSetData($tInfo, "spPosition", $SPL_POS)
                            DllStructSetData($tInfo, "spIndex", $iIndex)
                            DllStructSetData($tInfo, "spItem", $iCtrlIDSplitting)
                            If _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tInfo)) Then ContinueLoop
                            
                            $dock = Not BitAND($SPM_SIZE, DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "state"))
                            $distance = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "distance")
                            $tRECT = DllStructCreate($tagRECT, DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex], 1))
                            __SetPos($iCtrlIDSplitting, $SPL_POS, $tPOS, $tRECT, Round($distance * $fscale), $dock)
                        Next
                    Next
            EndSelect
        Case $WM_ENTERSIZEMOVE
            $aData[$CtrlID][$SPL_LOCK] = 0
            Local $hParent = $aData[$CtrlID][$SPL_PARENT]
            Local $tClient = _WinAPI_GetWindowRect($hWnd)
            __rectScreenToClient($hParent, $tClient)
            Local $iFrom = ($wParam ? $wParam : 0)
            Local $iTo = ($wParam ? $wParam : 4)
            Local $iIndexFrom = ($lParam ? $lParam : 0)
            Local $tRECT
            Local $iCtrlIDSplitting
            For $SPL_POS = $iFrom To $iTo
                If Not UBound($aData[$CtrlID][$SPL_POS]) Then ContinueLoop
                For $iIndex = $iIndexFrom To ($lParam ? $lParam : UBound($aData[$CtrlID][$SPL_POS]) - 1)
                    If Not IsDllStruct(($aData[$CtrlID][$SPL_POS])[$iIndex]) Then ContinueLoop
                    $iCtrlIDSplitting = DllStructGetData(($aData[$CtrlID][$SPL_POS])[$iIndex], "spItem")
                    If Not $iCtrlIDSplitting Then ContinueLoop
                    $tRECT = DllStructCreate($tagRECT, DllStructGetPtr(($aData[$CtrlID][$SPL_POS])[$iIndex], 1))
                    _WinAPI_GetWindowRectEx($iCtrlIDSplitting, $tRECT)
                Next
            Next
            If Not $aData[$CtrlID][$SPL_LDOWN] Then Return 0
            Local $tNMHDR = DllStructCreate($tagNMHDR)
            DllStructSetData($tNMHDR, "hWndFrom", $hWnd)
            DllStructSetData($tNMHDR, "IDFrom", $CtrlID)
            DllStructSetData($tNMHDR, "Code", $SPN_ENTERSIZEMOVE)
            _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tNMHDR))
            Return 0
        Case $WM_EXITSIZEMOVE
            $aData[$CtrlID][$SPL_LOCK] = 1
            $aData[$CtrlID][$SPL_STOP] = 0
            Local $hParent = $aData[$CtrlID][$SPL_PARENT]
            Local $tNMHDR = DllStructCreate($tagNMHDR)
            DllStructSetData($tNMHDR, "hWndFrom", $hWnd)
            DllStructSetData($tNMHDR, "IDFrom", $CtrlID)
            DllStructSetData($tNMHDR, "Code", $SPN_EXITSIZEMOVE)
            _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tNMHDR))
            Local $tRECT = _WinAPI_GetWindowRect($hWnd)
            __rectScreenToClient($hParent, $tRECT)
            GUICtrlSetPos($CtrlID, DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 2), DllStructGetData($tRECT, 3) - DllStructGetData($tRECT, 1), DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2))
            If $aData[$CtrlID][$SPL_SHOW] > -1 Then _WinAPI_ShowWindow($hWnd, $aData[$CtrlID][$SPL_SHOW])
            GUICtrlSetState($CtrlID, $GUI_ONTOP)
            $aData[$CtrlID][$SPL_SHOW] = -1
        Case $WM_NCLBUTTONDOWN
            Local $hParent = $aData[$CtrlID][$SPL_PARENT]
            Local $tNMHDR = DllStructCreate($tagNMHDR)
            DllStructSetData($tNMHDR, "hWndFrom", $hWnd)
            DllStructSetData($tNMHDR, "IDFrom", $CtrlID)
            DllStructSetData($tNMHDR, "Code", $SPN_CAPTURECHANGED)
            _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tNMHDR))
            $aData[$CtrlID][$SPL_LDOWN] = 1
            Return _WinAPI_DefWindowProcW($hWnd, $iMsg, $wParam, $lParam)
        Case $WM_NCLBUTTONDBLCLK
            ConsoleWrite('$WM_NCLBUTTONDBLCLK ' & $CtrlID & @CR)
            Local $hParent = $aData[$CtrlID][$SPL_PARENT]
            Local $tNMHDR = DllStructCreate($tagNMHDR)
            DllStructSetData($tNMHDR, "hWndFrom", $hWnd)
            DllStructSetData($tNMHDR, "IDFrom", $CtrlID)
            DllStructSetData($tNMHDR, "Code", $SPN_LBUTTONDBLCLK)
            _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tNMHDR))
        Case $WM_CHILDACTIVATE
            Local $hParent = $aData[$CtrlID][$SPL_PARENT]
            Local $tNMHDR = DllStructCreate($tagNMHDR)
            DllStructSetData($tNMHDR, "hWndFrom", $hWnd)
            DllStructSetData($tNMHDR, "IDFrom", $CtrlID)
            DllStructSetData($tNMHDR, "Code", $SPN_LBUTTONCLK)
            _SendMessage($hParent, $WM_NOTIFY, 0, DllStructGetPtr($tNMHDR))
            $aData[$CtrlID][$SPL_LDOWN] = 0
        Case $WM_MOUSEACTIVATE
            Return 1
        Case $WM_NCHITTEST
            Return 2
        Case $WM_DESTROY
            _WinAPI_RemoveWindowSubclass($hWnd, $pData, $CtrlID)
    EndSwitch
    Return __WinAPI_DefSubclassProcEx($hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>__ctrlSplitProc

Func __WinAPI_DefSubclassProcEx($hWnd, $iMsg, $wParam, $lParam)
    Return DllCall("comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)[0]
EndFunc   ;==>__WinAPI_DefSubclassProcEx

Func __controlshow($iItem, $iState)
    If __iswindow($iItem) Then
        _WinAPI_ShowWindow($iItem, ($iState == $GUI_SHOW ? @SW_SHOW : @SW_HIDE))
    Else
        GUICtrlSetState($iItem, $iState)
    EndIf
EndFunc   ;==>__controlshow

Func __ControlMove($iItem, $iX = Default, $iY = Default, $iW = Default, $iH = Default)
    If __iswindow($iItem) Then
        Local $iFlag = BitOR($SWP_NOZORDER, $SWP_NOACTIVATE)
        If $iX == Default And $iY == Default Then $iFlag = BitOR($iFlag, $SWP_NOMOVE)
        If $iW == Default And $iH == Default Then $iFlag = BitOR($iFlag, $SWP_NOSIZE)
        Local $tRECT = DllStructCreate($tagRECT)
        _WinAPI_GetWindowRectEx($iItem, $tRECT)
        If @error Then Return 0
        If ($iX == Default And BitAND($iFlag, $SWP_NOMOVE) <> $SWP_NOMOVE) Then $iX = DllStructGetData($tRECT, 1)
        If ($iY == Default And BitAND($iFlag, $SWP_NOMOVE) <> $SWP_NOMOVE) Then $iY = DllStructGetData($tRECT, 2)
        If ($iW == Default And BitAND($iFlag, $SWP_NOSIZE) <> $SWP_NOSIZE) Then $iW = DllStructGetData($tRECT, 3) - DllStructGetData($tRECT, 1)
        If ($iH == Default And BitAND($iFlag, $SWP_NOSIZE) <> $SWP_NOSIZE) Then $iH = DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2)
        
        _WinAPI_SetWindowPos($iItem, 0, $iX, $iY, $iW, $iH, $iFlag)
    Else
        GUICtrlSetPos($iItem, $iX, $iY, $iW, $iH)
    EndIf
EndFunc   ;==>__ControlMove

Func __SetPos($iCtrlIDSplitting, $SPL_POS, ByRef $tPOS, ByRef $tRECT, $distance, $dock)
    If __iswindow($iCtrlIDSplitting) Then
        Local $userdata = _WinAPI_GetWindowLong($iCtrlIDSplitting, $GWL_USERDATA)
        If $userdata Then $iCtrlIDSplitting = $userdata
    EndIf
    Switch $SPL_POS
        Case $SPL_TOP
            If $dock Then
                __ControlMove($iCtrlIDSplitting, Default, DllStructGetData($tPOS, 'Y') - $distance - DllStructGetData($tRECT, 4) + DllStructGetData($tRECT, 2))
            Else
                __ControlMove($iCtrlIDSplitting, Default, Default, Default, DllStructGetData($tPOS, 'Y') - $distance - DllStructGetData($tRECT, 2))
            EndIf
        Case $SPL_BOTTOM
            If $dock Then
                __ControlMove($iCtrlIDSplitting, Default, DllStructGetData($tPOS, 'Y') + DllStructGetData($tPOS, 'CY') + $distance)
            Else
                __ControlMove($iCtrlIDSplitting, Default, DllStructGetData($tPOS, 'Y') + DllStructGetData($tPOS, 'CY') + $distance, Default, DllStructGetData($tRECT, 4) - DllStructGetData($tPOS, 'Y') - DllStructGetData($tPOS, 'CY') - $distance)
            EndIf
        Case $SPL_LEFT
            If $dock Then
                __ControlMove($iCtrlIDSplitting, DllStructGetData($tPOS, 'X') - $distance - DllStructGetData($tRECT, 3) + DllStructGetData($tRECT, 1))
            Else
                __ControlMove($iCtrlIDSplitting, Default, Default, DllStructGetData($tPOS, 'X') - $distance - DllStructGetData($tRECT, 1))
            EndIf
        Case $SPL_RIGHT
            If $dock Then
                __ControlMove($iCtrlIDSplitting, DllStructGetData($tPOS, 'X') + DllStructGetData($tPOS, 'CX') + $distance)
            Else
                __ControlMove($iCtrlIDSplitting, DllStructGetData($tPOS, 'X') + DllStructGetData($tPOS, 'CX') + $distance, Default, DllStructGetData($tRECT, 3) - DllStructGetData($tPOS, 'X') - DllStructGetData($tPOS, 'CX') - $distance)
            EndIf
    EndSwitch
EndFunc   ;==>__SetPos

Func __ctrlEnable($iCtrlID, $fEnabled = True)
    Local $hControl = __iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID)
    $iCtrlID = (__iswindow($iCtrlID) ? _WinAPI_GetDlgCtrlID($iCtrlID) : $iCtrlID)
    If $fEnabled Then
        _WinAPI_SetWindowSubclass($hControl, DllCallbackGetPtr($__h_DllSubclassCtrlSplit), $iCtrlID, DllCallbackGetPtr($__h_DllSubclassCtrlSplit))
    Else
        _WinAPI_RemoveWindowSubclass($hControl, DllCallbackGetPtr($__h_DllSubclassCtrlSplit), $iCtrlID)
    EndIf
EndFunc   ;==>__ctrlEnable

Func __iswindow($iCtrlID)
    Return (_WinAPI_IsWindow($iCtrlID) And Not GUICtrlGetHandle($iCtrlID))
EndFunc   ;==>__iswindow

Func __rectScreenToClient($hWnd, ByRef $tRECT)
    Local $tPoint = DllStructCreate("int X;int Y")
    DllStructSetData($tPoint, "X", DllStructGetData($tRECT, 'Left'))
    DllStructSetData($tPoint, "Y", DllStructGetData($tRECT, 'Top'))
    _WinAPI_ScreenToClient($hWnd, $tPoint)
    DllStructSetData($tRECT, 'Left', DllStructGetData($tPoint, 'X'))
    DllStructSetData($tRECT, 'Top', DllStructGetData($tPoint, 'Y'))

    DllStructSetData($tPoint, "X", DllStructGetData($tRECT, 'Right'))
    DllStructSetData($tPoint, "Y", DllStructGetData($tRECT, 'Bottom'))
    _WinAPI_ScreenToClient($hWnd, $tPoint)
    DllStructSetData($tRECT, 'Right', DllStructGetData($tPoint, 'X'))
    DllStructSetData($tRECT, 'Bottom', DllStructGetData($tPoint, 'Y'))
EndFunc   ;==>__rectScreenToClient

Func __WinAPI_CreateRectEx($tRECT, $iX, $iY, $iWidth, $iHeight)
    DllStructSetData($tRECT, 1, $iX)
    DllStructSetData($tRECT, 2, $iY)
    DllStructSetData($tRECT, 3, $iX + $iWidth)
    DllStructSetData($tRECT, 4, $iY + $iHeight)
EndFunc   ;==>__WinAPI_CreateRectEx

Func _WinAPI_GetWindowRectEx($iCtrlID, $tRECT)
    Local $hControl = (__iswindow($iCtrlID) ? $iCtrlID : GUICtrlGetHandle($iCtrlID))
    If @error Or Not $hControl Then
        Local $aPos = ControlGetPos(_WinAPI_GetParent($hControl), '', $iCtrlID)
        If @error Then Return SetError(1, 0, 0)
        __WinAPI_CreateRectEx($tRECT, $aPos[0], $aPos[1], $aPos[2], $aPos[3])
    Else
        DllCall("user32.dll", "bool", "GetWindowRect", "hwnd", $hControl, "struct*", $tRECT)
        __rectScreenToClient(_WinAPI_GetParent($hControl), $tRECT)
    EndIf
EndFunc   ;==>_WinAPI_GetWindowRectEx

Func _GetWidth($CtrlID)
    Local $hControl = __iswindow($CtrlID) ? $CtrlID : GUICtrlGetHandle($CtrlID)
    Local $tRECT = _WinAPI_GetWindowRect($hControl)
    Return DllStructGetData($tRECT, 3) - DllStructGetData($tRECT, 1)
EndFunc   ;==>_GetWidth

Func _GetHeight($CtrlID)
    Local $hControl = __iswindow($CtrlID) ? $CtrlID : GUICtrlGetHandle($CtrlID)
    Local $tRECT = _WinAPI_GetWindowRect($hControl)
    Return DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2)
EndFunc   ;==>_GetHeight

Func _GetRight($CtrlID)
    Local $hControl = __iswindow($CtrlID) ? $CtrlID : GUICtrlGetHandle($CtrlID)
    Local $tRECT = _WinAPI_GetWindowRect($hControl)
    __rectScreenToClient(_WinAPI_GetParent($hControl), $tRECT)
    Return DllStructGetData($tRECT, 3)
EndFunc   ;==>_GetRight

Func _GetLeft($CtrlID)
    Local $hControl = __iswindow($CtrlID) ? $CtrlID : GUICtrlGetHandle($CtrlID)
    Local $tRECT = _WinAPI_GetWindowRect($hControl)
    __rectScreenToClient(_WinAPI_GetParent($hControl), $tRECT)
    Return DllStructGetData($tRECT, 1)
EndFunc   ;==>_GetLeft

Func _GetTop($CtrlID)
    Local $hControl = __iswindow($CtrlID) ? $CtrlID : GUICtrlGetHandle($CtrlID)
    Local $tRECT = _WinAPI_GetWindowRect($hControl)
    __rectScreenToClient(_WinAPI_GetParent($hControl), $tRECT)
    Return DllStructGetData($tRECT, 2)
EndFunc   ;==>_GetTop

Func _GetBottom($CtrlID)
    Local $hControl = __iswindow($CtrlID) ? $CtrlID : GUICtrlGetHandle($CtrlID)
    Local $tRECT = _WinAPI_GetWindowRect($hControl)
    __rectScreenToClient(_WinAPI_GetParent($hControl), $tRECT)
    Return DllStructGetData($tRECT, 4)
EndFunc   ;==>_GetBottom

Func __ctrlSplitExit()
    DllCallbackFree($__h_DllSubclassCtrlSplit)
EndFunc   ;==>__ctrlSplitExit

#EndRegion Internal functions

 

ApiDPI.au3

Spoiler
#include-once
;Coded by UEZ build 2023-08-15 beta
#include-once
#include <GDIPlus.au3>
#include <Misc.au3>
#include <WinAPISysWin.au3>
#include <WinAPIsysinfoConstants.au3>

#Region DPI Constants
;https://learn.microsoft.com/en-us/windows/win32/api/windef/ne-windef-dpi_awareness
Global Enum $DPI_AWARENESS_INVALID = -1, $DPI_AWARENESS_UNAWARE = 0, $DPI_AWARENESS_SYSTEM_AWARE = 1, $DPI_AWARENESS_PER_MONITOR_AWARE = 2

;https://learn.microsoft.com/en-us/windows/win32/hidpi/dpi-awareness-context
Global Const $DPI_AWARENESS_CONTEXT_UNAWARE = $DPI_AWARENESS_UNAWARE - 1
Global Const $DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = $DPI_AWARENESS_UNAWARE - 2
Global Const $DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = $DPI_AWARENESS_UNAWARE - 3
Global Const $DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = $DPI_AWARENESS_UNAWARE - 4
Global Const $DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED = $DPI_AWARENESS_UNAWARE - 5

; enum _MONITOR_DPI_TYPE
Global Enum $MDT_EFFECTIVE_DPI = 0, $MDT_ANGULAR_DPI, $MDT_RAW_DPI
Global Const $MDT_DEFAULT = $MDT_EFFECTIVE_DPI

;Windows Message Codes
Global Const $WM_DPICHANGED = 0x02E0, $WM_DPICHANGED_BEFOREPARENT = 0x02E2, $WM_DPICHANGED_AFTERPARENT = 0x02E3, $WM_GETDPISCALEDSIZE = 0x02E4
#EndRegion DPI Constants

#Region WinAPI DPI

Func _WinAPI_OpenThemeDataForDpi($hWnd, $sClass, $iDPI)
    Local $aResult = DllCall("uxtheme.dll", "hwnd", "OpenThemeDataForDpi", "hwnd", $hWnd, "wstr", $sClass, "uint", $iDPI)

    If @error Then Return SetError(@error, @extended, 0)
    Return SetError(0, 0, $aResult[0])
EndFunc

Func _WinAPI_GetSystemMetricsForDpi($iIndex, $iDPI)
    Local $aResult = DllCall("User32.dll", "bool", "GetSystemMetricsForDpi", "int", $iIndex, "uint", $iDPI)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError(0, 0, $aResult[0])
EndFunc

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-adjustwindowrectexfordpi
Func _WinAPI_AdjustWindowRectExForDpi($tRECT, $dpi, $dwStyle, $dwExStyle, $bMenu = False)
    Local $aResult = DllCall("user32.dll", "bool", "AdjustWindowRectExForDpi", "struct*", $tRECT, "dword", $dwStyle, "bool", $bMenu, "dword", $dwExStyle, "int", $dpi) ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If $aResult[0] Then Return SetError(2, @extended, 0)
EndFunc   ;==>_WinAPI_AdjustWindowRectExForDpi

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfofordpi
Func _WinAPI_SystemParametersInfoForDpi($uiAction, $uiParam, $pvParam, $fWinIni, $dpi)
    Local $aResult = DllCall("user32.dll", "bool", "SystemParametersInfoForDpi", "uint", $uiAction, "uint", $uiParam, "struct*", $pvParam, "uint", $fWinIni, "uint", $dpi) ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_SystemParametersInfoForDpi

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-inheritwindowmonitor
Func _WinAPI_InheritWindowMonitor($hWnd, $hWndInherit)
    Local $aResult = DllCall("user32.dll", "bool", "InheritWindowMonitor", "hwnd", $hWnd, "hwnd", $hWndInherit) ;requires Win10 v1803+ / Windows Server 2016+
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_InheritWindowMonitor

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-isvaliddpiawarenesscontext
Func _WinAPI_IsValidDpiAwarenessContext($DPI_AWARENESS_CONTEXT_value)
    Local $aResult = DllCall("user32.dll", "bool", "IsValidDpiAwarenessContext", @AutoItX64 ? "int64" : "int", $DPI_AWARENESS_CONTEXT_value) ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_IsValidDpiAwarenessContext

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-logicaltophysicalpointforpermonitordpi
Func _WinAPI_LogicalToPhysicalPointForPerMonitorDPI($hWnd)
    Local $tPOINT = DllStructCreate($tagPOINT)
    Local $aResult = DllCall("user32.dll", "bool", "LogicalToPhysicalPointForPerMonitorDPI", "hwnd", $hWnd, "struct*", $tPOINT) ;requires Win 8.1+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $tPOINT
EndFunc   ;==>_WinAPI_LogicalToPhysicalPointForPerMonitorDPI

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-physicaltologicalpointforpermonitordpi
Func _WinAPI_PhysicalToLogicalPointForPerMonitorDPI($hWnd)
    Local $tPOINT = DllStructCreate($tagPOINT)
    Local $aResult = DllCall("user32.dll", "bool", "PhysicalToLogicalPointForPerMonitorDPI", "hwnd", $hWnd, "struct*", $tPOINT) ;requires Win 8.1+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $tPOINT
EndFunc   ;==>_WinAPI_PhysicalToLogicalPointForPerMonitorDPI


Func _GDIPlus_GetDPI($hGUI = 0)
    _GDIPlus_Startup()
    Local $hGfx = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    If @error Then Return SetError(1, @extended, 0)
    Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetDpiX", "handle", $hGfx, "float*", 0)
    If @error Then Return SetError(2, @extended, 0)
    _GDIPlus_GraphicsDispose($hGfx)
    _GDIPlus_Shutdown()
    Return $aResult[2]
EndFunc   ;==>_GDIPlus_GetDPI

Func _WinAPI_GetDPI($hWnd = 0)
    $hWnd = Not $hWnd ? _WinAPI_GetDesktopWindow() : $hWnd
    Local Const $hDC = _WinAPI_GetDC($hWnd)
    If @error Then Return SetError(1, 0, 0)
    Local Const $iDPI = _WinAPI_GetDeviceCaps($hDC, $LOGPIXELSX)
    If @error Or Not $iDPI Then
        _WinAPI_ReleaseDC($hWnd, $hDC)
        Return SetError(2, 0, 0)
    EndIf
    _WinAPI_ReleaseDC($hWnd, $hDC)
    Return $iDPI
EndFunc   ;==>_WinAPI_GetDPI

;https://learn.microsoft.com/en-us/windows/win32/api/shellscalingapi/nf-shellscalingapi-getdpiformonitor
Func _WinAPI_GetDpiForPrimaryMonitor($hMOnitor = 0, $dpiType = $MDT_DEFAULT)
    If $hMOnitor = 0 Then
        Local $aMonitors = _WinAPI_EnumDisplayMonitors()
        If @error Or Not IsArray($aMonitors) Then Return SetError(1, 0, 0)
        Local $i
        For $i = 1 To $aMonitors[0][0]
            If _WinAPI_GetMonitorInfo($aMonitors[$i][0])[2] = 1 Then
                $hMOnitor = $aMonitors[$i][0]
                ExitLoop
            EndIf
        Next
    EndIf
    Local $tx = DllStructCreate("int dpiX"), $tY = DllStructCreate("int dpiY")
    Local $aResult = DllCall("Shcore.dll", "long", "GetDpiForMonitor", "handle", $hMOnitor, "long", $dpiType, "struct*", $tx, "struct*", $tY)
    If @error Or Not IsArray($aResult) Then Return SetError(2, 0, 0)
    Return $tx.dpiX
EndFunc   ;==>_WinAPI_GetDpiForPrimaryMonitor

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdpiforwindow
Func _WinAPI_GetDpiForWindow($hWnd)
    Local $aResult = DllCall("user32.dll", "uint", "GetDpiForWindow", "hwnd", $hWnd) ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetDpiForWindow

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdpiforsystem
Func _WinAPI_GetDpiForSystem()
    Local $aResult = DllCall("user32.dll", "uint", "GetDpiForSystem") ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetDpiForSystem

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getthreaddpiawarenesscontext
Func _WinAPI_GetThreadDpiAwarenessContext()
    Local $aResult = DllCall("user32.dll", "uint", "GetThreadDpiAwarenessContext") ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetThreadDpiAwarenessContext

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdpifromdpiawarenesscontext
Func _WinAPI_GetDpiFromDpiAwarenessContext($DPI_AWARENESS_CONTEXT_value)
    Local $aResult = DllCall("user32.dll", "uint", "GetDpiFromDpiAwarenessContext", @AutoItX64 ? "int64" : "int", $DPI_AWARENESS_CONTEXT_value) ;requires Win10 v1803+ / Windows Server 2016+
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetDpiFromDpiAwarenessContext

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getawarenessfromdpiawarenesscontext
Func _WinAPI_GetAwarenessFromDpiAwarenessContext($DPI_AWARENESS_CONTEXT_value)
    Local $aResult = DllCall("user32.dll", "uint", "GetAwarenessFromDpiAwarenessContext", @AutoItX64 ? "int64" : "int", $DPI_AWARENESS_CONTEXT_value) ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetAwarenessFromDpiAwarenessContext

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdpiawarenesscontextforprocess
Func _WinAPI_GetDpiAwarenessContextForProcess($hProcess)
    Local $aResult = DllCall("user32.dll", "uint", "GetDpiAwarenessContextForProcess", "handle", $hProcess) ;requires Win10 v1803+ / Windows Server 2016+
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetDpiAwarenessContextForProcess

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemdpiforprocess
Func _WinAPI_GetSystemDpiForProcess($hProcess)
    Local $aResult = DllCall("user32.dll", "uint", "GetSystemDpiForProcess", "handle", $hProcess) ;requires Win10 v1803+ / Windows Server 2016+
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetSystemDpiForProcess

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowdpiawarenesscontext
Func _WinAPI_GetWindowDpiAwarenessContext($hWnd)
    Local $aResult = DllCall("user32.dll", "uint", "GetWindowDpiAwarenessContext", "hwnd", $hWnd) ;requires Win10 v1607+ / no server support
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_GetWindowDpiAwarenessContext


;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setprocessdpiawarenesscontext
Func _WinAPI_SetProcessDpiAwarenessContext($DPI_AWARENESS_CONTEXT_value)
    Local $aResult = DllCall("user32.dll", "bool", "SetProcessDpiAwarenessContext", @AutoItX64 ? "int64" : "int", $DPI_AWARENESS_CONTEXT_value) ;requires Win10 v1703+ / Windows Server 2016+
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_SetProcessDpiAwarenessContext

;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setthreaddpiawarenesscontext
Func _WinAPI_SetThreadDpiAwarenessContext($DPI_AWARENESS_CONTEXT_value)
    Local $aResult = DllCall("user32.dll", "uint", "SetThreadDpiAwarenessContext", @AutoItX64 ? "int64" : "int", $DPI_AWARENESS_CONTEXT_value) ;requires Win10 v1703+ / Windows Server 2016+
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If Not $aResult[0] Then Return SetError(2, @extended, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_SetThreadDpiAwarenessContext

;https://learn.microsoft.com/en-us/windows/win32/api/shellscalingapi/nf-shellscalingapi-setprocessdpiawareness
Func _WinAPI_SetProcessDpiAwareness($PROCESS_DPI_AWARENESS = $DPI_AWARENESS_PER_MONITOR_AWARE)
    Local $aResult = DllCall("Shcore.dll", "long", "SetProcessDpiAwareness", "int", $PROCESS_DPI_AWARENESS) ;requires Win 8.1+ / Server 2012 R2+
    If Not IsArray($aResult) Or @error Then Return SetError(1, @extended, 0)
    If $aResult[0] Then Return SetError(2, $aResult[0], 0)
    Return $aResult[0] ;0 is S_OK
EndFunc   ;==>_WinAPI_SetProcessDpiAwareness

Func _WinAPI_SetProcessDPIAware()
    Local $aResult = DllCall("User32.dll", "bool", "SetProcessDPIAware")
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[0]
EndFunc

Func _WinAPI_SetDPIAwareness($DPIAwareContext = $DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE, $iMode = 1)
    Switch @OSBuild
        Case 6000 To 9199
            Local $aResult = DllCall("user32.dll", "bool", "SetProcessDPIAware") ;requires Vista+ / Server 2008+
            If Not $aResult[0] Then Return SetError(1, 0, 0)
        Case 9200 To 13999
            $DPIAwareContext = ($DPIAwareContext < 0) ? 0 : ($DPIAwareContext > 2) ? 2 : $DPIAwareContext
            _WinAPI_SetProcessDpiAwareness($DPIAwareContext)
            If @error Then Return SetError(2, @error, 0)
        Case @OSBuild > 13999
            $DPIAwareContext = ($DPIAwareContext < -5) ? -5 : ($DPIAwareContext > -1) ? -1 : $DPIAwareContext
            $iMode = ($iMode < 1) ? 1 : ($iMode > 2) ? 2 : $iMode
            Local $iResult
            Switch $iMode
                Case 1
                    $iResult = _WinAPI_SetProcessDpiAwarenessContext($DPIAwareContext)
                    If Not $iResult Or @error Then Return SetError(3, 0, 0)
                Case 2
                    #cs
                        Return DPI_AWARENESS_CONTEXT values
                        $DPI_AWARENESS_CONTEXT_UNAWARE = 0x6010 / 24592
                        $DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = 0x9011 / 36881
                        $DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = 0x12 / 18
                        $DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = 0x22 / 34
                        $DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED = 0x40006010 / 1073766416
                    #ce
                    $iResult = _WinAPI_SetThreadDpiAwarenessContext($DPIAwareContext)
                    If Not $iResult Or @error Then Return SetError(4, 0, 0)
            EndSwitch
    EndSwitch
    Local $iDPI
    If @OSBuild < 9200 Then
        $iDPI = _WinAPI_GetDPI()
        If @error Or Not $iDPI Then Return SetError(5, 0, 0)
    Else
        $iDPI = _WinAPI_GetDpiForPrimaryMonitor()
        If @error Or Not $iDPI Then Return SetError(6, 0, 0)
    EndIf

    Return $iDPI
EndFunc   ;==>_WinAPI_SetDPIAwareness
#EndRegion WinAPI DPI

 

 

Edited by musicstashall
Posted

I changed the colors a bit:

$UserName = GUICtrlCreateLabel("Name", 153, 32, 337, 35, $SS_CENTERIMAGE)
GUICtrlSetColor(-1, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_HOTLIGHT)))
$CompanyName = GUICtrlCreateLabel("Organization", 155, 77, 327, 30, $SS_CENTERIMAGE)
GUICtrlSetColor(-1, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_HOTLIGHT)))

to work on my dark mode theme.

Did have a problem moving the example from my primary monitor ( 100% scale ) to my secondary ( 200% scale )

Other than that, thanks for the code :) 

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Posted
29 minutes ago, argumentum said:

to work on my dark mode theme

I'm not showing the window, it will be yours. I'm showing off the splitters. How do splitters display in dark themes?

30 minutes ago, argumentum said:

Did have a problem moving the example from my primary monitor ( 100% scale ) to my secondary ( 200% scale )

Unfortunately, I did not have the opportunity to check on two monitors. tell us in more detail, what exactly is the problem?

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
×
×
  • Create New...