피로곰's 모두의 프린터

이번에는 .. 얼마전에 모두의 프린터 업데이트 하면서 추가시킨 웹뷰(WebView)를 다뤄보도록 하겠습니다.

한가지 주의 하실점은 윈도 API에서 지원하는 WebView는 흔히 IWebBrowser2 라고 불리는 COM+로 오랜세월 윈도에 내장된 레거시 브라우져 컴포넌트를 이용하게 됩니다. 그말은 현재 우리가 많이쓰는 HTML5 기반의 크롬이나 엣지나 파이어폭스 같은 브라우저보다 몇세대 전 기술을 사용하는 .. 

그냥 쉽게 IE라고 보시면 됩니다. 그렇다 보니 너무 최신의 CSS나 HTML, Javascript 를 사용한 페이지 에서는 스크립트 오류나 기타 여러 증상이 나타날 순 있습니다.

크로미움 엣지 기반의 WebView2를 MS에서 발표 했습니다만 아직 윈도10에서는 런타임을 추가로 설치하지 않으면 사용하지 못하는데다 그 용량도 100메가가 넘어가는지라 .. 우선 전통적인 웹뷰를 프로그램에 붙여 보도록 하겠습니다.

우선 기존에 공개한 walk_wrap.go 파일에는 웹뷰에 대한 함수가 존재하지 않으니 ..

func (m *WinResMgr) WebView(url string) *walk.WebView {
	wv, _ := walk.NewWebView(m.GetParent())
	wv.SetURL(url)

	m.addObj(wv)
	return wv
}

walk_wrap.go 파일 안에 대충 아무대나 위 함수 추가를 하시구요.

func webviewTest() {
	mgr, _ := NewWindowMgr("웹뷰 테스트", 1024, 680, GetIcon())

	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")

	mgr.StartForeground()
}

이렇게 윈도 창을 하나 만든다음 WebView 를 URL을 인자로 넘기면서 띄우시면 ..

이런 놈을 보실 수 있습니다.

func webviewTest2() {
	var wv *walk.WebView
	mgr, _ := NewWindowMgr("웹뷰 테스트2", 1024, 680, GetIcon())

	mgr.HSplit()
	mgr.Label("URL:")
	urlEdit := mgr.LineEdit(false)
	mgr.PushButton("GO!", func() {
		wv.SetURL(urlEdit.Text())
	})
	mgr.EndSplit()

	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")

	mgr.StartForeground()
}

이렇게 URL을 입력 받아서 .. 웹브라우져 비수무리하게 가능도 하겠구요 ..

	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.SetNativeContextMenuEnabled(true)

이렇게 SetNativeContextMenuEnabled 에 true 로 설정을 하면 마우스 우클릭을 통한 일반적인 브라우져 메뉴를 보실수도 있습니다.

웹뷰는 생각보다 단순해요 어짜피 MS에서 제공한 인터페이스를 그대로 사용을 하는거라 .. 

기타 IWebBrowser 에서 제공하는 몇가지 함수나 이벤트 콜백 메소드들은 walk 의 webview.go 를 참고하시면 됩니다. 몇가지 예를 보여드리자면 ..

// 현재 URL 가져옴 
func (wv *WebView) URL() (url string, err error) {
}

// URL 변경
func (wv *WebView) SetURL(url string) error {
}

// URL이 변경 이벤트 콜백
func (wv *WebView) URLChanged() *Event {
}

// 우클릭 메뉴 활성화 여부 (true 켜짐 , false 꺼짐)
func (wv *WebView) NativeContextMenuEnabled() bool {
}

// 우클릭 메뉴 활성화 설정 (true 켜짐, false 꺼짐)
func (wv *WebView) SetNativeContextMenuEnabled(value bool) {
}

// 페이지 로딩 시작됨(로딩중) 이벤트 콜백
func (wv *WebView) Navigating() *WebViewNavigatingEvent {
}

// 페이지 로딩 끝남 이벤트 콜백
func (wv *WebView) Navigated() *StringEvent {
}

// 다운로딩 시작됨(다운로드중) 이벤트 콜백
func (wv *WebView) Downloading() *Event {
}

// 다운로드 끝남 이벤트 콜백
func (wv *WebView) Downloaded() *Event {
}

// 페이지 구성 완료 (렌더링 완료?) 콜백
func (wv *WebView) DocumentCompleted() *StringEvent {
}

// 화면 갱신 (F5)
func (wv *WebView) Refresh() error {
}

이정도 입니다 자세한건 직접 walk 패키지의 webview.go 를 참고바랍니다.

이 웹뷰 관련도 VC++ 재배포가능 패키지가 없으면 실행이 안됩니다. 만약 시스템에 VC++재배포 패키지가 전혀 없다면 추가로 설치하셔야 합니다. 보통은 다른 프로그램 때문에라도 단 하나라도 설치가 되는 편이지만 .. 그냥 바로 죽어버리기 때문에 원인을 못찾으실수도 있어서 .. 내용을 추가해 둡니다.

https://docs.microsoft.com/ko-KR/cpp/windows/latest-supported-vc-redist?view=msvc-170 

이상입니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band