모두의 프린터는 어떠한 경우에도 회원가입, 카드결제를 요구하지 않습니다.

Go로 MS 윈도 네이티브 GUI 프로그램 만들기 #5

이번에는 각 UI구성 요소들에 대한 부분을 진행 해보도록 합시다.

대충 일반적으로 말하는 라벨(Label, Static Text), 에디트박스, 체크박스, 리스트박스, 이미지컨트롤, 콤보박스 이딴 것들에 대해 논해보도록 합니다. 이러한 놈들은 얼찌 배치 할지는 이전 시간에 다뤘으니까 이전글들 참고 하시고요, 그런 부분들은 직접 해보시면 충분할 거구요.. 그정도 코드도 직접 안짜보고 이해할꺼면 개발자 때려 쳐야죠.. 어디 ㅋㅋ 그런 정신 머리로 개발자 나부랭이를 해보겠다고 크앙!

우선 가장 많이 쓰이는 놈중 하나인 라벨을 먼저 갑시다.

Go
/**
*	MultiLineLabel
**/
func (m *WinResMgr) MultiLineLabel(text string) *walk.Label {
	ne, _ := walk.NewLabelWithStyle(m.GetParent(), win.SS_EDITCONTROL) //|win.SS_CENTER)
	ne.SetText(text)
	ne.SetAlignment(walk.AlignHCenterVCenter)
	ne.SetTextAlignment(walk.AlignCenter)

	m.addObj(ne)
	return ne
}

/**
*	Label
**/
func (m *WinResMgr) Label(text string) *walk.Label {
	ne, _ := walk.NewLabel(m.GetParent())
	ne.SetText(text)
	ne.SetTextAlignment(walk.AlignDefault)

	m.addObj(ne)
	return ne
}

/**
* LabelCenter
**/
func (m *WinResMgr) LabelCenter(text string) *walk.Label {
	ne, _ := walk.NewLabel(m.GetParent())
	ne.SetText(text)
	ne.SetTextAlignment(walk.AlignCenter)

	m.addObj(ne)
	return ne
}

/**
* LabelRight
**/
func (m *WinResMgr) LabelRight(text string) *walk.Label {
	ne, _ := walk.NewLabel(m.GetParent())
	ne.SetText(text)
	ne.SetTextAlignment(walk.AlignFar)

	m.addObj(ne)
	return ne
}

/**
* LabelLeft
**/
func (m *WinResMgr) LabelLeft(text string) *walk.Label {
	ne, _ := walk.NewLabel(m.GetParent())
	ne.SetText(text)
	ne.SetTextAlignment(walk.AlignNear)

	m.addObj(ne)
	return ne
}

라벨은 Visual Studio 에서는 보통 Static Text 라는 명칭으로 불리는 놈인데 직접 수정은 안되는 고정된 내용을 보여주는 텍스트 표시용 UI객체 입니다. Walk를 비롯한 MS외의 개발리소스 들에서는 라벨(Label)이라는 명칭을 더 많이 쓰는것 같기는 합니다만.

일단 함수가 몇가지 있는데요.

함수 이름 보면 빡! 감이 오셔야 하는데 ㅋㅋ 모든 라벨관련 함수는 표시될 텍스트 내용을 인자로 넘기면 되고 리턴되는 값은 실질 walk.Label 객체입니다. 이 리턴된 객체로는 사용자의 입력이나 여러 이벤트 상황에 따라서 텍스트의 내용을 바꾼다거나 하는 여러 짓이 가능합니다. 

MultiLineLabel 은 라벨은 기본적으로 개행문자를 먹지 않아서 하나의 라벨에 개행을 포함한 문자열을 표시할때 사용합니다. Label 과 LabelLeft 는 좌측정렬, LabelCenter 는 가운데 정렬, LabelRight는 우측정렬입니다.

Go
func LabelTest() {
	mgr, _ := NewWindowMgrNoResize("라벨테스트", 640, 480, GetIcon())

	mgr.Label("Label함수")
	mgr.LabelLeft("LabelLeft함수")
	mgr.LabelCenter("LabelCenter함수")
	mgr.LabelRight("LabelRight함수")

	mgr.StartForeground()
}

자 이제 이 함수의 리턴값인 walk.Label 을 가지고 무엇을 할 수 있느냐!!

Go
func LabelTest2() {
	mgr, _ := NewWindowMgrNoResize("라벨테스트", 640, 480, GetIcon())

	label1 := mgr.Label("Label함수")
	mgr.PushButton("Label함수 라벨 변경", func() {
		label1.SetText("버튼1 클릭!!")
	})
	label2 := mgr.LabelLeft("LabelLeft함수")
	mgr.PushButton("LabelLeft함수 라벨 변경", func() {
		label2.SetText("버튼2 클릭!!")
	})
	label3 := mgr.LabelCenter("LabelCenter함수")
	mgr.PushButton("LabelCenter함수 라벨 변경", func() {
		label3.SetText("버튼3 클릭!!")
	})
	label4 := mgr.LabelRight("LabelRight함수")
	mgr.PushButton("LabelRight함수 라벨 변경", func() {
		label4.SetText("버튼4 클릭!!")
	})
	mgr.StartForeground()
}

이렇게 Label* 함수들의 리턴값인 walk.Label 객체를 가지고 SetText함수를 호출하면 라벨의 내용을 변경 가능합니다. Walk 에서 제공하는 객체들의 종류등은 lxn/walk 를 참고하셔도 되고요 ..

Label 은 역할 자체가 텍스트 출력이 주 용도라 딱히 이벤트 핸들러니 그런건 신경쓸게 별로 없습니다.

다음 편에서는 LineEdit 를 다뤄보겠습니다.

%d