피로곰's 모두의 프린터

이번엔 각종 설정창 등을 만드는데 어찌보면 가장 유용하게 사용하는 체크박스(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 는 위와 같이 중첩해서 사용도 가능합니다.

이상입니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band