피로곰's 모두의 프린터

모두의 프린터는 개인, 기업 상관 없이 누구나 무료로 사용가능한 프로그램입니다. 회원가입,카드결제등을 요구하지 않습니다! 광고를 통해 연결되는 사이트에서의 회원가입, 카드결제 피해를 보지 않도록 주의하세요!
반응형

오랜만에 Go언어 관련된 글을 작성합니다.


모두의 프린터, 모두의 PDF등을 비롯한 대부분의 프로그램을 lxn/win, lxn/walk 를 클론해서 조금씩 손보고 해가면서 쓰고 있는데요, 관련 코드는 제 깃헙에 공개를 하고 있습니다. 1일1고 카테고리의 글들을 참고하시면 Go언어로 윈도 GUI 프로그래밍을 하는 것과 관련된 여러 글들을 보실 수 있을겁니다.


이번에 추가한 기능은 .. 자주 쓰이진 않지만 특정 목적의 툴을 만들거나 할때에는 은근 유용한 상태바(StatusBar)를 만들어 넣는방법입니다.


walk 자체에 대부분 기본적으로 제공하던 기능이긴 합니다만 .. 그래도 walkmgr 라고 랩퍼를 만들어서 쓰고 있다보니 같은 체계(?)안으로 좀 끌어 넣고 예제코드도 같이 포함해서 올려 두었습니다.


우선 walkmgr 패키지에는 statusbar.go 파일이 새로 추가 되었습니다.

/**
*	AddStatusItem
**/
func (wm *WalkUI) AddStatusItem(text string, width int, icon *walk.Icon, clickedFn func()) *walk.StatusBarItem {
	nb := walk.NewStatusBarItem()
	nb.SetText(text)
	if width > 0 {
		nb.SetWidth(width)
	}
	if icon != nil {
		nb.SetIcon(icon)
	}
	if clickedFn != nil {
		nb.Clicked().Attach(clickedFn)
	}
	wm.Window().StatusBar().Items().Add(nb)
	return nb
}

기존 walkmgr 객체인 WalkUI의 메서드로 AddStatusItem 이라는 놈을 추가 하였구요..

보통 상태바는 위 그림과 같이 아래 아이템1,2,3,4,5가 표시되는 기다란 바를 상태바(StatusBar)라고 부릅니다. 개발자가 원하는대로 몇개의 아이템을 배치할지 각 아이템의 넓이는 몇으로 할지 등을 선택적으로 구성할 수 있습니다.


전달되는 파라메터는 첫번째 text는 문자열(string)이고 위 그림을 기준해선 '아이템1', '아이템2' 같이 상태바의 각 칸에 표시될 텍스트를 입력 하시면 되겠습니다.


두번째 width 는 추가되는 칸의 넓이를 입력하시면 됩니다.


icon 은 상태바에 텍스트와 함께 아이콘도 표시가 가능하기 때문에 walk.NewIconFromFile 같은 메서드를 통해 아이콘 파일을 읽거나 비트맵 파일등을 읽어서 아이콘을 추가할 수 있습니다.


마지막 clickedFn은 상태바의 해당 칸이 클릭 되었을 경우에 호출되는 함수를 지정하시면 됩니다.


https://github.com/pirogom/walkmgr_example

 

GitHub - pirogom/walkmgr_example: walkmgr example project

walkmgr example project . Contribute to pirogom/walkmgr_example development by creating an account on GitHub.

github.com

위 walkmgr_example 프로젝트에 올려둔 코드를 기준해서 간단히 설명 드리겠습니다.

func TestStatusBar_Basic(t *testing.T) {
	wm := walkmgr.NewWin("상태바(StatusBar)", 640, 480)

	wm.AddStatusItem("아이템1", 100, nil, nil)
	wm.AddStatusItem("아이템2", 100, nil, nil)
	wm.AddStatusItem("아이템3", 100, nil, nil)
	wm.AddStatusItem("아이템4", 100, nil, nil)
	wm.AddStatusItem("아이템5", 100, nil, nil)

	// 창크기 변경시 상태바 다시 그리기
	wm.Window().SizeChanged().Attach(func() {
		wm.Window().StatusBar().Invalidate()
	})

	wm.StartForeground()
}

640x480 크기의 창을 생성하고 상태바에 5개의 칸을 추가 했습니다. 각각 아이템1~5라는 이름으로 추가 하였고 각 칸의 넓이는 100px 씩 아이콘은 없고, 클릭시 이벤트를 받을 함수또한 nil로 지정하지 않았습니다.

위 코드를 실행하면 각각 100px 의 넓이를 가지는 5칸으로 나뉜 상태바가 추가된 윈도가 생성됩니다.
중간에

	// 창크기 변경시 상태바 다시 그리기
	wm.Window().SizeChanged().Attach(func() {
		wm.Window().StatusBar().Invalidate()
	})

요 부분은 .. 창 자체를 크기가 변경 가능하게 만들었기 때문에 창의 크기가 변경시에 상태바를 다시 그려주기 위해서 추가합니다. 만약 고정크기의 창을 만드시는 경우엔 이 부분은 작성 하지 않으셔도 됩니다. 창크기가 변경 가능한데 이 코드를 추가 않하시면 ..

이런식으로 창의 크기가 변해도 크기 변화에 맞춰 다시 그려지지 못하고 위에 덮어씌워 지면서 잔상이 남는 것 같은 형태로 표시되는 문제가 발생합니다. 창 크기가 변경가능한 창에선 반드시 위 코드를 포함하셔야 합니다.


이번에는 아이콘을 포함해보도록 합시다.

func TestStatusBar_Icon(t *testing.T) {

	icon1, _ := walk.NewIconFromFile("icon\\icon1.ico")
	icon2, _ := walk.NewIconFromFile("icon\\icon2.ico")

	wm := walkmgr.NewWin("상태바+아이콘(StatusBar)", 640, 480)

	wm.AddStatusItem("아이템1", 100, icon1, nil)
	wm.AddStatusItem("아이템2", 100, icon2, nil)
	wm.AddStatusItem("아이템3", 100, icon1, nil)
	wm.AddStatusItem("아이템4", 100, icon2, nil)
	wm.AddStatusItem("아이템5", 100, icon1, nil)

	// 창크기 변경시 상태바 다시 그리기
	wm.Window().SizeChanged().Attach(func() {
		wm.Window().StatusBar().Invalidate()
	})

	wm.StartForeground()
}

AddStatusItem 메서드의 호출시에 차이점은 icon1, icon2 에 읽어들인 아이콘을 인자로 전달 했다는 차이 입니다.

위 코드를 실행 하시면 이 그림과 같이 각각 아이콘이 추가된 상태바를 볼 수 있습니다. 아이콘은 모두의 PDF와 모두의 프린터의 아이콘을 샘플로 넣어 놨습니다.


마지막으로 .. 클릭 이벤트에 따른 텍스트 메시지 변경, 아이콘 변경의 예제코드를 보겠습니다.

func TestStatusBar_ClickEvent(t *testing.T) {
	icon1, _ := walk.NewIconFromFile("icon\\icon1.ico")
	icon2, _ := walk.NewIconFromFile("icon\\icon2.ico")

	wm := walkmgr.NewWin("상태바+아이콘+클릭(StatusBar)", 640, 480)

	var sb1, sb2 *walk.StatusBarItem

	sb1 = wm.AddStatusItem("아이템1", 200, icon1, func() {
		if sb1.Text() == "아이템1" {
			sb1.SetIcon(icon2)
			sb1.SetText("아이템2")
		} else {
			sb1.SetIcon(icon1)
			sb1.SetText("아이템1")
		}
	})
	sb2 = wm.AddStatusItem("아이템2", 200, icon2, func() {
		if sb2.Text() == "아이템2" {
			sb2.SetIcon(icon1)
			sb2.SetText("아이템1")
		} else {
			sb2.SetIcon(icon2)
			sb2.SetText("아이템2")
		}
	})

	// 창크기 변경시 상태바 다시 그리기
	wm.Window().SizeChanged().Attach(func() {
		wm.Window().StatusBar().Invalidate()
	})

	wm.StartForeground()
}

AddStatusItem 이라는 메서드는 생성한 상태바의 각 칸에 해당하는 객체를 리턴합니다. 이 객체를 통해서 각 상태아이템, 칸?의 텍스를 얻거나 변경하거나 아이콘을 바꾼다던지 칸의 넓이를 조정한다던지 하는 여러 짓이 가능합니다.


클릭 이벤트 함수도 지정을 할거라 AddStatusItem 호출전에 리턴 받은 상태아이템 객체를 저장할 sb1, sb2를 *walk.StatusBarItem으로 선언해 두었구요.


이를통해 클릭시에 현재 아이템의 텍스트 값을 기준으로 텍스트와 아이콘을 토글시켜 변경하도록 구성해 봤습니다.

각 상태바 아이템을 클릭할때마다 메시지와 아이콘이 변경됩니다.
상태에 따라 아이콘을 변경 해야 한다던지 메시지를 변경해야 한다던지 하는 경우에 참고하시면 되겠습니다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band