Что нового

Как вернуть первоначальное состояние окна?

Нубокодер

Новичок
Сообщения
75
Репутация
0
В результате выполнения _FullClicked() второй раз, нужно вернуть первоначальное состояние окна (с кнопками свернуть и закрыть). Какие параметры прописать после Else в функции _WinAPI_SetWindowLong (...) - вообще не понимаю :stars:

Код:
#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>

$GUI1 = GUICreate("Полный экран и обратно", 888, 500, 100, 150)

$iData = GUICtrlCreateLabel("Первоначальное окно с кнопками управления...", 50, 50, 450, -1)
GUISetState() ; окна видимы:
Sleep (5000)

_FullClicked()
Sleep (5000)

_FullClicked()
Sleep (5000)

Func _FullClicked() ; В максимальный экран и обратно:

    $hWin = WinGetHandle($GUI1); получаю дискриптер главного окна
    If Not $hWin Then Return ; если дискриптер НЕ получен - выйти с функции

    If WinGetState ( $hWin ) <> 47 Then ; если статус окна "НЕ развернуто на полный экран без строки"

		GUICtrlSetData($iData, "Устанавлен полноэкранный режим без кнопок")
        ConsoleWrite ( "Окно НЕ развернуто, значит разворачиваю " & @CRLF )
        _WinAPI_SetWindowLong($hWin, $GWL_STYLE, BitAND(_WinAPI_GetWindowLong($hWin, $GWL_STYLE), BitNOT($WS_CAPTION)))
        WinSetState($hWin, '', @SW_MAXIMIZE)
        WinActivate($hWin)

    Else

;~  ЗДЕСЬ НУЖНО ВЕРНУТЬ ВИД ОКНА В ПЕРВОНАЧАЛЬНОЕ СОСТОЯНИЕ (с верхней строкой, где есть кнопки свернуть и закрыть):
;~      _WinAPI_SetWindowLong($hWin, ????????????????????????????? )
		GUICtrlSetData($iData, "Получается так, а надо вернуть первоначальный размер и с кнопками управления")
        ConsoleWrite ( "Окно развернуто, значит восстанавливаю " & @CRLF )
        WinSetState($hWin, '', @SW_RESTORE)
        WinActivate($hWin)

    EndIf

    Return
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Можно изменить стиль окна , например по умолчанию :
Код:
#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>

$GUI1 = GUICreate("Полный экран и обратно", 888, 500, 100, 150)

$iData = GUICtrlCreateLabel("Первоначальное окно с кнопками управления...", 50, 50, 400, -1)
GUISetState() ; окна видимы:
Sleep (5000)

_FullClicked()
Sleep (5000)

_FullClicked()
Sleep (5000)

Func _FullClicked() ; В максимальный экран и обратно:

    $hWin = WinGetHandle($GUI1); получаю дискриптер главного окна
    If Not $hWin Then Return ; если дискриптер НЕ получен - выйти с функции

    If WinGetState ( $hWin ) <> 47 Then ; если статус окна "НЕ развернуто на полный экран без строки"

        GUICtrlSetData($iData, "Устанавлен полноэкранный режим без кнопок")
        ConsoleWrite ( "Окно НЕ развернуто, значит разворачиваю " & @CRLF )
        _WinAPI_SetWindowLong($hWin, $GWL_STYLE, BitAND(_WinAPI_GetWindowLong($hWin, $GWL_STYLE), BitNOT($WS_CAPTION)))
        WinSetState($hWin, '', @SW_MAXIMIZE)
        WinActivate($hWin)

    Else

;~  ЗДЕСЬ НУЖНО ВЕРНУТЬ ВИД ОКНА В ПЕРВОНАЧАЛЬНОЕ СОСТОЯНИЕ (с верхней строкой, где есть кнопки свернуть и закрыть):
;~      _WinAPI_SetWindowLong($hWin, ????????????????????????????? )
        GUICtrlSetData($iData, "Получается так, а надо вернуть первоначальное окно с кнопками управления")
        ConsoleWrite ( "Окно развернуто, значит восстанавливаю " & @CRLF )
        WinSetState($hWin, '', @SW_RESTORE)
		;Изменить стиль окна по умолчанию
        GUISetStyle ( $GUI_SS_DEFAULT_GUI )
        WinActivate($hWin)

    EndIf

    Return
EndFunc
 
Автор
Нубокодер

Нубокодер

Новичок
Сообщения
75
Репутация
0
А я все на свете перерыл) Спасибо. В побитовые операции и С# уже залез)) ;D

Но вот теперь все в окне постепенно смещается вверх. Особенно видно когда элементы снизу. Это совсем не хорошо( как этого избежать?
И очень странно, но шрифт не масштабируется. Т.е. элементы в полноэкранном режиме увеличиваются, а текст от GUICtrlCreateLabel - нет :( Хоть я и указано: Opt("GUIResizeMode", 1)

Код:
#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>

Opt("GUIResizeMode", 1) ; опция поведение элементов при изменение размеров (изменять все пропорционально)

$GUI1 = GUICreate("Полный экран и обратно", 888, 500, 100, 150)

$iData = GUICtrlCreateLabel("Теперь содержимое смещается вверх...", 50, 460, 450, -1)
$progressbar1 = GUICtrlCreateProgress(50, 480, 240, 10)

GUICtrlSetData ( $progressbar1,  10)

GUISetState() ; окна видимы:
Sleep (2000)

For $i = 2 to 10

    _FullClicked()
    Sleep (2000)
    GUICtrlSetData ( $progressbar1, $i*10 )

Next

Func _FullClicked() ; В максимальный экран и обратно:

    $hWin = WinGetHandle($GUI1); получаю дискриптер главного окна
    If Not $hWin Then Return ; если дискриптер НЕ получен - выйти с функции

    If WinGetState ( $hWin ) <> 47 Then ; если статус окна "НЕ развернуто на полный экран без строки"

        GUICtrlSetData($iData, "Устанавлен полноэкранный режим без кнопок")
        ConsoleWrite ( "Окно НЕ развернуто, значит разворачиваю " & @CRLF )
        _WinAPI_SetWindowLong($hWin, $GWL_STYLE, BitAND(_WinAPI_GetWindowLong($hWin, $GWL_STYLE), BitNOT($WS_CAPTION)))
        WinSetState($hWin, '', @SW_MAXIMIZE)
        WinActivate($hWin)

    Else

;~  ЗДЕСЬ НУЖНО ВЕРНУТЬ ВИД ОКНА В ПЕРВОНАЧАЛЬНОЕ СОСТОЯНИЕ (с верхней строкой, где есть кнопки свернуть и закрыть):
;~      _WinAPI_SetWindowLong($hWin, ????????????????????????????? )
        GUICtrlSetData($iData, "Возвращен первоначальный размер и с кнопками управления")
        ConsoleWrite ( "Окно развернуто, значит восстанавливаю " & @CRLF )
        WinSetState($hWin, '', @SW_RESTORE)
        GUISetStyle ( $GUI_SS_DEFAULT_GUI )
        WinActivate($hWin)

    EndIf

    Return
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
смотри функцию
Код:
GUICtrlSetResizing

шрифт и не должен изменяться
если работаешь со своим окном, то зачем получение дескриптора? он и так есть при создании
 
Автор
Нубокодер

Нубокодер

Новичок
Сообщения
75
Репутация
0
[Элементы GUI] Re: Как вернуть начальное состояние окна без искажения и смещения элементов?

Проблема в том что элементы не просто сдвигаются, их еще и плющит. Причем на разные величины в зависимости от координаты Y.
В таких условиях еще и текст нужно масштабировать и потом рисовать GDIPlus... :shok:

Может все таки подскажите как восстановить окно из полного размера без смещения - через функцию _WinAPI_SetWindowLong (...).
Или есть попроще решение для многократного перехода в полный экран (без заголовка) и обратно?

Буду рад, если покажете как вычислить точное искажение элементов и нивелировать его. Я че то приуныл):
Код:
#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1) ; включает режим OnEvent (по событию)
Opt("GUIResizeMode", 1) ; опция поведение элементов при изменение размеров (изменять все пропорционально)

$hWin = GUICreate("Полный экран и обратно", 888, 500, 100, 150)

$iData = GUICtrlCreateLabel("Теперь содержимое смещается вверх...", 50, 460, 450, -1)
$progressbar1 = GUICtrlCreateProgress(50, 480, 240, 10)
$progressbar2 = GUICtrlCreateProgress(50, 50, 240, 30)

GUICtrlSetData ( $progressbar1,  5)
GUICtrlSetData ( $progressbar2,  5)
$But = GUICtrlCreateButton("Кнопец1", _WinAPI_GetWindowWidth($hWin) - 66, 10, 48, 48)
$But2 = GUICtrlCreateButton("Кнопец2", _WinAPI_GetWindowWidth($hWin) - 66, _WinAPI_GetWindowHeight($hWin) - 300, 48, 48)

GUISetState() ; окна видимы:
Sleep (2000)

;~ обработка кнопки закрытия скрипта:
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEClicked")

For $i = 2 to 20

    _FullClicked()
    Sleep (2000)
    GUICtrlSetData ( $progressbar1, $i*5 )
    GUICtrlSetData ( $progressbar2, $i*5 )

Next

Func _FullClicked() ; В максимальный экран и обратно:


    If WinGetState ( $hWin ) <> 47 Then ; если статус окна "НЕ развернуто на полный экран без строки"

        GUICtrlSetData($iData, "Устанавлен полноэкранный режим без кнопок")
        ConsoleWrite ( "Окно НЕ развернуто, значит разворачиваю " & @CRLF )
        _WinAPI_SetWindowLong($hWin, $GWL_STYLE, BitAND(_WinAPI_GetWindowLong($hWin, $GWL_STYLE), BitNOT($WS_CAPTION)))
        WinSetState($hWin, '', @SW_MAXIMIZE)
        WinActivate($hWin)

    Else

;~  ЗДЕСЬ НУЖНО ВЕРНУТЬ ВИД ОКНА В ПЕРВОНАЧАЛЬНОЕ СОСТОЯНИЕ (с верхней строкой, где есть кнопки свернуть и закрыть):
;~      _WinAPI_SetWindowLong($hWin, ????????????????????????????? )
        GUICtrlSetData($iData, "Возвращен первоначальный размер и с кнопками управления")
        ConsoleWrite ( "Окно развернуто, значит восстанавливаю " & @CRLF )
        WinSetState($hWin, '', @SW_RESTORE)
        GUISetStyle ( $GUI_SS_DEFAULT_GUI )
        WinActivate($hWin)

    EndIf

    Return
EndFunc

Func _CLOSEClicked() ; функция (по стандартному событию) активации кнопки выхода
        $ext = MsgBox(4, "Exit", "Want to quit?") ; Выход, Хотите выйти?
        If $ext = 6 Then
            Opt("TrayIconHide", 1) ; скрываю иконку текущего скрипта при выходе
            Exit
        EndIf
    Return
EndFunc
 

iglezz

Новичок
Сообщения
3
Репутация
0
Чтобы контролы не плясали при изменении размеров GUI, надо использовать
Код:
GUICtrlSetResizing()
 
Верх