피로곰'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