앞서 강좌?? 까진 아니어도 여튼간에.. Go언어에서 윈도 Gui를 구성하는 법에 대한 글들 중 웹뷰를 설명한 적 있는데요. 이 웹뷰를 사용함에 있어서 한 가지 눈에 거슬리는 부분이 생기실겁니다.

보시면.. 창이 뜨고 잠시후에 웹뷰가 표시되는 걸 보실 수 있는데요.. 이건 이 IWebBrowser2라는 놈이 OLE/COM 그러니까 흔히 말하는 OCX로 만들어진 놈이라..
원래 MFC로 다이얼로그 베이스의 프로그램을 만들거나 할 경우에는 프로그램의 생성자 즈음에 이 OCX객체의 초기화 관련 코드도 진행을 하기 때문에 .. 창이 표시되기 전에 웹뷰 관련 초기화가 이미 진행이 된 상태라 창이 표시되는 시점과 웹뷰가 준비된 시점이 거의 비슷하지만..
이 lxn/walk의 웹뷰는.. 기본적으로 lxn/win 패키지에서 동적으로 IWebBrowser2 객체를 끌어오는 형식을 취하고 있기 때문에 실제론 창이 생성돼서 보이는 시점보다 웹뷰가 초기화되고 사이트가 로딩돼서 뜨는 시점이 차이가 날 수 있습니다.
이런 식으로 쓰면 문제점이.. 웹뷰를 통해서 무언가를 보여주기 위해서 웹뷰를 쓰는데.. 웹뷰의 내용을 보기도 전에 사용자가 창을 닫아버리면 아무 의미가 없어지죠..
그리하여..
우선 창을 보이지 않게 생성한 후 웹뷰의 초기화 및 준비가 끝나면 창을 보여주도록 해봅니다.
func webviewTest() {
mgr, win := NewWindowMgr("웹뷰 테스트", 1024, 680, GetIcon())
wv := mgr.WebView("https://modu-print.tistory.com/category/%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C/%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%20%EB%82%B4%EC%97%AD%EC%95%88%EB%82%B4")
wv.Navigated().Attach(func(s string) {
if !win.Visible() {
win.Synchronize(func() {
win.Show()
})
}
})
mgr.HideStart()
//mgr.StartForeground()
}
웹뷰의 Navigated 이벤트는 URL에 대한 브라우징이 끝났을 경우에 발생하는 이벤트입니다. 이 이벤트가 발생 시에 창이 보이는 상태가 아니면.. 그러니까 win.Visible()이 false를 리턴하는 경우엔 해당 윈도가 Hide 상태입니다. 그러니 보이도록 해야겠지요.
웹뷰의 객체도 윈도 내에 있으니 상관없을 것 같긴 합니다만.. 그래도 혹시 몰라 win.Synchronize로 묶어 봤습니다.
보통 다른 예제들에서는 mgr.StartForeground()라는 메서드를 사용했는데요.. 이건 창을 시작하면서 맨 상단으로 보여줘라 라는 의미로 쓰는 놈입니다만..
페이지 로딩이 끝나기 전에는 창을 보여주지 않을 거니..
mgr.HideStart() 메서드로.. 창을 시작은 하되 보이진 않도록 해서 시작합니다.

차이가 느껴 지십뉘까?? ㅋㅋ
이상입니다.
2022.03.23일 추가 ..
위에 언급한 lxn/win, walk 를 직접 수정해 쓰는게 좀 .. 좋은 방식은 아니기도 하고 .. 저것 말고도 손봐서 쓸 일이 좀 있을것 같아서 해당 패키지들을 클론해서 따로 팠습니다.
go get github.com/pirogom/win
go get github.com/pirogom/walk
import 구문들도 lxn/win, walk 에서 pirogom/win, walk 로 변경하시면 .. 위에 언급한 수정사항은 이미 적용된 패키지를 사용 가능하십니다. 아마 앞으로 관련 글에서 다뤄지는건 lxn/win ,walk 가 아닌 제가 관리하는 win, walk 를 기반으로 할것 같습니다.