이번엔 각종 설정창 등을 만드는데 어찌보면 가장 유용하게 사용하는 체크박스(Checkbox)에 대해서 다뤄보도록 하겠습니다.
func (m *WinResMgr) CheckBox(text string, checked bool, attachFunc func()) *walk.CheckBox
CheckBox 메소드를 사용하시면 되구요.
text string 인자는 체크박스 옆의 라벨 텍스트를 지정하는거고
checked bool 은 초기 기본 체크 상태입니다. true 면 생성시 체크가 된 상태로, false 이면 생성시 체크가 안된 상태로 생성됩니다.
attachFunc func() 인자는 체크박스의 체크 상대가 변경될 시에 호출되는 이벤트 핸들러 함수를 지정하면 됩니다.
func checkBoxTest1() {
mgr, _ := NewWindowMgrNoResize("체크박스 테스트1", 640, 200, GetIcon())
mgr.CheckBox("checked false 체크박스", false, func() {})
mgr.CheckBox("checked true 체크박스", true, func() {})
mgr.StartForeground()
}
위 코드를 보시면 첫번째 인자에 따라서 체크 박스 옆의 라벨 텍스트가 표시되고 두번째 인자 값이 true 냐 false 냐에 따라서 기본 체크 상태가 다르게 생성이 됩니다.
func checkBoxTest2() {
mgr, _ := NewWindowMgrNoResize("체크박스 테스트2", 640, 200, GetIcon())
var check1 *walk.CheckBox
check1 = mgr.CheckBox("체크박스 테스트", false, func() {
if check1.Checked() {
MsgBox("체크됨")
} else {
MsgBox("해제됨")
}
})
mgr.StartForeground()
}
마지막 인자에 대한 처리를 해봤습니다. Walk Wrap 의 CheckBox메소드는 walk.CheckBox 를 리턴합니다 이를 받아서 내장된 여러 메소드를 통해 이짓 저짓이 가능합니다. 예를들어 Checked() 의 경우 해당 체크박스가 현재 체크된 상태인지 아닌지를 true, false 로 반환해주는 역할을 합니다.
에디트 박스에서 SetText, Text 메소드로 값을 설정하고 가져오듯이 체크박스도 SetChecked 메소드로 체크 상태를 변경가능하고 Checked 메소드로 현재 상태를 얻을 수 있습니다. ( lxn walk의 대부분의 메소드들 명칭은 비슷한 구조를 가집니다.)
한가지 주의점은 .. walk 의 이벤트 핸들링은 고루틴을 발생시키는 구조로 동작 합니다. 한마디로 위 예제 같이 확인 버튼을 누르기 전까지 Block 되는 함수를 사용하는 경우 이 메시지 창이 떠 있는것과 달리 중복해서 이벤트는 수신이 가능합니다.
MsgBox 말고 fmt.Println 같은걸 쓰시거나 ..
func checkBoxTest3() {
mgr, window := NewWindowMgrNoResize("체크박스 테스트2", 640, 200, GetIcon())
var check1 *walk.CheckBox
check1 = mgr.CheckBox("체크박스 테스트", false, func() {
if check1.Checked() {
MsgBox("체크됨", window)
} else {
MsgBox("해제됨", window)
}
})
mgr.StartForeground()
}
MsgBox의 두번째 인자에 NewWindowMgrNoResize 함수의 리턴값중 walk.MainWindow 객체를 넣어주시면 메시지 박스를 호출한 부모창에 종속되어 동작 함으로 부모창 까지 다 Block 된 상태가 됨으로 이벤트의 중복수신을 방지할 순 있습니다. 둘의 차이는 직접 해보시면 아실 수 있을거라 생각 되구요 ..
아직 정확히 왜 그런지 이유를 알 수 없는;; ( 자세히 파보면 원인은 나오겠지만;; 그게 나온다 해도 ;; 직접 lxn/walk 수정해서 배포하는건 매우 귀찮은 관계로 ㅎㅎ )
여튼 이 체크박스가 가진 문제가 하나 있는데요.
func checkBoxTest4() {
mgr, _ := NewWindowMgrNoResize("체크박스 테스트4", 640, 200, GetIcon())
mgr.HSplit()
mgr.CheckBox("checked false 체크박스", false, func() {})
mgr.CheckBox("checked true 체크박스", true, func() {})
mgr.EndSplit()
mgr.StartForeground()
}
이렇게 코드가 작성된 경우에 한 줄에 2개의 체크박스가 표시되야 합니다만..
이렇게 표시가 안됩니다 ;;;
func checkBoxTest4() {
mgr, _ := NewWindowMgrNoResize("체크박스 테스트4", 640, 200, GetIcon())
mgr.HSplit()
mgr.CheckBox("checked false 체크박스", false, func() {})
mgr.CheckBox("checked true 체크박스", true, func() {})
mgr.PushButton("테스트", func() {})
mgr.EndSplit()
mgr.StartForeground()
}
이렇게 버튼이라도 하나 끼워 넣으면
표시가 됩니다만 ;; .. Splitter 의 버그인지 레이아웃 구조의 버그인진 모르겠으나;; 여튼 .. 이런 관계로 .. 한줄에 체크박스를 여러게 두고 싶으시면 ..
func checkBoxTest5() {
mgr, _ := NewWindowMgrNoResize("체크박스 테스트5", 640, 200, GetIcon())
mgr.GroupBox("체크박스", false)
mgr.CheckBox("checked false 체크박스", false, func() {})
mgr.CheckBox("checked true 체크박스", true, func() {})
mgr.EndGroupBox()
mgr.StartForeground()
}
GroupBox 를 활용하시기 바랍니다.
func checkBoxTest5() {
mgr, _ := NewWindowMgrNoResize("체크박스 테스트5", 640, 200, GetIcon())
mgr.HSplit()
mgr.Label("GroupBox 안의 VSplit")
mgr.PushButton("VSpilit 버튼", func() {})
mgr.GroupBox("체크박스", false)
mgr.CheckBox("checked false 체크박스", false, func() {})
mgr.CheckBox("checked true 체크박스", true, func() {})
mgr.EndGroupBox()
mgr.EndSplit()
mgr.StartForeground()
}
GroupBox 와 VSplit, HSplit 는 위와 같이 중첩해서 사용도 가능합니다.
이상입니다.