윈도우에 호스팅된 IE 컨트롤을 사용시 기본적으로 스크롤바가 생성되게 된다. 이 스크롤바를 없애기 위해서 IDocHostUIHandler::GetHostInfo() 를 호출하면 되는데 DOCHOSTUIINFO::dwFlags에 DOCHOSTUIFLAG_SCROLL_NO를 넣어주게 되면 스크롤이 생성되지 않게 된다.
위 코드를 실행하게 되면 윈도우 안에 IE가 삽입되어 위의 URL정보를 보여주게 되는데 영역에 따른 스크롤바가 생성된다. 이를 없애기 위해서 IDocHostUIHandler::GetHostInfo()를 호출해야 한다.
AtlAxAttatchControl() 함수를 따라 들어가보면 내부에서 CAxHostWindow 를 생성하고 여기에서 IAxWinHostWindow를 쿼리하여 IAxWinHostWindow::AttatchControl() 함수를 호출하여 실제 윈도우에 IE 컨트롤을 호스팅하게 된다. CAxHostWindow는 IDocHostUIHandler의 인터페이스를 상속받아 구현되어 있기 때문에 IDocHostUIHandler를 쿼리하여 IDocHostUIHandler::GetHostInfo()를 호출하면 스크롤바가 지워질 것 같지만 실상 이를 실행해 보면 GetHostInfo()에서는
if (m_spIDocHostUIHandlerDispatch != NULL) return m_spIDocHostUIHandlerDispatch->GetHostInfo(&pInfo->dwFlags, &pInfo->dwDoubleClick);
위 코드로 구현 되어 있고 m_spIDocHostUIHandlerDispatch( <- IDocHostUIHandlerDispatch )가 NULL 이기 때문에 GetHostInfo를 호출할 수 없다.
m_spIDocHostUIHandlerDispatch를 세팅해 주기 위해서는 IAxWinHostWindow::SetExternalUIHandler(IDocHostUIHandlerDispatch *pDisp); 함수를 호출하여 값을 넣어주게 되어 있다.
구글링을 통해서 새로운 사실을 하나 더 알게 되었는데
CAxHostWindow는 IAxWinAmbientDispatch 인터페이스를 상속받아서 구현이 되어 있다. IAxWinAmbientDispatch::put_DocHostFlags() 함수를 호출하여 위에 설명된 복잡한 과정을 생략하고 값 설정이 가능하다.
url을 navigate() 하기 전에 아래 코드가 실행되면 스크롤바가 생성되지 않는다.
CComPtr<IAxWinAmbientDispatch> axwindisp; if (SUCCEEDED(unkContainer->QueryInterface(&axwindisp))) { axwindisp->put_DocHostFlags(DOCHOSTUIFLAG_SCROLL_NO); }