본문 바로가기

AUTOHOTKEY/레퍼런스

GUI 입력 폼 등에 사용할 수 있다GUI(을)를 작성/조작한다

GUI

입력 폼 등에 사용할 수 있다GUI(을)를 작성/조작한다

아래와 같은 서브 커멘드가 있다.
설명의 양이 많기 때문에 항을 나눈다.

GUI, Add, ControlType [, Options, Text]
윈도우에 컨트롤을 추가한다
추가할 수 있는 컨트롤에는 이하의 것이 있다.
Text, Edit, UpDown, Hotkey, Picture, GroupBox, Button, Checkbox, Radio, DropDownList, ComboBox, ListBox, ListView, Slider, Progress, DateTime, MonthCal, Tab
GUI, Tab [, Item, ControlNo]
탭 콘트롤이 있을 때, 향후 배치하는 컨트롤을 어느 탭 시트에 배치하는지를 변경
GUI,ListView,ListViewName
리스트뷰 조작계 함수로 대상이 되는 리스트뷰를 변경한다.
GUI, Menu [, MenuName]
윈도우에 도구모음을 추가/삭제한다
GUI, Color [, WindowColor, ControlColor]
윈도우 및 컨트롤의 배경색을 설정한다
GUI, Font [, Options, FontName]
이 이후에 추가되는 컨트롤의 폰트를 변경한다
GUI, Margin [,X, Y]
컨트롤 위치의 자동 결정시에 시작될 수 있는 마진을 설정
GUI, Show [, Options, Title]
윈도우를 표시/표시 상태의 변경
GUI, Hide
윈도우를 비표시로 한다
GUI, Maximize
윈도우를 최대화한다
GUI, Minimize
윈도우를 최소화한다
GUI, Restore
윈도우를 바탕으로 되돌린다
GUI, Flash [,Off]
윈도우의 타이틀 바와 태스크바의 색을 반전시킨다.이것을 이용해 타이틀 바를 점멸시킬 수 있다.
GUI, Submit [, NoHide]
컨트롤 상태나 내용을 지정된 변수에 반영시킨다
GUI, Cancel
변수에 내용을 반영시키지 않고 , 윈도우를 비표시로 한다
GUI, Destroy
윈도우를 완전하게 파기해, 메모리나 system resource를 개방한다
GUI, +/-Option
윈도우의 옵션을 추가/삭제한다
GUI, Default
디폴트의 윈도우를 변경한다

Remarks

윈도우의 생성

윈도우는Add그리고 최초로 컨트롤이 배치될 때 만들어진다.
윈도우의 클래스명(은)는 「AutoHotkeyGUI」.
Gui,Show그리고 타이틀을 지정해 표시하기 전의 타이틀은, 스크립트의 파일명 부분.

복수 윈도우

스크립트는 최대로99의 윈도우를 가질 수 있다.
각 윈도우에는 최대11000개의 컨트롤을 배치할 수 있다.
디폴트 이외의 윈도우를 조작하려면 , 서브 커멘드의 전에 「2:」(와)과 같이 윈도우 번호와 코론을 추가한다.

Gui, 2:Add, Text,, Text for about box.
Gui, 2:Show

기본적으로 디폴트의 윈도우 번호는 「1」이지만,2번째 이후의 윈도우상의GUI조작 이벤트(컨트롤의 조작시나 도구모음의 아이템 등)그리고 실행된 스렛드에서는, 그 윈도우가 디폴트 윈도우가 된다.
디폴트 윈도우는, Gui,2:Default(와)과 같이 해 변경할 수 있다.

Font서브 커멘드로의 폰트의 설정은, 윈도우 마다 보관 유지된다.

특수 써브루틴 라벨

GuiEscape,GuiClose등이 특별한 이름의 써브루틴 라벨하지만 존재하면, 윈도우에 대해서 특정의 조작을 했을 때 그 써브루틴이 실행되게 된다.
현재 준비되어 있는 특수 써브루틴에는 이하의 것이 있다.

2번째 이후의 윈도우의 이벤트는, 「2GuiEscape」(와)과 같이 전에 숫자를 추가한 이름의 라벨로 정의한다.

GuiEscape
Escape키를 눌렀을 때에 실행된다.
라벨이 존재하지 않는 경우,Escape키를 눌러도 아무것도 일어나지 않는다.
GuiClose
윈도우를 닫으려고 했을 때에 실행된다.
라벨이 존재하지 않는 경우, 윈도우는 단지 비표시가 된다(Gui,Cancel(와)과 같은 동작)
GuiSize
윈도우가 리사이즈, 최소화, 최대화, 복원되었을 때에 실행된다.
A_GuiWidth, A_GuiHeight변수에 클라이언트 영역의 새로운 폭과 높이가 격납된다.
또, A_EventInfo변수와 ErrorLevel변수에 이하의 값이 격납된다.
0
리사이즈 또는 최대화·최소화로부터의 복원
1
최소화
2
최대화
GuiDropFiles
파일이나 폴더가 드러그&드롭 되었을 때에 실행된다.
이 이벤트의 스렛드가 실행되고 있는 동안은, 드러그&드롭은 무시된다.
A_GuiEvent변수와 A_GuiControlEvent변수에는 드롭 된 파일의 파일명이 개행 단락으로 격납된다.
A_GuiControl변수에는 드롭처의 컨트롤에 관련지을 수 있었던 변수명인가, 그것이 없으면 컨트롤의 텍스트가 격납된다.컨트롤에 드롭 되었으므로 없으면, 비운다.
A_EventInfo변수와 ErrorLevel변수에는, 드롭 된 파일의 수가 격납된다.
GuiX(와)과 GuiY변수에는, 드롭을 한 좌표가 윈도우의 좌상으로부터의 상대 좌표로 격납된다.
Gui,-E0x00000010」(으)로 확장 스타일WS_EX_ACCEPTFILES(을)를 해제하면, 일시적으로 드러그&드롭 접수를 무효로 할 수 있다.
Gui,+E0x00000010」(으)로 다시 유효하게 할 수 있다.
GuiContextMenu
윈도우의 타이틀 바와 도구모음을 제외한 클라이언트 부분을 오른쪽 클릭했을 때에 실행된다.Apps키나Shift+F10(을)를 눌렀을 때에도 실행된다.
이 써브루틴은, 벌써 스렛드가 실행중에서도 새롭게 실행 개시된다.
A_GuiEvent변수에는, 오른쪽 클릭에 의한 이벤트 발생이라면 「RightClick」(이)가, 키 조작에 의한 발생이라면 「Normal」(이)가 격납된다.
A_GuiControl변수에는 클릭된 컨트롤에 관련지을 수 있었던 변수명인가, 그것이 없으면 컨트롤의 텍스트가 격납된다.컨트롤이 클릭되었으므로 없으면, 비운다.
A_EventInfo변수에는, 리스트 박스나 리스트뷰의 포커스를 가지는 행 번호가 격납된다.(다만, 오른쪽 클릭에서는 포커스는 이동하지 않는다)1행목은 「1」(이)가 된다.리스트 박스나 리스트뷰가 아니면 「0」(이)가 된다.
GuiX(와)과 GuiY변수에는, 이벤트가 발생했을 때의 마우스 커서의 좌표가 윈도우의 좌상으로부터의 상대 좌표로 격납된다.키 조작에 의해서 기동되었을 때에도 똑같이 격납된다.

아래와 같이 써브루틴의 전에 복수의 라벨을 쓰면, 복수의 이벤트에 하나의 동작을 할당할 수 있다.

GuiEscape:
GuiClose:
ButtonCancel:
Gui, Cancel ; All of the above labels will execute this subroutine.
return 

GUI커멘드의 테스트를 할 때는, 아래와 같은 할당이 추천.
보통으로 윈도우를 닫은 것 만으로는 스크립트가 종료하지 않기 때문에, 윈도우를 닫았을 때에 스크립트가 종료하도록(듯이) 해 준다.

GuiClose:
ExitApp

Button컨트롤의 디폴트 써브루틴 라벨

Button컨트롤에서는, 「G」옵션으로 써브루틴을 지정하지 않아도, 자동적으로 디폴트의 라벨을 할당할 수 있다.
예를 들어,Text인수가 「Text」의 버튼에서는, 「ButtonText」라고 하는 라벨에 할당할 수 있다.(해당하는 라벨이 존재하면)
다만,Text인수에 반각 스페이스나 「&」, 개행 문자등이 포함되는 경우, 그러한 문자를 제외한 문자열이 사용된다.

2번째 이후의 윈도우의 버튼에 대해서는, 「2ButtonText」(와)과 같은 최초로 윈도우 번호를 매긴 이름의 라벨에 할당할 수 있다.

GUI,Add,Button,,Exit

ButtonExit:
ExitApp

Tab네비게이션

작성한 윈도우는, 일반적인 윈도우와 같이Tab키로 포커스를 다른 컨트롤로 이동할 수 있다.
이동하는 순서는, 컨트롤이 윈도우에 추가된 차례.
윈도우가 표시될 때는, 최초의NoTab옵션을 지정되어 있지 않은 포커스도 비치는 컨트롤에 포커스가 세트 된다.

액세스 키

일부의 컨트롤은, 텍스트에 「&A」(와)과 같이&+영숫자를 넣는 것으로, 액세스 키를 설정할 수 있다.
액세스 키는 「A」(와)과 같이 언더라인 첨부의 문자로 표시되어Alt+문자 키로 그 컨트롤을 클릭했을 때의 동작을 한다.
Text(이)나GroupBox그럼, 다음에 추가한 컨트롤에 포커스가 옮긴다.
복수의 컨트롤에 같은 액세스 키를 할당할 수 있고 있는 경우, 액세스 키를 누를 때 마다 다음의 해당하는 컨트롤에 포커스가 이동한다.

「&&」라고 쓰는 것으로, 텍스트중에 「&」(을)를 표시할 수 있다.

자동 레이아웃

컨트롤을 추가할 때,X/Y옵션으로 좌표를 지정하지 않았던 경우, 컨트롤의 위치는 자동적으로 결정된다.
최초로 추가되는 컨트롤은, 윈도우의 좌상에 배치되어 2번째 이후의 컨트롤은, 직전의 컨트롤의 아래 쪽에 다른 컨트롤과 겹치지 않게 배치된다.
X/Y 중 다른 한쪽만 지정했을 경우, 또 하나의 좌표만이 자동적으로 결정된다.

컨트롤의 사이즈도, 컨트롤의 종류나 텍스트의 내용등에 의해서 자동적으로 결정된다.

자동 레이아웃시에는, 다른 컨트롤로부터 일정한 간격을 열어서 배치된다.
디폴트에서는, 상하의 간격은 선택되고 있는 폰트의 높이의1.25배, 좌우의 간격은0.75배가 된다.
마진의 폭은, Gui,Margin」(으)로 변경할 수 있다.
Gui,Show」(으)로 윈도우가 최초로 표시될 때도, 폭이나 높이가 지정되지 않는 이상 이 마진을 고려해 사이즈가 결정된다.

윈도우의 아이콘

윈도우의 아이콘에는, 윈도우가 작성될 때 task tray 아이콘으로 하고 사용되고 있던 아이콘이 사용된다.
task tray 아이콘은 「 Menu, Tray, Icon」(으)로 설정할 수 있다.

이벤트 호출시의LastFoundWindow

윈도우 컨트롤의 조작에 의해서 신규 스렛드로 써브루틴이 불려 갈 때 , LastFoundWindow(으)로서 컨트롤을 가지는 윈도우가 기억된다.
이것에 의해, 각종 윈도우 조작 커멘드로 해당 윈도우를 조작하고 싶을 때, 윈도우의 지정을 생략 할 수 있다.

상주

GUI커멘드를 포함하고 있는 스크립트는, 상주 상태한편 #SingleInstance(복수 실행 불가)(이)가 된다.

컨트롤의 조작

작성했다GUI위의 컨트롤을 조작하려면 , GuiControl, GuiControlGet커멘드를 사용한다.


Related

GuiControl, GuiControlGet, Menu, Control, ControlGet, SplashImage, MsgBox, FileSelectFile, FileSelectFolder


Example(s)

Example #1: Simple input-box

Gui, add, text,, First name:
Gui, add, text,, Last name:
Gui, add, edit, vFirstName ym  ; The ym option starts a new column of controls.
Gui, add, edit, vLastName
Gui, add, button, default, OK  ; The label ButtonOK (if it exists) will be run when the button is pressed.
Gui, show,, Simple Input Example
return  ; End of auto-execute section. The script is idle until the user does something.

GuiClose:
ButtonOK:
Gui, submit  ; Save the input from the user to each control's associated variable.
MsgBox You entered "%FirstName% %LastName%".
ExitApp

Example #2: Tab control

Gui, add, tab,, First Tab|Second Tab|Third Tab
Gui, add, checkbox, vMyCheckbox, Sample checkbox
Gui, tab, 2
Gui, add, radio, vMyRadio, Sample radio1
Gui, add, radio,, Sample radio2
Gui, tab, 3
Gui, add, edit, vMyEdit r5  ; r5 means 5 rows tall.
Gui, tab  ; i.e. subsequently-added controls will not belong to the tab control.
Gui, add, button, default xm, OK  ; xm puts it at the bottom left corner.
Gui, show
return

ButtonOK:
GuiClose:
GuiEscape:
Gui, submit
MsgBox You entered:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp

Example #3: ListBox containing files in a directory

Gui, Add, Text,, Pick a file to launch from the list below.`nTo cancel, press ESCAPE or close this window.
Gui, Add, ListBox, vMyListBox gMyListBox w640 r10
Gui, Add, Button, Default, OK
Loop, C:\*.*  ; Change this folder and wildcard pattern to suit your preferences.
{
	GuiControl,, MyListBox, %A_LoopFileFullPath%
}
Gui, Show
return

MyListBox:
if A_GuiControlEvent <> DoubleClick
	return
; Otherwise, the user double-clicked a list item, so treat that the same as pressing OK.
; So fall through to the next label.
ButtonOK:
GuiControlGet, MyListBox  ; Retrieve the ListBox's current selection.
MsgBox, 4,, Would you you like to launch the file or document below?`n`n%MyListBox%
IfMsgBox, No
	return
; Otherwise, try to launch it:
Run, %MyListBox%,, UseErrorLevel
if ErrorLevel = ERROR
	MsgBox Could not launch the specified file.  Perhaps it is not associated with anything.
return

GuiClose:
GuiEscape:
ExitApp

Example #4: On-screen display (OSD)

CustomColor = EEAA99  ; Can be any RGB color (it will be made transparent below).
Gui, Color, %CustomColor%
Gui, Font, s24
Gui, Add, Text, vMyText cLime, XXXXX YYYYY  ; XX & YY serve to auto-size the window.
Gui, +AlwaysOnTop +LastFound   ; Make it always-on-top and make it the last found window.
; Make all pixels of this color transparent and make the text itself translucent (150):
WinSet, TransColor, %CustomColor% 150
Gui, -Caption  ; Remove the borders. Due to a quirk in Windows, this must be done after transparency.
SetTimer, UpdateOSD, 500
Gosub, UpdateOSD  ; Make the first update immediate rather than waiting for the timer.
Gui, Show, x0 y400
return

UpdateOSD:
MouseGetPos, MouseX, MouseY
GuiControl,, MyText, X%MouseX%, Y%MouseY%
return

Example #5: Simple image viewer.

Gui, +Resize
Gui, Add, Button, default, &Load New Image
Gui, Add, Radio, ym+5 x+10 vRadio checked, Load &actual size
Gui, Add, Radio, ym+5 x+10, Load to &fit screen
Gui, Add, Pic, xm vPic
Gui, Show
return

ButtonLoadNewImage:
FileSelectFile, file,,, Select an image:, Images (*.gif; *.jpg; *.bmp; *.png; *.tif; *.ico; *.cur; *.ani; *.exe; *.dll)
if file =
	return
Gui, Submit, NoHide ; Save the values of the radio buttons.
if Radio = 1  ; Display image at its actual size.
{
	width = 0
	height = 0
}
else ; Second radio is selected: Resize the image to fit the screen.
{
	width = %A_ScreenWidth%
	Width -= 28  ; Allow room for borders and margins inside.
	Height = -1 ; Keep aspect ratio seems best.
}
GuiControl,, Pic, *w%width% *h%height% %file%
Gui, Show, xCenter y0 AutoSize, %file%  ; Resize the window to match the picture size.
return

GuiClose:
ExitApp

Example #6: Simple text editor with menu bar.

; Create the sub-menus for the menu bar:
Menu, FileMenu, Add, &New, FileNew
Menu, FileMenu, Add, &Open, FileOpen
Menu, FileMenu, Add, &Save, FileSave
Menu, FileMenu, Add, Save &As, FileSaveAs
Menu, FileMenu, Add  ; Separator line.
Menu, FileMenu, Add, E&xit, FileExit
Menu, HelpMenu, Add, &About, HelpAbout

; Create the menu bar by attaching the sub-menus to it:
Menu, MyMenuBar, Add, &File, :FileMenu
Menu, MyMenuBar, Add, &Help, :HelpMenu

; Attach the menu bar to the window:
Gui, Menu, MyMenuBar

; Create the main Edit control and display the window:
Gui, +Resize  ; Make the window resizable.
Gui, Add, Edit, vMainEdit W600 R20
Gui, Show,, Untitled
CurrentFileName =  ; Indicate that there is no current file.
return

FileNew:
GuiControl,, MainEdit   ; Clear the Edit control.
return

FileOpen:
FileSelectFile, SelectedFileName, 3,, Open File, Text Documents (*.txt)
if SelectedFileName =  ; No file selected.
	return
Gosub FileRead
return

FileRead:  ; Caller has set the variable SelectedFileName for us.
FileRead, MainEdit, %SelectedFileName%  ; Read the file's contents into the variable.
if ErrorLevel <> 0
{
	MsgBox Could not open "%SelectedFileName%".
	return
}
GuiControl,, MainEdit, %MainEdit%  ; Put the text into the control.
CurrentFileName = %SelectedFileName%
Gui, Show,, %CurrentFileName%   ; Show file name in title bar.
return

FileSave:
if CurrentFileName =   ; No filename selected yet, so do Save-As instead.
	Goto FileSaveAs
Gosub SaveCurrentFile
return

FileSaveAs:
FileSelectFile, SelectedFileName, S16,, Save File, Text Documents (*.txt)
if SelectedFileName =  ; No file selected.
	return
CurrentFileName = %SelectedFileName%
Gosub SaveCurrentFile
return

SaveCurrentFile:  ; Caller has ensured that CurrentFileName is not blank.
IfExist %CurrentFileName%
{
	FileDelete %CurrentFileName%
	if ErrorLevel <> 0
	{	
		MsgBox The attempt to overwrite "%CurrentFileName%" failed.
		return
	}
}
GuiControlGet, MainEdit  ; Retrieve the contents of the Edit control.
FileAppend, %MainEdit%, %CurrentFileName%  ; Save the contents to the file.
; Upon success, Show file name in title bar (in case we were called by FileSaveAs):
Gui, Show,, %CurrentFileName%
return

HelpAbout:
MsgBox A very simple text editor.
return

GuiDropFiles:  ; Support drag & drop.
Loop, parse, A_GuiControlEvent, `n
{
	SelectedFileName = %A_LoopField%  ; Get the first file only (in case there's more than one).
	break
}
Gosub FileRead
return

GuiSize:
if ErrorLevel = 1  ; The window has been minimized.  No action needed.
	return
; Otherwise, the window has been resized or maximized. Resize the Edit control to match.
NewWidth := A_GuiWidth - 20
NewHeight := A_GuiHeight - 20
GuiControl, Move, MainEdit, W%NewWidth% H%NewHeight%
return

FileExit:     ; User chose "Exit" from the File menu.
GuiClose:  ; User closed the window.
ExitApp

Example: Achieve an effect similar to SplashTextOn.

Gui, +AlwaysOnTop +Disabled -SysMenu
Gui, Add, Text,, Some text to display.
Gui, Show, NoActivate, My Window  ; NoActivate avoids deactivating the currently active window.