AZJIO

Сохранение позиции окна

Sep 16th, 2011
1,027
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Сохранение координат и размера окна и проверка валидности этих параметров при запуске.
  2. ; в отличии от предыдущих вариантов здесь используется $GUI_EVENT_RESIZED и WM_MOVING. Оба события не реагируют на максимизацию окна, а значит при закрытии максимизированного окна не сохраняют размеры на весь экран. Но максимизация сохраняется отдельным параметром. Для большей точности события $GUI_EVENT_MAXIMIZE и $GUI_EVENT_RESTORE позволят сохранить состояние даже когда максимизированное окно закрыто из свёрнутого состояния.
  3. #include <GUIConstantsEx.au3>
  4. #include <WindowsConstants.au3>
  5. #include <WinAPI.au3>
  6. #include <UserGUI.au3>
  7.  
  8. Global $WHXY[5], $ini = @ScriptDir & '\SaveXY.ini'
  9.  
  10. $WHXY[0] = Number(IniRead($ini, 'Set', 'W', '330'))
  11. $WHXY[1] = Number(IniRead($ini, 'Set', 'H', '220'))
  12. $WHXY[2] = IniRead($ini, 'Set', 'X', '')
  13. $WHXY[3] = IniRead($ini, 'Set', 'Y', '')
  14. $WHXY[4] = Number(IniRead($ini, 'Set', 'WinMax', ''))
  15.  
  16. _SetCoor($WHXY, 230, 300, 2, 1) ; ограничение ширины 230, ограничение высоты 300
  17. ; MsgBox(0, 'Сообщение', $WHXY[0] & @LF & $WHXY[1] & @LF & $WHXY[2] & @LF & $WHXY[3] & @LF & $WHXY[4])
  18. $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR($WS_SYSMENU, $WS_SIZEBOX) ) ; $iStyle = 2, $iFixed = 1
  19. ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], $WS_SYSMENU ) ; $iStyle = 0, $iFixed = 1
  20. ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR( $WS_BORDER, $WS_POPUP, $WS_SIZEBOX)) ; $iStyle = 3, $iFixed = 1
  21. ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR( $WS_BORDER, $WS_POPUP)) ; $iStyle = 1, $iFixed = 1
  22. ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], $WS_OVERLAPPEDWINDOW) ; $iStyle = 3, $iFixed = 0
  23. ; $hGui = GUICreate('My Program', $WHXY[0], $WHXY[1], $WHXY[2], $WHXY[3], BitOR($WS_CAPTION, $WS_SYSMENU, $WS_POPUP)) ; $iStyle = 2, $iFixed = 0
  24. GUISetBkColor(0x000066)
  25. $OpFile = GUICtrlCreateButton('Exit', 150, 5, 86, 28)
  26. $Label = GUICtrlCreateLabel('Тащи за это', 5, 45, 240, 135, -1, $GUI_WS_EX_PARENTDRAG)
  27. GUICtrlSetBkColor(-1, 0xfdffae)
  28.  
  29.  
  30. $Left = GUICtrlCreateDummy()
  31. $RIGHT = GUICtrlCreateDummy()
  32. $UP = GUICtrlCreateDummy()
  33. $DOWN = GUICtrlCreateDummy()
  34.  
  35. Local $aAccelKeys[4][2] = [["{Left}", $Left],["{RIGHT}", $RIGHT],["{UP}", $UP],["{DOWN}", $DOWN]]
  36. GUISetAccelerators($aAccelKeys)
  37.  
  38.  
  39. GUISetState()
  40. If $WHXY[4] Then GUISetState(@SW_MAXIMIZE, $hGui)
  41.  
  42. OnAutoItExitRegister("_Exit_Save_Ini")
  43. GUIRegisterMsg(0x0216, "WM_MOVING")
  44.  
  45. While 1
  46.     Switch GUIGetMsg()
  47.         Case $UP
  48.             $aPosGUI = WinGetPos($hGui)
  49.             WinMove($hGui, '', $aPosGUI[0], $aPosGUI[1] - 1)
  50.         Case $DOWN
  51.             $aPosGUI = WinGetPos($hGui)
  52.             WinMove($hGui, '', $aPosGUI[0], $aPosGUI[1] + 1)
  53.         Case $RIGHT
  54.             $aPosGUI = WinGetPos($hGui)
  55.             WinMove($hGui, '', $aPosGUI[0] + 1, $aPosGUI[1])
  56.         Case $Left
  57.             $aPosGUI = WinGetPos($hGui)
  58.             WinMove($hGui, '', $aPosGUI[0] - 1, $aPosGUI[1])
  59.         Case $GUI_EVENT_MAXIMIZE
  60.             $WHXY[4] = 1
  61.         Case $GUI_EVENT_RESTORE
  62.             $WHXY[4] = 0
  63.         Case $GUI_EVENT_RESIZED
  64.             _Resized()
  65.         Case -3, $OpFile
  66.             Exit
  67.     EndSwitch
  68. WEnd
  69.  
  70. Func _Exit_Save_Ini()
  71.     $iState = WinGetState($hGui)
  72.     $aWA = _WinAPI_GetWorkingArea()
  73.     ; Если окно не свёрнуто или не развёрнуто на весь экран, то получаем его координаты и размеры
  74.     ; If Not (BitAnd($iState, 16) Or BitAnd($iState, 32)) Then _Resized()
  75.     IniWrite($ini, 'Set', 'WinMax', $WHXY[4])
  76.     IniWrite($ini, 'Set', 'W', $WHXY[0])
  77.     IniWrite($ini, 'Set', 'H', $WHXY[1])
  78.     IniWrite($ini, 'Set', 'X', $WHXY[2] - $aWA[0])
  79.     IniWrite($ini, 'Set', 'Y', $WHXY[3] - $aWA[1])
  80. EndFunc   ;==>_Exit_Save_Ini
  81.  
  82. Func _Resized() ; срабатывает один раз при изменении размера окна, но не при "Развернуть на весь экран", "Восстановить"
  83.     $GuiPos = WinGetPos($hGui)
  84.     $ClientSz = WinGetClientSize($hGui) ; сохраняется размер клиентской области
  85.     $WHXY[0] = $ClientSz[0]
  86.     $WHXY[1] = $ClientSz[1]
  87.     $WHXY[2] = $GuiPos[0]
  88.     $WHXY[3] = $GuiPos[1]
  89. EndFunc   ;==>_Resized
  90.  
  91. Func WM_MOVING($hWnd, $Msg, $wParam, $lParam)
  92.     ; получаем координаты окна. Это нужно при закрытии свёрнутого скрипта
  93.     Local $sRect = DllStructCreate("Int[4]", $lParam)
  94.     $WHXY[2] = DllStructGetData($sRect, 1, 1)
  95.     $WHXY[3] = DllStructGetData($sRect, 1, 2)
  96.     Return $GUI_RUNDEFMSG
  97. EndFunc   ;==>WM_MOVING
RAW Paste Data