프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

74. GuiControl 객체의 사용


지난 강에선 GuiControl 객체의 OnEvent() 메서드를 이용해서 이벤트에 콜백 함수를 등록하는 과정을 배웠습니다.

당연히 GuiControl.OnEvent() 말고도 컨트롤에 사용할 수 있는 메서드가 더 있고, 속성도 있습니다. 이번 강에선 컨트롤 객체가 가지고 있는 속성과 메서드를 배워보겠습니다.

GuiControl 객체의 속성

먼저 속성부터 알아봅시다.

속성설명
ClassNN해당 컨트롤의 ClassNN
Enabled해당 컨트롤의 상호작용 상태 (True 혹은 False 중 하나)
Text해당 컨트롤의 내용
Value해당 컨트롤의 값

대표적으로 자주 쓰이는 속성 4가지만 가져왔습니다. ClassNN은 고윳값이므로 당연히 값을 재설정할 순 없고, 현재 컨트롤에 할당된 ClassNN을 가져올 수만 있습니다.

Text와 Value 속성의 역할이 헷갈릴 수 있는데, 쉽게 말씀드려서 컨트롤에 쓰인 글씨(Button의 글씨나 CheckBox 옆의 글씨)는 Text 속성의 역할이고, 글씨가 아니라 다른 형태로 표현되는 것(Slider의 값, CheckBox의 상태)은 Value 속성을 사용하면 됩니다.

예를 들어서 Picture 컨트롤의 이미지를 바꾸고 싶다면, Picture 컨트롤은 글씨 그대로 표현되는 것이 아니라 적어준 경로의 이미지를 표현하는 것이므로 Value 속성을 건드려야 할 것입니다. 또 CheckBox의 체크 여부 역시 글씨 그대로 0 혹은 1로 표현되지 않고 체크 표시(v)로 표현되므로 Value 속성을 이용합니다.

반면, 체크 박스 옆에 설명문(Caption이라고 합니다.)을 바꾸고 싶다면 Value 속성이 아닌 Text 속성을 바꿔야겠죠. 적어준 글씨 그대로 컨트롤에 나타나니까요.

Tip: Edit 컨트롤의 텍스트는 Value? Text?

둘 모두 거의 동일한 값을 갖고 있지만, Edit.Text는 줄 끝 변환을 수행하지 않고 Edit.Value는 줄 끝 변환을 적절하게 수행합니다.

만약 캐리지 리턴(`r, \r)과 라인 피드(`n, \n)에 대해서 알지 못하거나 들어보지 않았다면 그냥 아무거나 쓰시면 됩니다.

GuiControl 객체의 메서드

메서드 역시 쉽습니다. 역시 자주 쓰이는 몇 개만 알아보도록 합시다.

메서드매개변수역할
Add()Item컨트롤에 항목을 추가합니다.
Choose()Value컨트롤의 특정 항목을 선택합니다.
Delete()[Value]컨트롤의 특정 항목을 제거합니다.
OnEvent()EventName, Callback [, AddRemove]이벤트에 따른 콜백 함수 등록
Opt()Options컨트롤의 옵션을 추가하거나 제거합니다.

Add(), Choose(), Delete()는 그 설명에서 볼 수 있듯 여러 항목을 가진 컨트롤(ListBox, DropDownList 등)에 사용합니다. 참고로 List 계열 컨트롤에 항목을 추가할 땐 항목이 담긴 배열을 지정해주어야 합니다. 즉, Add()를 쓸 땐 [Item1]과 같이 적어주어야 합니다. 당연히 여러 값을 추가할 수 있게 하기 위해서인데, 예를 들어 [Item1, Item2, Item3]라는 배열을 전달해주면 세 항목이 추가됩니다.

OnEvent()는 저번 강에서 배웠고, Opt()는 컨트롤을 처음 만들 때 설정해주었던 옵션과 동일합니다. MyControl.Opt("+Disabled -VScroll")등과 같이 적어주면 되겠죠.

실습

1. 입력 상자에 글씨를 쓸 때마다 똑같이 다른 입력 상자에 복제 하기

아래 동영상과 같은 프로그램을 구현하는 것입니다.

비디오 1. '예제 1'의 목표
1Main := Gui(, "73강 연습")
2EditSender := Main.Add("Edit", "x20 y20 w200")
3EditReceiver := Main.Add("Edit", "x20 y50 w200")
4Main.Show("w240 h90")
5EditSender.OnEvent("Change", EditSender_OnChange)
6return
7
8EditSender_OnChange(obj, info)
9{
10    EditReceiver.Text := obj.Text
11}
예제 1. 입력 상자의 텍스트 복제

간단합니다. 저번 강에서 배운 Change 이벤트를 이용하여, EditSender 객체의 값이 바뀔 때(즉, 입력 상자의 텍스트가 변할 때) 콜백 함수를 실행합니다. 그리고 콜백 함수에선 EditSender의 내용을 EditReceiver의 내용에 대입해주었죠. 여기서 EditReceiver는 함수 외부에 있는 전역 변수이지만, 객체의 경우엔 기본적으로 함수 밖의 객체여도 값을 수정하기 위해 global 키워드를 사용할 필요가 없습니다. 이에 관한 상세한 내용은 mutable과 immutable 개념을 알아야 하기 때문에 생략합니다만, "전역 객체는 global 키워드를 쓸 필요가 없다"라고만 알아두시면 되겠습니다.

2. 슬라이더의 값 수치로 표현하기

아래 동영상과 같은 프로그램을 구현하는 것입니다.

비디오 2. '예제 2'의 목표
1Main := Gui(, "73강 연습")
2SliderSender := Main.Add("Slider", "x20 y20 w200")
3EditReceiver := Main.Add("Edit", "x20 y60 w200")
4Main.Show("w240 h90")
5SliderSender.OnEvent("Change", SliderSender_OnChange)
6return
7
8SliderSender_OnChange(obj, info)
9{
10    EditReceiver.Text := obj.Value
11}
예제 2. 슬라이더의 수치 보이기

토대는 예제 1과 동일합니다. 다만 슬라이더의 위치값은 Value 속성에 담기기 때문에, 이를 Edit.Text 속성에 넣어주기만 하면 됩니다. 쉽죠?

미션을 하나 드리겠습니다. 위의 예제 2의 코드를 기반으로 'Edit의 수치를 조정하면 그 수치만큼 Slider가 움직이게'하는 기능도 추가해보세요. 즉, Slider를 움직이면 Edit의 수치가 변하고, Edit의 수치를 바꾸면 Slider의 커서 위치가 변해야 합니다.

질문하러 가기