Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Сохранение координат и размера окна и проверка валидности этих параметров при запуске.
- ; в отличии от предыдущих вариантов здесь используется $GUI_EVENT_RESIZED и WM_MOVING. Оба события не реагируют на максимизацию окна, а значит при закрытии максимизированного окна не сохраняют размеры на весь экран. Но максимизация сохраняется отдельным параметром. Для большей точности события $GUI_EVENT_MAXIMIZE и $GUI_EVENT_RESTORE позволят сохранить состояние даже когда максимизированное окно закрыто из свёрнутого состояния.
- #include <GUIConstantsEx.au3>
- #include <WindowsConstants.au3>
- #include <WinAPI.au3>
- #include <UserGUI.au3>
- Global $WHXY[5], $ini = @ScriptDir & '\SaveXY.ini'
- $WHXY[0] = Number(IniRead($ini, 'Set', 'W', '330'))
- $WHXY[1] = Number(IniRead($ini, 'Set', 'H', '220'))
- $WHXY[2] = IniRead($ini, 'Set', 'X', '')
- $WHXY[3] = IniRead($ini, 'Set', 'Y', '')
- $WHXY[4] = Number(IniRead($ini, 'Set', 'WinMax', ''))
- _SetCoor($WHXY, 230, 300, 2, 1) ; ограничение ширины 230, ограничение высоты 300
- ; MsgBox(0, 'Сообщение', $WHXY[0] & @LF & $WHXY[1] & @LF & $WHXY[2] & @LF & $WHXY[3] & @LF & $WHXY[4])
- $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR($WS_SYSMENU, $WS_SIZEBOX) ) ; $iStyle = 2, $iFixed = 1
- ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], $WS_SYSMENU ) ; $iStyle = 0, $iFixed = 1
- ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR( $WS_BORDER, $WS_POPUP, $WS_SIZEBOX)) ; $iStyle = 3, $iFixed = 1
- ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR( $WS_BORDER, $WS_POPUP)) ; $iStyle = 1, $iFixed = 1
- ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], $WS_OVERLAPPEDWINDOW) ; $iStyle = 3, $iFixed = 0
- ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR($WS_CAPTION, $WS_SYSMENU, $WS_POPUP)) ; $iStyle = 2, $iFixed = 0
- GUISetBkColor(0x000066)
- $OpFile = GUICtrlCreateButton('Exit', 150, 5, 86, 28)
- $Label = GUICtrlCreateLabel('Тащи за это', 5, 45, 240, 135, -1, $GUI_WS_EX_PARENTDRAG)
- GUICtrlSetBkColor(-1, 0xfdffae)
- $Left = GUICtrlCreateDummy()
- $RIGHT = GUICtrlCreateDummy()
- $UP = GUICtrlCreateDummy()
- $DOWN = GUICtrlCreateDummy()
- Local $aAccelKeys[4][2] = [["{Left}", $Left],["{RIGHT}", $RIGHT],["{UP}", $UP],["{DOWN}", $DOWN]]
- GUISetAccelerators($aAccelKeys)
- GUISetState()
- If $WHXY[4] Then GUISetState(@SW_MAXIMIZE, $hGui)
- OnAutoItExitRegister("_Exit_Save_Ini")
- GUIRegisterMsg(0x0216, "WM_MOVING")
- While 1
- Switch GUIGetMsg()
- Case $UP
- $aPosGUI = WinGetPos($hGui)
- WinMove($hGui, '', $aPosGUI[0], $aPosGUI[1] - 1)
- Case $DOWN
- $aPosGUI = WinGetPos($hGui)
- WinMove($hGui, '', $aPosGUI[0], $aPosGUI[1] + 1)
- Case $RIGHT
- $aPosGUI = WinGetPos($hGui)
- WinMove($hGui, '', $aPosGUI[0] + 1, $aPosGUI[1])
- Case $Left
- $aPosGUI = WinGetPos($hGui)
- WinMove($hGui, '', $aPosGUI[0] - 1, $aPosGUI[1])
- Case $GUI_EVENT_MAXIMIZE
- $WHXY[4] = 1
- Case $GUI_EVENT_RESTORE
- $WHXY[4] = 0
- Case $GUI_EVENT_RESIZED
- _Resized()
- Case -3, $OpFile
- Exit
- EndSwitch
- WEnd
- Func _Exit_Save_Ini()
- $iState = WinGetState($hGui)
- $aWA = _WinAPI_GetWorkingArea()
- ; Если окно не свёрнуто или не развёрнуто на весь экран, то получаем его координаты и размеры
- ; If Not (BitAnd($iState, 16) Or BitAnd($iState, 32)) Then _Resized()
- IniWrite($ini, 'Set', 'WinMax', $WHXY[4])
- IniWrite($ini, 'Set', 'W', $WHXY[0])
- IniWrite($ini, 'Set', 'H', $WHXY[1])
- IniWrite($ini, 'Set', 'X', $WHXY[2] - $aWA[0])
- IniWrite($ini, 'Set', 'Y', $WHXY[3] - $aWA[1])
- EndFunc ;==>_Exit_Save_Ini
- Func _Resized() ; срабатывает один раз при изменении размера окна, но не при "Развернуть на весь экран", "Восстановить"
- $GuiPos = WinGetPos($hGui)
- $ClientSz = WinGetClientSize($hGui) ; сохраняется размер клиентской области
- $WHXY[0] = $ClientSz[0]
- $WHXY[1] = $ClientSz[1]
- $WHXY[2] = $GuiPos[0]
- $WHXY[3] = $GuiPos[1]
- EndFunc ;==>_Resized
- Func WM_MOVING($hWnd, $Msg, $wParam, $lParam)
- ; получаем координаты окна. Это нужно при закрытии свёрнутого скрипта
- Local $sRect = DllStructCreate("Int[4]", $lParam)
- $WHXY[2] = DllStructGetData($sRect, 1, 1)
- $WHXY[3] = DllStructGetData($sRect, 1, 2)
- Return $GUI_RUNDEFMSG
- EndFunc ;==>WM_MOVING
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement