CHTMLViewのメモ

CHTMLViewを使えば、ブラウザが簡単にできてしまうが、いくつかポイントがある。

IEのメニューの呼び出し

IEのメニューの機能を呼び出すには、COMを利用する。といっても、COM自体良くわかっていないので以下のように呼び出せばよい。
検索
CComQIPtr pTarget;
pTarget = GetHtmlDocument();
pTarget->Exec(&CGID_MSHTML, IDM_FIND, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

印刷
CComQIPtr pTarget;
pTarget = GetHtmlDocument();
pTarget->Exec(&CGID_MSHTML, IDM_PRINT, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

印刷の設定
CComQIPtr pTarget;
pTarget = GetHtmlDocument();
pTarget->Exec(&CGID_MSHTML, IDM_PAGESETUP, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

印刷プレビュー
CComQIPtr pTarget;
pTarget = GetHtmlDocument();
pTarget->Exec(&CGID_MSHTML, IDM_PRINTPREVIEW, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

全て選択
CComQIPtr pTarget;
pTarget = GetHtmlDocument();
pTarget->Exec(&CGID_MSHTML, IDM_SELECTALL, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

コピー
CComQIPtr pTarget;
pTarget = GetHtmlDocument();
pTarget->Exec(&CGID_MSHTML, IDM_COPY, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

ブラウザ部の再描画

普通にInvalidateRect 関数を使ってもブラウザ部は再描画されないことがある。
なので以下のような処理を行うと良い。
下記のように関数化しておくと良いだろう。
void CxxxxHTMLView::RedrawView(){
	CWnd* pBrowserWnd = GetWindow(GW_CHILD);
	HWND hBrowserWnd = pBrowserWnd->GetSafeHwnd();
	ShowWindow(SW_HIDE);
	ShowWindow(SW_SHOW);
	UpdateWindow();
}

HTMLソースの取得

HTMLソースの取得を行なう為には、IHTMLElementを取得する必要がある。
取得したエレメントのget_innerHTML関数で取得可能。
設定はput_innerHTMLでできる。
    CComPtr pDisp = GetHtmlDocument();
    CComQIPtr pDoc = pDisp ;
    CComPtr pCol ;
    pDoc->get_all( &pCol) ;
    long lSize ;
    pCol->get_length( &lSize);
    CString strHtml;
    if( lSize != 0){
        // all の内容をリストアップ
        USES_CONVERSION ;
        BSTR bStr;
        for( long i = 0; i < lSize; i++){
            CComQIPtr pElement ;
            CComVariant  vintName( i) ;
            CComVariant  vintIndex( 0) ;
            CComPtr  pdsp2 ;
            pCol->item( vintName, vintIndex, &pdsp2) ;
            pElement = pdsp2 ;
            pElement->get_innerHTML(&bStr);
            strHtml = bStr;
        }
    }

参考資料

  • http://www.manoeuvre.net/mdi/diary/200105.html
  • IEコンポーネントの使い方 [VC++の使い方]
  • Internet Explorer オブジェクト モデルへのアクセス