Что нового

Помогите составить код для выдвигающегося окна

mef-t

Осваивающий
Сообщения
306
Репутация
30
Доброго времени суток.

Есть желание сделать плавно выдвигающееся окно настроек, т.е. кликаем по особо выделенной части экрана и от туда выезжает окно настроек. Вносим изменения, кликаем на соответствующую кнопочку, и окно уезжает обратно.

Во вложении попытался изобразить, как это должно выглядеть.

Просьба подсказать, как это реализовать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Как то так:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$iGUI_Width = 300
$iGUI_Height = 200
$iSttngs_Bttn_Width = 18
$iSttngs_Bttn_Height = Floor($iGUI_Height / 2.5)
$iSttngs_Bttn_Left = $iGUI_Width - $iSttngs_Bttn_Width + 1
$iSttngs_Bttn_Top = ($iGUI_Height / 2) - ($iSttngs_Bttn_Height / 2) - 5

$hGUI = GUICreate("Test Script", $iGUI_Width, $iGUI_Height)
$iSttngs_Bttn = GUICtrlCreateButton("", $iSttngs_Bttn_Left, $iSttngs_Bttn_Top, $iSttngs_Bttn_Width, $iSttngs_Bttn_Height)
GUICtrlSetColor(-1, 0)
GUISetState(@SW_SHOW, $hGUI)

;Settings GUI
$hSttngs_GUI = GUICreate('Settings', $iGUI_Width - 40, $iGUI_Height - 40, -1, -1, $WS_POPUPWINDOW, -1, $hGUI)
$iApply_Bttn = GUICtrlCreateButton('Apply', 0, $iGUI_Height - 60, 70, 20)
$iCancel_Bttn = GUICtrlCreateButton('Cancel', 80, $iGUI_Height - 60, 70, 20)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iSttngs_Bttn
			$aGUI_Pos = WinGetPos($hGUI)
			
			WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + $iGUI_Width - 1, $aGUI_Pos[1] + 40)
			GUICtrlSetPos($iSttngs_Bttn, $iSttngs_Bttn_Left - 4)
			
			GUISetState(@SW_DISABLE, $hGUI)
			GUISetState(@SW_SHOW, $hSttngs_GUI)
			GUICtrlSetState($iSttngs_Bttn, $GUI_DISABLE)
			
			For $i = 1 To ($iGUI_Width - 40) Step 6
				WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + $iGUI_Width - $i, $aGUI_Pos[1] + 40, $i)
				GUICtrlSetPos($iSttngs_Bttn, $iSttngs_Bttn_Left - 3 - $i)
				Sleep(10)
			Next
		Case $iApply_Bttn
			;Apply setting here
			MsgBox(64, 'Info', 'Settings saved!', 0, $hSttngs_GUI)
			
			ContinueCase
		Case $iCancel_Bttn
			For $i = ($iGUI_Width - 40) To 1 Step -6
				WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + $iGUI_Width - $i, $aGUI_Pos[1] + 40, $i)
				GUICtrlSetPos($iSttngs_Bttn, $iSttngs_Bttn_Left - 3 - $i)
				Sleep(10)
			Next
			
			GUISetState(@SW_ENABLE, $hGUI)
			GUISetState(@SW_HIDE, $hSttngs_GUI)
			GUICtrlSetState($iSttngs_Bttn, $GUI_ENABLE)
			GUICtrlSetPos($iSttngs_Bttn, $iSttngs_Bttn_Left - 3)
	EndSwitch
WEnd
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
CreatoR , как-то не того...

Код:
ERROR: GUICtrlSetPos() [built-in] called with wrong number of args.
GUICtrlSetPos($iSttngs_Bttn, $iSttngs_Bttn_Left - 4)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Вариант попроще
Код:
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

Global $open = False, $pixel = 20, $delay = 10

$gui = GUICreate("test", 800, 600)
GUISetState()
$pan = GUICreate("", 10, 400, 789, 100, BitOR($WS_POPUP, $WS_BORDER), $WS_EX_MDICHILD, $gui)
GUISetState()
$lbl = GUICtrlCreateLabel("", 0, 0, 10, 400, $SS_BLACKFRAME)
GUICtrlSetResizing($lbl, 256)

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $lbl
      $pos = WinGetPos($pan)
      For $i = 0 To 30
        If $open Then
          WinMove($pan, "", $pos[0] + $i * $pixel, $pos[1], $pos[2] - $i * $pixel, $pos[3])
        Else
          WinMove($pan, "", $pos[0] - $i * $pixel, $pos[1], $pos[2] + $i * $pixel, $pos[3])
        EndIf
        Sleep($delay)
      Next
      $open = Not $open
  EndSwitch
Until 0
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
InnI,
так а как же в этом выдвинувшемся окне кнопку нарисовать??
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
C2H5OH [?]
как же в этом выдвинувшемся окне кнопку нарисовать??
Да... что-то я погорячился с "попроще" :smile:
Код:
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiConstantsEx.au3>

Global $open = False, $pixel = 20, $delay = 10
Global $btn = -1, $chbox = -1

$gui = GUICreate("test", 800, 600)
GUISetState()
$pan = GUICreate("", 10, 400, 789, 100, BitOR($WS_POPUP, $WS_BORDER), $WS_EX_MDICHILD, $gui)
$lbl = GUICtrlCreateLabel("", 0, 0, 10, 400, $SS_BLACKFRAME)
GUICtrlSetResizing($lbl, 256)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $lbl
      ; удаление элементов
      If $open Then
        GUICtrlDelete($btn)
        GUICtrlDelete($chbox)
      EndIf
      ; изменение размеров панели
      $pos = WinGetPos($pan)
      For $i = 0 To 30
        If $open Then
          WinMove($pan, "", $pos[0] + $i * $pixel, $pos[1], $pos[2] - $i * $pixel, $pos[3])
        Else
          WinMove($pan, "", $pos[0] - $i * $pixel, $pos[1], $pos[2] + $i * $pixel, $pos[3])
        EndIf
        Sleep($delay)
      Next
      $open = Not $open
      ; создание элементов
      If $open Then
        $btn = GUICtrlCreateButton("Button", 20, 10)
        GUICtrlSetState($btn, $GUI_SHOW)
        $chbox = GUICtrlCreateCheckbox("Checkbox", 20, 50)
        GUICtrlSetState($chbox, $GUI_SHOW)
      EndIf
    ; обработка элементов
    Case $btn
      MsgBox(0, "", "Button")
    Case $chbox
      MsgBox(0, "", "CheckBox")
  EndSwitch
Until 0
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$iGUI_Width = 300
$iGUI_Height = 200
$iSttngs_Bttn_Width = 18
$iSttngs_Bttn_Height = Floor($iGUI_Height / 2.5)
$iSttngs_Bttn_Top = ($iGUI_Height / 2) - ($iSttngs_Bttn_Height / 2) - 20

$hMain_GUI = GUICreate('Sliding Settings Demo!', $iGUI_Width, $iGUI_Height)
GUISetState(@SW_SHOW, $hMain_GUI)

;Settings GUI
$hSttngs_GUI = GUICreate('Settings', $iGUI_Width - 40, $iGUI_Height - 30, -1, -1, $WS_POPUP, $WS_EX_MDICHILD, $hMain_GUI)
$iSttngs_Bttn = GUICtrlCreateButton('…', -2, $iSttngs_Bttn_Top, $iSttngs_Bttn_Width, $iSttngs_Bttn_Height)
GUICtrlSetFont(-1, 8.3, 0, 0, 'Wingdings 3')
GUICtrlSetTip(-1, 'Expand Settings')

$iSttngs_First_ID = GUICtrlCreateDummy() + 1

GUICtrlCreateCheckbox('Option 1', 70, 20)
GUICtrlCreateCheckbox('Option 2', 70, 40)
GUICtrlCreateCheckbox('Option 3', 70, 60)
GUICtrlCreateInput('Input', 70, 90)

$iSave_Bttn = GUICtrlCreateButton('Save', 20, $iGUI_Height - 60, 70, 20)
GUICtrlSetState(-1, $GUI_HIDE)

$iSttngs_Last_ID = GUICtrlCreateDummy() - 1

_SttngsCtrls_Set_State($GUI_HIDE)
$aGUI_Pos = WinGetPos($hMain_GUI)
WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + $iGUI_Width - 15, $aGUI_Pos[1] + 40, $iSttngs_Bttn_Width)
GUISetState(@SW_SHOW, $hSttngs_GUI)
WinActivate($hMain_GUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iSave_Bttn
			;Apply setting here
			
			
			GUISetState(@SW_DISABLE, $hMain_GUI)
			MsgBox(64, 'Info', 'Settings saved!', 0, $hSttngs_GUI)
			GUISetState(@SW_ENABLE, $hMain_GUI)
			
			ContinueCase
		Case $iSttngs_Bttn
			$aGUI_Pos = WinGetPos($hMain_GUI)
			
			;Hide
			If GUICtrlRead($iSttngs_Bttn) = '†' Then
				For $i = ($iGUI_Width - 30) To 1 Step -30
					WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + $iGUI_Width - $i, $aGUI_Pos[1] + 40, $i+4)
					Sleep(15)
				Next
				
				GUISetStyle($WS_POPUP, -1, $hSttngs_GUI)
				WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + $iGUI_Width - 15, $aGUI_Pos[1] + 40, $iSttngs_Bttn_Width)
				
				GUICtrlSetData($iSttngs_Bttn, '…')
				GUICtrlSetTip($iSttngs_Bttn, 'Expand Settings')
				
				_SttngsCtrls_Set_State($GUI_HIDE)
			;Show
			Else
				_SttngsCtrls_Set_State($GUI_SHOW)
				GUISetStyle($WS_POPUPWINDOW, -1, $hSttngs_GUI)
				
				For $i = 1 To ($iGUI_Width - 30) Step 30
					WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + $iGUI_Width - $i, $aGUI_Pos[1] + 40, $i+4)
					Sleep(15)
				Next
				
				WinMove($hSttngs_GUI, '', $aGUI_Pos[0] + 30, $aGUI_Pos[1] + 40, $iGUI_Width - 26)
				
				GUICtrlSetData($iSttngs_Bttn, '†')
				GUICtrlSetTip($iSttngs_Bttn, 'Collapse Settings')
			EndIf
			
			WinActivate($hMain_GUI)
	EndSwitch
WEnd

Func _SttngsCtrls_Set_State($iState)
	For $iID = $iSttngs_First_ID To $iSttngs_Last_ID
		GUICtrlSetState($iID, $iState)
	Next
EndFunc


правда не удалось избавиться от мерцания (с боку) при открытии :scratch:.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Ещё вариант
Код:
#include <WindowsConstants.au3>

Global $step = 20, $delay = 10

; главное окно
$gui = GUICreate("test", 800, 600)
GUISetState()

; окно панели
; (если сначала создать фоновое окно, то оно накроет панель)
$panel = GUICreate("", 600, 400, 790, 100, BitOR($WS_CHILD, $WS_BORDER), -1, $gui)
$label = GUICtrlCreateLabel("", 0, 0, 10, 400)
GUICtrlSetBkColor($label, 0xFFFFFF)
$button = GUICtrlCreateButton("Button", 20, 10)
$checkbox = GUICtrlCreateCheckbox("Checkbox", 20, 50)
GUISetState()

; фоновое окно с контролами
; (если создавать контролы в главном окне, то они вылезают поверх панели)
$bkg = GUICreate("", 800, 600, 0, 0, $WS_CHILD, -1, $gui)
GUICtrlCreateButton("Main Button", 150, 200, 100, 100)
GUICtrlCreateEdit("Main Text", 150, 350, 200, 200)
GUISetState()

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $label
      $pos = ControlGetPos($panel, "", $label)
      $pos[0] -= 1
      $pos[1] -= 1
      For $i = 1 To 29
        WinMove($panel, "", $pos[0] - $i * $step, $pos[1])
        Sleep($delay)
      Next
      $step *= -1
    Case $button
      MsgBox(0, "", "Button", 0, $gui)
    Case $checkbox
      MsgBox(0, "", "CheckBox", 0, $gui)
  EndSwitch
Until 0
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот и победитель :smile: единственный код, в котором окно не мерцает при движении.
p/s/ Вот и + к ГУРУ
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Неплохо.
Тогда вот гибрид моего предыдущего с этим:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$iGUI_Width = 600
$iGUI_Height = 400

$bSttngsSlider_MouseJump = True
$iSttngsSlider_Delay = 10

;Main GUI
$hMain_GUI = GUICreate('Sliding Settings Demo!', $iGUI_Width, $iGUI_Height)
GUISetState(@SW_SHOW, $hMain_GUI)

;Settings GUI
$hSttngs_GUI = GUICreate('Settings', $iGUI_Width - 40, $iGUI_Height - 30, $iGUI_Width - 15, 15, BitOR($WS_CHILD, $WS_BORDER), -1, $hMain_GUI)
$iSttngs_Bttn = GUICtrlCreateButton('…', -2, ($iGUI_Height / 2) - 60, 18, 80)
GUICtrlSetFont(-1, 8.3, 0, 0, 'Wingdings 3')
GUICtrlSetTip(-1, 'Expand Settings')
$iSttngsSlider_MouseJump_CB = GUICtrlCreateCheckbox('Mouse Jump', 70, 20)
GUICtrlSetState(-1, Int($bSttngsSlider_MouseJump))
GUICtrlCreateCheckbox('Option 1', 70, 40)
GUICtrlCreateCheckbox('Option 2', 70, 60)
GUICtrlCreateCheckbox('Option 3', 70, 80)
GUICtrlCreateInput('Input', 70, 110)
$iSave_Bttn = GUICtrlCreateButton('Save', 20, $iGUI_Height - 60, 70, 20)
GUISetState(@SW_SHOW, $hSttngs_GUI)

;Controls Holder GUI
$hCtrls_GUI = GUICreate('Sliding Settings Demo!', $iGUI_Width, $iGUI_Height, 0, 0, $WS_CHILD, -1, $hMain_GUI)
GUICtrlCreateButton('Some Button', 20, $iGUI_Height - 30, 100, 20)
GUISetState(@SW_SHOW, $hCtrls_GUI)

While 1
	$iMsg = GUIGetMsg()
	
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iSave_Bttn
			;Apply setting here
			
			$bSttngsSlider_MouseJump = (GUICtrlRead($iSttngsSlider_MouseJump_CB) = $GUI_CHECKED)
			
			MsgBox(64, 'Info', 'Settings saved!', 0, $hSttngs_GUI)
			
			ContinueCase
		Case $iSttngs_Bttn
			;Show
			If GUICtrlRead($iSttngs_Bttn) = '†' Then
				Local $iFrom = ($iGUI_Width - 40), $iTo = 15, $iStep = -30
				Local $sArrow_Text = '…', $sTip_Text = 'Expand Settings'
			Else ;Hide
				Local $iFrom = 15, $iTo = ($iGUI_Width - 40), $iStep = 30
				Local $sArrow_Text = '†', $sTip_Text = 'Collapse Settings'
			EndIf
			
			For $i = $iFrom To $iTo Step $iStep
				WinMove($hSttngs_GUI, '', $iGUI_Width - $i + 5, 15)
				Sleep($iSttngsSlider_Delay)
			Next
			
			GUICtrlSetData($iSttngs_Bttn, $sArrow_Text)
			GUICtrlSetTip($iSttngs_Bttn, $sTip_Text)
			
			If $iMsg = $iSttngs_Bttn And $bSttngsSlider_MouseJump Then
				Opt('MouseCoordMode', 0)
				$aMPos = MouseGetPos()
				$aCPos = ControlGetPos($hSttngs_GUI, '', $iSttngs_Bttn)
				MouseMove($aCPos[0] + ($aCPos[2] / 2), $aMPos[1], 0)
			EndIf
	EndSwitch
WEnd


:smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да, с тремя GUI ловко придумано.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Пора бы уже версию AutoIt обновить

CreatoR :smile:
Я второй раз вряд ли смогу совершить подвиг - уговорить админов установить мне на работе левый софт.
А если обновить версию только дома, то у меня на работе и дома будут не совпадать версии AutoIt. Тоже головняк.
Та что "шо маємо, то маємо".
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
На эту тему есть UDF:
http://www.autoitscript.com/forum/topic/145149-guiextender-new-version-19-oct-12/
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
OffTopic:
...


madmasles,
Я эту тему читал.
У меня на рабочем компе доступ к Program Files (где установлен AutoIt) только на чтение.
Всякие специфичные библиотеки я просто подкидываю в тот каталог где у меня скрипты. А обновить те что шли вместе с инсталляцией AutoIt не могу. :(

Сурово, да...
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
OffTopic:
C2H5OH
У меня на рабочем компе доступ к Program Files (где установлен AutoIt) только на чтение.
Установить в тот каталог где скрипты. Можно вообще на флешке носить. Главное чтобы буква диска не изменилась, а то в реестр то прописывает реальные пути для конт. меню.
 
Верх