![]()
前回までにタブブラウザー用のプロジェクトを作成し、アドレスバーの作成やタブにホームページ名が表示されるようにした。
今回はリンクを右クリックして現われるメニューから「新しいウインドウで開く」を選択したときに、そのリンクを新しいタブとして開くようにする。
前回までに作成したプロジェクトを開く。そしてソリューションウインドウにある「TabBrowser100View.h」をダブルクリックしてビュークラスの編集画面を開く。そして2箇所追加する。
IEコントロールでは新しいウインドウで開く直前にDISPID_NEWWINDOW2というイベントが発生する。それを検出したら、新しいタブを作りそこにあるIEコントロールのIDispatchを返せばInternet Explorerではなく「タブ」でリンクが開くようになる。
BEGIN_SINK_MAP(CTabBrowser100View)
SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, OnNewWindow2) //■追加
SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
//■追加
//新しいウインドウで開く前に呼ばれる処理
//新しいタブで開く
void __stdcall OnNewWindow2(IDispatch **ppDisp,VARIANT_BOOL *Cancel)
{
//新しいタブを作る
CTabBrowser100View* pView = new CTabBrowser100View(_pTabView); //タブビューのポインタを渡しておく
pView->Create(*_pTabView, rcDefault, _T("about:blank"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL, 0);
_pTabView->AddPage(pView->m_hWnd, _T("Document"),-1,pView);
if(pView->_pIWebBrowser2 == NULL)
return;
//新しいタブで開くようにIEコントロールにポインタを渡す
pView->_pIWebBrowser2->put_RegisterAsBrowser(VARIANT_TRUE); //これしなくても開くようになっているのはなぜ?IE8から?一応実行しておく
pView->_pIWebBrowser2->get_Application(ppDisp);
}
![]()
これでビルド/実行し、リンクを右クリックして「新しいウインドウで開く」を選択すると新しいタブで開いた。
次回は「戻る」と「進む」ボタンを実装する。
