Что нового

Сделать "прижимающийся" интерфейс

Suppir

Продвинутый
Сообщения
967
Репутация
62
Решил создать в другой теме, так как здесь совсем другая задача.

Вот примерная форма приложения:

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1_1 = GUICreate("NSR-авто, v. 1.0", 222, 730, 269, 84)
GUISetFont(10, 400, 0, "Arial")
$Combo1 = GUICtrlCreateCombo("", 5, 35, 210, 25)
$Label1 = GUICtrlCreateLabel("Выберите орган власти", 10, 10, 143, 20)
$Input1 = GUICtrlCreateInput("", 5, 90, 151, 24)
$Button1 = GUICtrlCreateButton("<", 163, 90, 25, 24, 0)
$Button2 = GUICtrlCreateButton(">", 190, 90, 25, 24, 0)
$Input2 = GUICtrlCreateInput("", 5, 140, 211, 24)
$Input3 = GUICtrlCreateInput("", 5, 195, 211, 24)
$Edit1 = GUICtrlCreateEdit("", 5, 250, 210, 89)
$Edit2 = GUICtrlCreateEdit("", 5, 365, 210, 109)
$Input4 = GUICtrlCreateInput("", 5, 500, 211, 24)
$Input5 = GUICtrlCreateInput("", 5, 555, 211, 24)
$Label2 = GUICtrlCreateLabel("Установите номер топика", 10, 70, 155, 20)
$Label3 = GUICtrlCreateLabel("Дата документа (ALT+1)", 10, 120, 149, 20)
$Label4 = GUICtrlCreateLabel("Номер документа (ALT+2)", 10, 175, 160, 20)
$Label5 = GUICtrlCreateLabel("Название документа (ALT+3)", 10, 230, 178, 20)
$Label6 = GUICtrlCreateLabel("Текст документа (ALT+q)", 10, 345, 153, 20)
$Label7 = GUICtrlCreateLabel("Левая подпись (ALT+w)", 10, 480, 147, 20)
$Label8 = GUICtrlCreateLabel("Правая подпись (ALT+e)", 10, 535, 152, 20)
$Checkbox2 = GUICtrlCreateCheckbox("поверх всех окон", 5, 655, 132, 21)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button3 = GUICtrlCreateButton("Создать NSR", 140, 680, 75, 45, $BS_MULTILINE)
$Button4 = GUICtrlCreateButton("изм", 180, 5, 35, 25, 0)
$Button6 = GUICtrlCreateButton("Очистить формы", 5, 680, 75, 45, $BS_MULTILINE)
$Button5 = GUICtrlCreateButton("ini", 85, 680, 50, 45, 0)
$Checkbox1 = GUICtrlCreateCheckbox("показать результат в блокноте", 5, 614, 212, 14)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button7 = GUICtrlCreateButton("i", 190, 655, 20, 20, 0)
$Checkbox3 = GUICtrlCreateCheckbox("выполнить автозамены", 5, 634, 162, 19)
GUICtrlSetState(-1, $GUI_CHECKED)
$Checkbox4 = GUICtrlCreateCheckbox("определить структуру блоков", 5, 590, 207, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd



Необходимо вместо кнопочки "свернуть" (которая находится рядом с кнопочками закрыть и развернуть) сделать кнопку со значком "<". При нажатии на эту кнопку вся наша форма должна прижаться вплотную к левой стороне экрана.

Вместо кнопочки "развернуть" нужно сделать кнопку ">", которая прижмет весь интерфейс приложения к правой стороне экрана. При этом должно учитываться, что разрешение экрана может быть любым (минимум 1024 * 768)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Лучше всего создать окно в стиле WS_POPUP и уже самому строить эту панельку, со всеми нужными кнопками
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Я так поступил.
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 245, 91, 192, 114)
$Button1 = GUICtrlCreateButton("<", 24, 24, 81, 33)
$Button2 = GUICtrlCreateButton(">", 136, 24, 81, 33)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button1
			$size = WinGetPos("Form1")
			WinMove("Form1", "", 0, $size[1])
		Case $Button2
			$size = WinGetPos("Form1")
			WinMove("Form1", "", @DesktopHeight, $size[1])			
	EndSwitch
WEnd

Да, точно, есть зазорчик.
Пока не знаю как.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yuriy
Прикольно. Только нужно, чтобы высота сохранялась (сейчас GUI летит в верх экрана).
По ширине: сейчас влево прижимается нормально, а вправо - остается зазор в несколько миллиметров.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Suppir
Внес чуток изменений.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yuriy

Попробовал на домашнем компе. У меня там стоит монитор 24" с разрешением 1920 * 1080.
Влево подравнивается нормально, но вправо - остается зазор не 3 мм, а 15 сантиметров !
Т.е. GUI очень далеко не доходит до конца экрана на широкоформатных мониторах.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
а у меня скрипт Yuriy ваще ниче не двигает.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Сделать \"прижимающийся\" интерфейс

Suppir [?]
GUI очень далеко не доходит до конца экрана на широкоформатных мониторах.
а так :
Код:
; .........
      Case $Button1
            $size = WinGetPos("Form1")
            WinMove("Form1", "", 0,$size[1])
        Case $Button2
            $size = WinGetPos("Form1")
            WinMove("Form1", "", @DesktopWidth-$size[2],$size[1])




Добавлено:
Сообщение автоматически объединено:

В примере от Yuriy похоже ширина попутана с высотой
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Код:
$hGui = GUICreate("PosGuiEx", 245, 91)
$Button1 = GUICtrlCreateButton("<", 24, 24, 81, 33)
$Button2 = GUICtrlCreateButton(">", 136, 24, 81, 33)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit

		Case $Button1
			$aPos = _ReturnPosGuiEx($hGui)
			WinMove($hGui, "", 0 + $aPos[4], $aPos[1])
		Case $Button2
			$aPos = _ReturnPosGuiEx($hGui)
			WinMove($hGui, "", @DesktopWidth - ($aPos[2] + $aPos[4]), $aPos[1])
	EndSwitch
WEnd

Func _ReturnPosGuiEx($hWnd)

	$aWinPos = WinGetPos($hWnd)
	$aWinClientSize = WinGetClientSize($hWnd)
	$iBorder_Size = ($aWinPos[2] - $aWinClientSize[0]) / 2
	$iCaption_Size = ($aWinPos[3] - $aWinClientSize[1]) - $iBorder_Size

	Local $Pos[6] = [$aWinPos[0], $aWinPos[1], $aWinPos[2], $aWinPos[3], $iBorder_Size, $iCaption_Size]
	Return $Pos

EndFunc   ;==>__ReturnPosGuiEx
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
А зачем нужна хитрая функция _ReturnPosGuiEx()?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
FlatX007
Если в скрипт добавить CASE от gregaz то всё отлично работает.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вот вариант с использованием POPUP окна :
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $iWidth=350,$iHeight=200,$iX=(@DesktopWidth-$iWidth)/2,$iY=(@DesktopHeight-$iHeight)/2
$hGUI = GUICreate("Test", $iWidth, $iHeight,$iX,$iY,$WS_SYSMENU)

$hChild_GUI = GUICreate("", 40, 20, 265, -27, $WS_POPUP, $WS_EX_MDICHILD, $hGUI)
$hBt1 = GUICtrlCreateButton("<", 0, 0, 20, 18)
$hBt2 = GUICtrlCreateButton(">", 20, 0, 20, '')

GUISetState(@SW_SHOW, $hChild_GUI)
GUISetState(@SW_SHOW, $hGUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		Case $hBt1
            WinMove($hGUI, "", 0,$iY)
		Case $hBt2   
            WinMove($hGUI, "", @DesktopWidth-$iWidth,$iY) 
	EndSwitch
WEnd


Здесь для простоты не учитывались размеры рамки окна
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Yashied сказал(а):
А зачем нужна хитрая функция _ReturnPosGuiEx()?

Возвращает размер бордера окна и заголовка. Незнаю я подумал, что будет эстетичнее если бордер не будет скрыт за краем "диспелея". По крайней мере так у меня на WIN7 с включённым Aero.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
gregaz [?]
Да, вот только вместо "Form1" в скрипте нужно использовать $Form1_1, а также в первом Case не нужно получать координаты окна:

Код:
Case $Button1
			WinMove($Form1_1, "", 0, Default)
		Case $Button2
			$aWinPos = WinGetPos($Form1_1)
			WinMove($Form1_1, "", @DesktopWidth - $aWinPos[2], Default)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
а также в первом Case не нужно получать координаты окна:
Поскольку размер окна не меняется , то вообще получать координаты окна нет необходимости
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
gregaz [?]
Поскольку размер окна не меняется , то вообще получать координаты окна нет необходимости
Есть, т.к те размеры что задаются при создании GUI, это размеры клиентской части.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Получился вот такой вариант формы от Suppir (с учетом рамки):
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
;...........................
$iWidth=222
$Form1_1 = GUICreate("NSR-авто, v. 1.0", $iWidth, 730, 269, 84,$WS_SYSMENU+$WS_CAPTION)
GUISetFont(10, 400, 0, "Arial")

$aPos = WinGetPos($Form1_1)

$iBord=($aPos[2]-$iWidth)/2

$hChild_GUI = GUICreate("", 60, 18,$iWidth-100,-27, $WS_POPUP, $WS_EX_MDICHILD, $Form1_1)
$hBt1 = GUICtrlCreateButton("<", 0, 0, 30, 18)
$hBt2 = GUICtrlCreateButton(">", 30, 0, '', '')

GUISetState(@SW_SHOW, $hChild_GUI)
GUISetState(@SW_SHOW, $Form1_1)

;.......................

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		Case $hBt1
			WinMove($Form1_1, "", $iBord, Default)
		Case $hBt2   
			WinMove($Form1_1, "", @DesktopWidth-($aPos[2]+2*$iBord), Default) 
	EndSwitch
WEnd

Правда малопонятно почему мне пришлось учитывать рамку,ведь $aPos[2] - это не клиентская часть
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Размер рамки.

Код:
_WinAPI_GetSystemMetrics($SM_CXFRAME)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
gregaz

Все равно есть зазор и кнопки не на месте стоят:

 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
У меня такой код вышел.
Проверял на дома на разрешениях от 600х800 по 1680х1050
Вроде работает.
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 277, 69, 192, 124)
$Button1 = GUICtrlCreateButton("<<<", 16, 16, 97, 33)
$Button2 = GUICtrlCreateButton(">>>", 160, 16, 97, 33)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	
			Case $Button1
			$size = WinGetPos("Form1") 
			WinMove("Form1", "", 0, $size[1]) 
		Case $Button2			
			$size = WinGetPos("Form1") 
			$kl_size = WinGetClientSize( "Form1")			
			WinMove("Form1", "", @DesktopWidth - $kl_size[0], $size[1]) 
	EndSwitch
WEnd
 
Верх