第4回 「タブ」にホームページの名前を表示する (タブブラウザーを作る)

tabbrowser14.gif
前回までにタブブラウザー用のプロジェクトを作成し、手動でURLを入力できるようにアドレスバーを実装した。今回はアクセスしたURLのホームページ名が「タブ」に表示されるようにする。

前回までに作成したプロジェクトを開く。そしてソリューションウインドウにある「TabBrowser100View.h」をダブルクリックしてビュークラスの編集画面を開く。そしてまず4箇所ソースコードを追加する。
#include "atlstr.h"				//■追加
#include "Exdispid.h"			//■追加

#define SINKID_EVENTS 0			//■追加

class CTabBrowser100View : public CWindowImpl<CTabBrowser100View, CAxWindow>
	,public IDispEventImpl<SINKID_EVENTS, CTabBrowser100View, &DIID_DWebBrowserEvents2>		//■追加
{
	CTabView*	_pTabView;		//■追加 タブビューを保持
public:
	DECLARE_WND_SUPERCLASS(NULL, CAxWindow::GetWndClassName())

	//■追加
	CTabBrowser100View(CTabView* pTabView)
	{
		_pTabView = pTabView;
	}


	BOOL PreTranslateMessage(MSG* pMsg)
	{
		if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
		   (pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
			return FALSE;

		// このメッセージを翻訳する機会をHTML ページに与える
		return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
	}

	BEGIN_MSG_MAP(CTabBrowser100View)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)		//■追加
	END_MSG_MAP()

tabbrowser15.gif さらに開いたURLが読み込まれたときに呼ばれる処理を追加する。 ここではDISPID_DOCUMENTCOMPLETEを受信したときにタブにホームページの名前を表示するようにした。通常のタブブラウザーの場合はほかのイベントが届いたときにも書き換える処理をしている。しかし処理が煩雑になるため今回は省略した。
	//■以下3行追加
	BEGIN_SINK_MAP(CTabBrowser100View)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
	END_SINK_MAP()

	//■関数追加
	//HTMLページが読み終わったときに呼ばれる処理
	void	_stdcall OnDocumentComplete(IDispatch* pDisp, VARIANT* URL)
	{
		bool	ret;

		ret = GetBrowserCtrl();
		if(ret == false)
			return;

		//タブに表示されている名前を変更
		if(_pTabView)
		{
			int			nPage;
			CComBSTR	bstr;
			CAtlString	strName;

			_pIWebBrowser2->get_LocationName(&bstr);		//現在のホームページ名を取得
			strName = bstr;

			nPage = _pTabView->PageIndexFromHwnd(m_hWnd);	//このウインドウに関連づいているタブのインデックス取得
			_pTabView->SetPageTitle(nPage,strName);			//タブの名前を変更
		}
	}

tabbrowser16.gif さらにIEコントロールからのイベントを受信できるように接続処理と、終了時のためにその切断処理を実装する。 本来であればIWebBrowser2を取得したとき、、、この場合はGetBrowserCtrl()内でIEへの接続を行った方がいいが、今回はCreateの中のままにしておく。
	//■追加
	//Create関数のオーバーライド。内部でIEの取得、接続などを行う
	HWND Create(HWND hWndParent, _U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
			DWORD dwStyle = 0, DWORD dwExStyle = 0,
			_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
	{
		bool	ret;
		HWND	hWnd;

		hWnd = __super::Create(hWndParent,rect,szWindowName,dwStyle,dwExStyle,MenuOrID,lpCreateParam);
		if(hWnd == NULL)
			return	NULL;			//Create失敗

		ret = GetBrowserCtrl();
		if(ret == false)
			return	hWnd;			//WebBrowser取得失敗

		Advise(_pIWebBrowser2);		//IEとの接続

		return	hWnd;
	}


	//■追加
	//ビューを閉じるときの処理
	LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		bHandled = FALSE;

		if(_pIWebBrowser2)
			Unadvise(_pIWebBrowser2);	//IEからの切断
		_pIWebBrowser2 = NULL;

		return	0;
	}

tabbrowser17.gif 次に「MainFrm.h」を開き、OnFileNew()の中にあるビューの生成時にCTabViewへのポインタを渡すようにする。
	LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		CTabBrowser100View* pView = new CTabBrowser100View(&m_view);	//■変更 ビューのポインタを渡しておく
		//TODO: 必要に応じてURLを書き換えてください。
		pView->Create(m_view, rcDefault, _T("http://www.usefullcode.net/"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL, 0);
		m_view.AddPage(pView->m_hWnd, _T("Document"),-1,pView);

		// TODO: ドキュメント初期化コードの追加

		return 0;
	}

tabbrowser18.gif
以上によりビルド/実行すると、開いたホームページの名前がタブに表示されるようになった。

次回は右クリックして現われるメニューから「新しいウインドウで開く」を選択した場合に、Internet Explorerが起動するのではなく、新しいタブでURLが開くようにする。

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


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