Что нового

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

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
Репутация
281
Я так поступил.
Код:
#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
Репутация
281
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 711
А зачем нужна хитрая функция _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 470
Репутация
2 401
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 470
Репутация
2 401
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 711
Размер рамки.

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

Suppir

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

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

 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
281
У меня такой код вышел.
Проверял на дома на разрешениях от 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
 
Верх