musicstashall Posted 4 hours ago Posted 4 hours ago (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 expandcollapse popup;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 expandcollapse popup;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 expandcollapse popup;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 expandcollapse popup#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 4 hours ago by musicstashall argumentum 1
argumentum Posted 4 hours ago Posted 4 hours ago 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.
musicstashall Posted 3 hours ago Author Posted 3 hours ago 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?
argumentum Posted 3 hours ago Posted 3 hours ago 7 minutes ago, musicstashall said: How do splitters display in dark themes? They look good. Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now