맥스스크립트 심화

RolloutCreator Functions(2)

스크립팅하는애님 2021. 4. 6. 20:09
728x90
반응형

안녕하세요.

애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.

이전 시간에 이어서 동적 UI를 계속 이야기하겠습니다.

오늘은 동적 UI를 만들 수 있는 'RolloutCreator Functions'의 문법에 대해서 설명하겠습니다.

 

rolloutCreator <rollout_name> <rollout_caption>

rolloutCreator의 인스턴스를 만들고 그것을 변수에 할당할 수 있습니다.

 사용방법은 다음과 같습니다.

 

1
rci = rolloutCreator "myRollout" "My Rollout"
cs

 

위 내용을 입력하여 실행을 하면 아래와 같은 결과를 보여줍니다.

 

 

rci 변수에 생성된 rollout인스턴스 값을 저장합니다. (딱히 뭔가 작동하지는 않습니다.)

 

<rollout_creator>.begin()

위에서 저장된 값을 이용하여 사용됩니다.

인스턴스를 생성한 바로 다음에 사용합니다.

 

<rollout_creator>.addControl <control_type> <control_name> <control_caption> [ paramStr:<string>]

롤아웃에 컨트롤을 추가합니다.

 

<control_type> : #button, #spinner, #activeXControl 등 과 같은 롤아웃 컨트롤을 사용합니다.

<control_name> : 롤아웃 컨트롤의 참조에 사용되는 변수 명을 적습니다.

<control_caption> : 화면상에 표시될 캡션을 적습니다.

[paramStr:] : 컨트롤에 전달해야 하는 모든 키워드 파라미터를 문자열로 표시합니다. 예) "width:100 height:20 align:#right"

 

예를 들면 다음과 같이 작성이 됩니다.

 

1
rci.addControl #button #myButton "My Button"
cs

 

설명을 하자면 변수에 저장된 생성한 롤아웃 인스턴스에 버튼 컨트롤을 추가하고 그 버튼의 변수는 myButton로 정하며 화면에 표시되는 캡션은 "My Button"이 됩니다.

아직 스크립트를 다 작성한 것이 아니기 때문에 지금 실행하면 에러가 납니다.

 

<rollout_creator>.addHandler <control_name> <event_type> [paramStr:<string>] [codeStr:<string>] [filter:<boolean>]

추가된 컨트롤에 사용되는 이벤트 핸들러를 추가합니다.

<control_name> : 컨트롤 작성 중에 사용된 변수

<event_type> : 컨트롤에서 사용 가능한 이벤트 예) #changed, #pressed, #selected 등

[paramStr:<string>] : 맥스 헬프 사이트에서는 정확한 설명이 없네요.

저는 아래의 codeStr 부분에서 사용자 함수를 사용할 때 인수가 필요한 경우 인수 변수를 문자열로 표기하여 사용합니다.

[codeStr:<string>] : 명령어나 사용자 함수를 문자열 형태로 사용합니다.

만약 하위에 또 문자열을 사용해야 할 경우 " 대신 @를 사용합니다.

[filter:<boolean>] : 이 부분은 저도 잘 모르겠습니다. 저는 기본적으로 on을 사용합니다.

 

말이 많이 복잡해 보이는 예를 두 가지 보겠습니다.

 

1
rci.addHandler #myButton #pressed codeStr: "MessageBox @Hey@" filter:on
cs

 

첫 번째 예는 이전에 만든 #myButton을 눌렀을 때(#pressed) 발생하는 핸들러로 MessageBox를 사용하여 "Hey"라는 문자를 표시합니다.

기존에 배운 방식대로라면

 

1
2
3
4
on myButton pressed do
(
    MessageBox "Hey"
)
cs

 

와 동일합니다.

 

다음으로

 

1
rci.addHandler #myCheckbox #changed paramStr:"val" codeStr:"myOtherCheckbox.state = not val"
cs

 

는 이전에 만든 #myCheckbox를 변경했을 때 인수 변수 val값을 기억하여 myOtherCheckbox의 상태에 val의 반대 값을 전달합니다.

기존에 배운 방식대로라면

 

1
2
3
4
on myCheckbox changed val do 
(
    myOtherCheckbox.state = not val
)
cs

 

와 동일합니다.

 

<rollout_creator>.end()

'<rollout_creator>.begin()'으로 열었기 때문에 닫아 줍니다.

필요한 컨트롤러와 이벤트 핸들러가 모두 작성됐다면, 모두 작성했다는 의미로 사용합니다.

함수는 롤 문자열을 만들고 평가하고 그 정의를 반환합니다. 

반환된 정의는 createDialog 또는 addRollout 함수에 전달할 수 있습니다.(약간 뜬 구름 잡는 소리 같기는 한데 createDialog 또는 addRollout함수에서 이용된다는 의미입니다.)

 

지금까지 배운 내용을 모아 보겠습니다.

 

1
2
3
4
5
rci = rolloutCreator "myRollout" "My Rollout"
rci.begin()
rci.addControl #button #myButton "My Button"
rci.addHandler #myButton #pressed filter:on codeStr:"MessageBox @Isn't this cool@ title:@Wow@"
createDialog (rci.end())
cs

 #이나 @가 사용된다는 것 외에는 딱히 어려운 부분은 없어 보여 설명은 따로 하지 않겠습니다.

실행해 보시면 어떤 원리로 동작하는지 아실 수 있을 겁니다.

 

오늘은 여기까지 진행하고 이전 시간에 해결하지 못했던 문제를 다음 시간에 해결하도록 하겠습니다.

728x90
반응형