IWebBrowser2 Scrollbar 숨기기

|


이전 글에서는 IWebBrowser2 로 IE Control을 삽입하는 방법을 썼다.

이번엔 그 IE Control 에서 Scrollbar 를 숨기는 방법이다. (이거 알아 내느냐고 하루를 소비했다. ㅠㅜ)

세가지 방법이 있다.

1. IWebBrowser2로 IDispatch를 얻어서 IHTMLDocument2 --> IHTMLElement --> IHTMLBodyElement 까지 얻는다.
그리고 IHTMLBodyElement 의 put_scroll(CComBSTR(L"no")) 해주면 된다.
이 방법은 인터넷에 찾으면 많이 나온다.
주의 할 사항은 간혹 html 인지 asp 인지 어느 url 에서는 읽지 못하고 IHTMLElement 읽어 오는데 실패한다.
그래서 이 방법은 추천하지 않는다.

2. 두번째 방법은 IDocHostUIHandler::GetHostInfo 의 플래그 값에 DOCHOSTUIFLAG_SCROLL_NO 를 넣어 주면 된다.
하지만 MFC 에서는 Custsite.cpp, Custsite.h, Idispimp.cpp, Idispimp.h 를 추가하여 간단하게 처리 가능하나 ATL 용으로는 약간 더 복잡하다.
IDocHostUIHandlerDispatch 를 이용하여 IAxWinHostWindow::SetExternalUIHandler(IDocHostUIHandlerDispatch *pDisp)에 플래그를 세팅하여 
넣어 줘야 한다.

3. 세번째는 Navigate(...) 하기전에 IAxWinAmbientDispatch 의 플래그에 DOCHOSTUIFLAG_SCROLL_NO 를 넣어 주기만 하면 된다.
CoCreateInstance( ,,, IWebBrowser2 객체 ) 이후
AtlAxAttachControl( IWebBrowser2 객체, Window Handle, &IUnknown객체 );   // - atl 컨트롤 연결

....

CComPtr<IAxWinAmbientDispatch> axWinDisp;
if( SUCCEEDED( IUnknown객체->QueryInterface( &axWinDisp ) ) )
{
        axWinDisp->put_DocHostFlags( DOCHOSTUIFLAG_SCROLL_NO );   // - HostFlag 설정
        // DOCHOSTUIFLAG_NO3DOUTERBORDER | DOCHOSTUIFLAG_NO3DBORDER 도 넣으면 테두리가 사라진다.
}
여기까지 하면 Visual Studio 6.0 쓰시는 분들은 잘 될 것입니다. 허나 그 이상 버전에서는 AtlAxAttachControl 함수 안에서 실행중 에러가 난다.

... 
HRESULT hRes = E_OUTOFMEMORY;
  T1* p = NULL;
#pragma warning(push)
#pragma warning(disable: 6014)
  /* prefast noise VSW 489981 */
  ATLTRY(p = new T1(pv))    // <<<<========== 여기에서 크래쉬
#pragma warning(pop)
  if (p != NULL)
...
구글링 끝에 해외 개발자 커뮤니티 사이트에서 찾아냈다. (야호~)

작업 중인 cpp에 (웹 컨트롤 class가 있는...) 제일 상단에 아래 코드를 넣어주면 된다.

CComModule _Module;
extern __declspec(selectany) CAtlModule* _pAtlModule = &_Module;

잘 돌아 갈 것이다.

두번째, 세번째 방법의 더 자세한 내용은 http://ancdesign.tistory.com/17 참조.
마지막 크래쉬 관련 내용은 http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/6de21bab-7786-497f-99ba-c40de8ff1320/ 마지막 코맨트 참조.

And