第5回 新しいタブでリンクを開く (タブブラウザーを作る)

tabbrowser19.gif
前回までにタブブラウザー用のプロジェクトを作成し、アドレスバーの作成やタブにホームページ名が表示されるようにした。

今回はリンクを右クリックして現われるメニューから「新しいウインドウで開く」を選択したときに、そのリンクを新しいタブとして開くようにする。

前回までに作成したプロジェクトを開く。そしてソリューションウインドウにある「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);
	}

tabbrowser20.gif
これでビルド/実行し、リンクを右クリックして「新しいウインドウで開く」を選択すると新しいタブで開いた。

次回は「戻る」と「進む」ボタンを実装する。

プロジェクトファイルをダウンロード


カテゴリー「タブブラウザーを作る」 のエントリー