아래 뜨는 Download 나 PC App Store는 모두의 프린터와 상관없는 광고입니다!!
특히 PC App Store는 악성 소프트웨어이니 절대 클릭하지 마세요!!
모두의 프린터는 어떠한 경우에도 본인인증, 회원가입, 카드결제를 요구하지 않습니다.
다운로드를 유도하는 애드센스 광고를 피로곰이 배포하는 프로그램들의 다운로드 링크로 착각하지 않도록 주의하시기 바랍니다. 피로곰이 배포하는 모든 프로그램은 본인인증, 회원가입, 이용료 결제 없이 무료로 사용가능합니다.
많이 찾는 글들...
  1. MS윈도 디펜더(바이러스 백신) 예외설정 방법
  2. ghostscript 실행파일 경로가 지정되어 있지 않아서 변환할 수 없습니다.
  3. PC App Store 제거 방법
  4. Ghostscript/GhostPCL 설치 안내
  5. 파일 다운로드가 차단되는 경우
  6. 내 컴퓨터의 32비트,64비트 여부 아는법
  7. 'Windows의 PC 보호' 문제
  8. 모두의 프린터 실행후 환경설정창 뜨지 않고 무반응
  9. Ghostscript PDF변환 불가. Can't load Ghostscript DLL
  10. 대법원 인터넷 등기소, 전자소송, 경매,전자공탁등 대법원계열 사이트관련
  11. 모두의 프린터 사용후 네트워크 장애가 발생하는경우. (대법원 인터넷등기소 등)
  12. 출력시 모두의 프린터가 강제종료 되는 경우.'지원하지 않는 PDF또는 가상 프린터입니다.'
  13. 오픽(OPic), 연결상태 확인 불가 프린터, 등록되지 않은 프린터(MarkAny e-PageSAFER)
  14. YBM 토익성적표 관련(정상적인 프린터로 출력을 진행하시기 바랍니다)
  15. 리포트뷰어(ReportViewer) 관련(특수목적프린터, 문서변환 프로그램을 제거해주세요)
  16. 인터넷증명발급센터 서트피아(Certpia) 관련 안내
  17. 인강사이트 관련 - 출력에 매우 오래 걸림, PDF파일 버벅거림, PDF여는데 오래걸림 등등
  18. '잘못된 프린터 데이터를 수신하였습니다.' 문제
  19. MS서피스, 삼성 갤럭시북 등 ARM기반 랩탑, '잘못된 프린터 데이터를 수신하였습니다.' 문제

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

Go로 윈도 네이티브 GUI 프로그램만들기 2번째 입니다.

앞서 lxn/win, walk 2개 패키지는 go get 하셨을 테구요.. 보통 윈도 API 프로그래밍은 C/C++ 에서도 노가다의 최 정점에 놓여진 그런 놈입니다 ㅋㅋ 그게 싫어서 쓰는게 go 같은 언어들인거고 .. 

그런 이유로 이 lxn/walk 의 경우에도 좀더 편하게 GUI를 만들수 있는 방법을 제공하는데요.

그게 lxn/walk 패키지에 포함된 declarative 라는 패키지 입니다. 

Go
package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
	"strings"
)

func main() {
	var inTE, outTE *walk.TextEdit

	MainWindow{
		Title:   "SCREAMO",
		MinSize: Size{600, 400},
		Layout:  VBox{},
		Children: []Widget{
			HSplitter{
				Children: []Widget{
					TextEdit{AssignTo: &inTE},
					TextEdit{AssignTo: &outTE, ReadOnly: true},
				},
			},
			PushButton{
				Text: "SCREAM",
				OnClicked: func() {
					outTE.SetText(strings.ToUpper(inTE.Text()))
				},
			},
		},
	}.Run()
}

이런식으로 생성하고자 하는 창의 정보를 나열하고 실행하면.

이런 윈도 창을 띄워 줍니다. 

이것도 나름 괜찮은 방법 일수도 있긴 합니다만. 실제로 파이썬이나 다른 Managed 언어들의 GUI관련 패키지들을 보면 이와 비슷한 형태로 레이아웃 구성을 하고 이벤트 처리를 담당할 메소드 지정을 하는 등의 비슷한 구성을 쉽게 찾아 볼 수 있습니다만.

이게 문제가 ;; 가독성이 좋아 보이는것 같으며서도 좋지 않다는 것이지요. 예를들어..

모두의 프린터 환경설정과 같이 다양한 UI 요소가 매우 많이 존재하는 경우에는 저러한 레이아웃 관련 코드의 나열이 오히려 가독성도 해치고 구조의 Depth 가 깊어져 가면서 가독성이 매우 안좋아 집니다. 물론 제 개인적인 생각이지만요. 그런 이유로 저는 저 declarative 라는 패키지를 사용하지 않고.

따로 walk_wrap.go 라는 파일에 declarative 의 역할을 대신 직접적으로 함수들을 호출해가며 동작해주는 놈을 만들어서 모두의 프린터, 모두의 PDF에서 사용중입니다.

제가 쓰는 코드는 

Go
mgr, _ := NewWindowMgr("기본 레이아웃", 1025, 768, GetIcon())

	// HSplitter
	mgr.HSplit()
	mgr.Label("HSplitter")
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.PushButton("버튼4", func() {})
	mgr.EndSplit() // HSplit, VSplit 사용후엔 EndSplit!!

	// VSplitter
	mgr.VSplit()
	mgr.Label("VSplitter")
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.PushButton("버튼4", func() {})
	mgr.EndSplit()

	// HSplitter + VSplitter
	mgr.HSplit()

	mgr.VSplit()
	mgr.Label("HSplit 안에 VSplit")
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.EndSplit() // End of VSplit

	mgr.HSplit()
	mgr.Label("HSplit 안에 HSplit")
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.EndSplit()

	mgr.VSplit()
	mgr.Label("HSplit 안에 VSplit2")
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.CheckBox("체크1", false, func() {})
	mgr.EndSplit()

	mgr.EndSplit() // End of HSplit

	// 그룹박스 Vertical
	mgr.GroupBox("그룹박스(V)", true)
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.CheckBox("체크1", false, func() {})
	mgr.EndGroupBox()

	// 그룹박스 Horizen..
	mgr.GroupBox("그룹박스(H)", false)
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.CheckBox("체크1", false, func() {})
	mgr.EndGroupBox()

	mgr.HSplit()

	mgr.GroupBox("HSplit으로 분리한 그룹박스1", true)
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.CheckBox("체크1", false, func() {})
	mgr.EndGroupBox()

	mgr.GroupBox("HSplit으로 분리한 그룹박스2", true)
	mgr.PushButton("버튼1", func() {})
	mgr.PushButton("버튼2", func() {})
	mgr.PushButton("버튼3", func() {})
	mgr.CheckBox("체크1", false, func() {})
	mgr.EndGroupBox()

	mgr.EndSplit()

	mgr.StartForeground()

이런 코드로

이런 짓이 가능합니다. 원하는 부분부분을 함수 호출을 하는 코드단위로 분리가 가능하기 때문에 특정 함수단위로 쪼개서 기능을 처리도 가능 하겠지요. 동적으로 UI요소를 추가도 가능하구요.

따로 패키지로 뺄 정도의 내용은 아니라서 저는 go파일 하나에 때려 넣고 쓰는 중이라 ..

여튼간에 다음 글 부터 이놈을 가지고 GUI를 떄려 잡아보도록 합시다.

많이 찾는 글들...
  1. MS윈도 디펜더(바이러스 백신) 예외설정 방법
  2. ghostscript 실행파일 경로가 지정되어 있지 않아서 변환할 수 없습니다.
  3. PC App Store 제거 방법
  4. Ghostscript/GhostPCL 설치 안내
  5. 파일 다운로드가 차단되는 경우
  6. 내 컴퓨터의 32비트,64비트 여부 아는법
  7. 'Windows의 PC 보호' 문제
  8. 모두의 프린터 실행후 환경설정창 뜨지 않고 무반응
  9. Ghostscript PDF변환 불가. Can't load Ghostscript DLL
  10. 대법원 인터넷 등기소, 전자소송, 경매,전자공탁등 대법원계열 사이트관련
  11. 모두의 프린터 사용후 네트워크 장애가 발생하는경우. (대법원 인터넷등기소 등)
  12. 출력시 모두의 프린터가 강제종료 되는 경우.'지원하지 않는 PDF또는 가상 프린터입니다.'
  13. 오픽(OPic), 연결상태 확인 불가 프린터, 등록되지 않은 프린터(MarkAny e-PageSAFER)
  14. YBM 토익성적표 관련(정상적인 프린터로 출력을 진행하시기 바랍니다)
  15. 리포트뷰어(ReportViewer) 관련(특수목적프린터, 문서변환 프로그램을 제거해주세요)
  16. 인터넷증명발급센터 서트피아(Certpia) 관련 안내
  17. 인강사이트 관련 - 출력에 매우 오래 걸림, PDF파일 버벅거림, PDF여는데 오래걸림 등등
  18. '잘못된 프린터 데이터를 수신하였습니다.' 문제
  19. MS서피스, 삼성 갤럭시북 등 ARM기반 랩탑, '잘못된 프린터 데이터를 수신하였습니다.' 문제

모두의프린터에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기