※ 이 문서는 뭐 그냥 하면 되지. ()에서 인쇄하였으며,
저작권은 해당 블로그 운영자에게 있습니다.

GUICoordMode, GUISetCoord - GUI 컨트롤의 위치 설정

/Autoit/AutoIt :: 2011. 2. 14. 13:00

GUICoordMode, GUISetCoord - GUI 컨트롤의 위치 설정

AutoIt에서 GUI를 그릴 때 처음에는 Koda Form Designer를 이용하지만 조금 익숙해지면 Koda Form Designer를 이용하는 게 오히려 더 불편합니다. 크기나 위치를 정확하게 맞추기도 어렵고 변수 이름도 따로 수정해줘야합니다. 그래서 나중에는 컨트롤을 만드는 함수를 직접 입력해서 그리게 되죠.

GUI 컨트롤을 만드는 함수 중는 많지만 입력상자을 만드는 함수를 예로 들어보죠. 기본형식은 아래와 같습니다.

GUICtrlCreateInput("텍스트", 가로 위치, 세로 위치, 너비, 높이)

여기서 가로 위치와 세로 위치를 지정하는 방법은 세 가지가 있습니다. 기본값이면서 가장 많이 사용하는 방법이 절대 위치를 적어주는 것이지요. 하지만, GUICoordMode를 수정하면 GUI 컨트롤의 위치를 다른 방법으로 결정할 수 있습니다. 아래는 GUICoordMode에 대한 도움말의 설명입니다. 일반적으로 사용하는 값은 1이죠.

GUICoordMode Alters the position of a control defined by GUICtrlSetPos.
1 = absolute coordinates (default) still relative to the dialog box.
0 = relative position to the start of the last control (upper left corner).
2 = cell positionining relative to current cell. A -1 for left or top parameter don't increment the start. So next line is -1,offset; next cell is offset,-1; current cell is -1,-1. Obviously "offset" cannot be -1 which reserved to indicate the no increment. But if you can use a multiple of the width you choose to skip or go back.

GUICoordMode가 1일 때

GUICoordMode가 1일 때

GUICoordMode가 1일 때 위 그림같은 GUI를 만드는 소스를 다음과 같습니다. GUICoordMode가 1일 때는 절대위치를 기준으로 한다고 했습니다. 이 때 절대위치는 GUI의 왼쪽 모서리 부분(0, 0)을 기준으로 합니다. 위 그림에서 A에 해당하는 지점입니다. 이 기준점은 바뀌지 않습니다.

Opt('MustDeclareVars', 1)
Opt('GUICoordMode', 1)

Global $Input1, $Input2, $Input3, $Input4, $Input5
Global $Button1, $Button2, $nMsg

Global $hGUI = GUICreate("Form1", 360, 300)
GUICtrlCreateLabel("이름", 40, 45, 50, 20)
$Input1 = GUICtrlCreateInput("김태연", 110, 45, 200, 20)
GUICtrlCreateLabel("출생", 40, 75, 50, 20)
$Input2 = GUICtrlCreateInput("1989년 3월 9일 (전라북도 전주)", 110, 75, 200, 20)
GUICtrlCreateLabel("직업", 40, 105, 50, 20)
$Input3 = GUICtrlCreateInput("가수", 110, 105, 200, 20)
GUICtrlCreateLabel("소속그룹", 40, 135, 50, 20)
$Input4 = GUICtrlCreateInput("소녀시대", 110, 135, 200, 20)
GUICtrlCreateLabel("학력", 40, 165, 50, 20)
$Input5 = GUICtrlCreateInput("전주예술고등학교 방송문화예술과 ", 110, 165, 200, 20)

$Button1 = GUICtrlCreateButton("Button1", 50, 220, 100, 40)
$Button2 = GUICtrlCreateButton("Button2", 200, 220, 100, 40)

GUISetState(@SW_SHOW)

GUICoordMode가 2일 때

GUICoordMode를 2로 바꾸면 소스가 어떻게 되는 지 살펴보겠습니다.

Opt('MustDeclareVars',1)
Opt('GUICoordMode', 2)

Global $nMsg, $hInput[6], $hBtn[3]
Global $aLabel[6] = [5, "이름", "출생", "직업", "소속그룹", "학력"]
Global $aInput[6] = [5, "김태연", "1989년 3월 9일 (전라북도 전주)", "가수", "소녀시대", "전주예술고등학교 방송문화예술과"]
  
Global $hGUI = GUICreate("Form1", 360, 300)
GUICtrlCreateLabel($aLabel[1], 40, 45, 50, 20)
$hInput[1] = GUICtrlCreateInput($aInput[1], 10, -1, 200)
  
For $i = 2 To UBound($hInput) -1
    GUICtrlCreateLabel($aLabel[$i], -260, 10, 50)
    $hInput[$i] = GUICtrlCreateInput($aInput[$i], 10, -1, 200)
Next
  
$hBtn[1] = GUICtrlCreateButton('Button1', -250, 35, 100, 40)
$hBtn[2] = GUICtrlCreateButton('Button2', 50, -1)

GUISetState(@SW_SHOW)
GUICoordMode가 2일 때

For 문도 들어있고, 배열도 들어있네요. For 문과 배열을 이용하면 GUI를 조금 더 편하게 만들 수 있다는 걸 보여주려고 넣은 거고요. GUICoordMode와 상관없는 거니까 그냥 넘어가셔도 됩니다.

GUICoordMode 설정을 2로 바꾸면 상대위치를 사용하게 되며 상대위치의 기준점은 마지막으로 만든 컨트롤의 오른쪽 아래 모서리(0,0)가 됩니다. 위 그림에서는 Button 2를 만드는 컨트롤에게 기준점은 Button 1의 오른쪽 아래인 d가 되는 거죠. 마찬가지로 "학력"이라고 써진 Label 5를 만드는 컨트롤에게 기준점은 "소녀시대"라고 써진 Input 4의 오른쪽 아래 모서리가 되는 겁니다.

단, -1은 마지막으로 만든 컨트롤의 가로 또는 세로 시작점을 나타냅니다. 그림에서 Button 2 컨트롤을 만들 때 GUICtrlCreateButton("Button2", -1, -1) 이라고 쓴다면 a를 기준으로 만들 게 됩니다. 실제로 이렇게 하면 Button1과 Button2가 겹치게 되죠. GUICtrlCreateButton("Button2", 0, -1) 에서 세로 위치가 -1이기 때문에 Button2의 세로위치 기준점은 Button 1의 세로 시작 위치가 되는 겁니다. 위 그림에서 c가 기준점이 되는 겁니다. 실제 버튼을 만들 때는 GUICtrlCreateButton("Button2", 50, -1)으로 만드니까 기준점 c에서 오른쪽으로만 50만큼 간 곳에 버튼을 만드는 겁니다. 약간 복잡할 수 있는데 이 내용을 꼭 이해하셔야 합니다. GUICoordMode 2에서 이 내용을 이해하지 못하면 절대로 사용할 수 없습니다. GUICoordMode에서 제일 중요한 내용입니다.

-1이 아닌 음수는 오른쪽 아래 모서리(d)에서 왼쪽(또는 위로)으로 해당 값만큼 이동한 지점을 말합니다. 위 예제 13번째 줄의 -260은 Label의 너비 50 + Input의 너비 200 + 두 컨트롤 사이의 간격 10을 더해서 나온 값으로 기준점(0,0)에서 왼쪽으로 260만큼 간 곳이라는 뜻입니다.

GUISetCoord로 기준점 만들기

이렇게 하다 보면 기준점이 계속 바뀌게 돼서 불편할 때가 있습니다. 그럴 때는 GUISetCoord라는 함수를 쓰면 됩니다. GUISetCoord는 이전의 기준점 설정을 모두 지우고 새로운 기준점을 지정할 수 있습니다. 컨트롤의 크기가 유동적이거나 계산하기가 복잡할 때 쓰면 좋습니다.

위 소스에서는 Label1과 Input1은 For 문 바깥에 쓸 수밖에 없습니다. 다른 컨트롤과 기준점의 거리가 다르기 때문에요. 하지만 GUISetCoord를 이용하면 기준점을 마음대로 지정할 수 있어서 아래럼 모두 For 문안에 넣을 수 있죠.

또는 Button을 만들 때 특정한 지점을 지정할 수도 있습니다.

Opt('MustDeclareVars',1)
Opt('GUICoordMode', 2)
  
Global $nMsg, $hInput[6], $hBtn[3]
Global $aLabel[6] = [5, "이름", "출생", "직업", "소속그룹", "학력"]
Global $aInput[6] = [5, "김태연", "1989년 3월 9일 (전라북도 전주)", "가수", "소녀시대", "전주예술고등학교 방송문화예술과"]
  
Global $hGUI = GUICreate("Form1", 360, 300)
GUISetCoord(40 + 260, 35)
For $i = 1 To UBound($hInput) -1
    GUICtrlCreateLabel($aLabel[$i], -260, 10, 50)
    $hInput[$i] = GUICtrlCreateInput($aInput[$i], 10, -1, 200)
Next
  
GUISetCoord(50, 220)
$hBtn[1] = GUICtrlCreateButton('Button1', -1, -1, 100, 40)
$hBtn[2] = GUICtrlCreateButton('Button2', 50, -1)

GUISetState(@SW_SHOW)

GUICoordMode 0과 GUICoordMode 2의 장점

GUICoordMode 0은 2에서 설명했던 (-1, -1)과 비슷합니다. 무조건 이전 컨트롤의 시작점을 기준으로 합니다. 실제 써보면 불편해서 거의 쓰이지 않게 되더라고요.

GUICoordMode를 2로 사용하면 컨트롤을 추가하게 될 때 상당히 유용합니다. GUICoordMode 1일 때 "출생"과 "직업" 사이에 새로운 컨트롤을 만들려고 하면 그 아래에 있는 Label과 Input, Button까지 모두 위치를 수정해줘야 합니다. 하지만, GUICoordMode 2에서는 "출생"과 "직업" 사이에 그냥 새로운 컨트롤 생성 함수를 넣어주기만 하면 됩니다.

GUICoordMode를 2로 지정하면 컨트롤의 크기도 기억합니다. 앞에서 만든 컨트롤의 크기가 100x40 이었고 같은 크기의 컨트롤을 만들다고 한다면 위치만 지정하면 되죠. 16번째 줄에서 Button 2의 크기를 지정하지 않으니까 Button1의 크기와 똑같이 만들었습니다. 컨트롤의 종류가 서로 달라도 상관없습니다.

앞서 얘기한 것처럼 GUICoordMode 2가 이해하기 어려울 수 있습니다. 이해하기 어려운데 굳이 사용할 필요는 없겠지요. 하지만, GUI 컨트롤을 만드는 새로운 방법이 있다는 건 알아두세요.

관련글

SciTe4Autoit3 속 유틸리티 1 - Koda Form Designer

블로그의 글과 그림, 첨부파일의 복제, 재배포를 금지합니다. =>  자세히 보기
티스토리 초대장 필요하신 분은 댓글남겨주세요.
give start - 굿네이버스 - 사랑의 열매 - 아름다운재단 - 어린이재단 - 유니세프
굿네이버스 배너
사랑의 열매 배너
아름다운 재단 배너 어린이 재단 배너 유니세프 한국위원회 - 배너