備忘録 ダイアログにIEのブラウザを貼り付ける
MFCでブラウザコンポーネントを使う方法は、CHtmlViewクラスを使ってSDIやMDIで作成するのがまあ標準的な方法みたいですが、ダイアログ使いとしては単純にダイアログに貼り付けて使いたい。ということで、ちょっと調べてみました。調べるのに、時間がかかったのですが、結論は結構簡単にできます。VS2010では、COMのラッパークラスを自動生成してくれる機能があるのでこれを使うと、単に固定のURLを表示するだけならプログラムは3行ぐらいで終わりです。方法その1)1.ツールボックスにWeb Browserを登録2.ダイアログのデザイナー画面でツールボックスからWeb Browserコンポーネントを選択してダイアログに貼り付ける。3.Webブラウザのコンポーネントに変数の追加で適当な変数をつける。と、ここまでやると自動的にCOMのラッパークラスを生成してこのクラスの変数が生成されます。これを、仮にm_webとすると、4.InitDialog()あたりに、m_web.Navigate(_T("http://www.hoge.jp),..)とやると表示します。たぶん、これが一番簡単な方法のようです。方法その2)1.クラスの追加で、Active-XのMFCクラスを追加します。2.ダイアログのOnCreateで上記のラッパークラスのインスタンス生成とCreate()関数でウィンドウ作成を行う。3.InitDialog()でNavigate()関数を呼び出す。その1では、ブラウザーのコンポーネントの生成を自前で行うかどうかの違いです。なぜか、その1)で生成したラッパークラスは、enumによる定数も生成しますがその2で生成したクラスには定数の定義はありません。(この定数はインクルードファイルにも定義されているので、不要といえば不要です。)と、ここまでなら超簡単です。ブラウザのイベントをハンドリングしようとすると、ちょっと面倒です。MSDNによるとこのイベントハンドリングの仕組みをシンク(sink?)と呼ぶようですが、IDispatchを継承したクラスを定義してこのクラスのCOM側に登録すると、このクラスのInvork()関数を呼び出すような仕組みです。雰囲気的には、リフレクション的な感じですね。この辺の仕組みは、COMコンポーネントとのインタフェースの定番的な処理となっているようなのでよく覚えておきたいと思います。