第15回 ちゃんとしたタイミングで「タブ」にホームページ名を表示する (タブブラウザーを作る)

tabbrowser60.gif
前回までの作業で「タブ」の部分にそのとき開いているホームページの名前が表示されていた。しかし表示するタイミングがDWebBrowserEvents2 :: DocumentCompleteが届いたとき、、、つまり読み込みが完全に終わったときだったためなかなかタイトルが表示されないという問題があった。今回はタイミングをDWebBrowserEvents2 :: TitleChangeが届いたときにする。

また、まだしばらく利用することはないがDIID_DWebBrowserEvents2でサポートされているいくつかのイベントの受信処理を追加しておく。
	BEGIN_SINK_MAP(CTabBrowser100View)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, OnNewWindow2)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
		//■以下のSINK_ENTRY_EX追加
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_STATUSTEXTCHANGE, OnStatusTextChange)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_DOWNLOADCOMPLETE, OnDownloadComplete)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_COMMANDSTATECHANGE, OnCommandStateChange)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_DOWNLOADBEGIN, OnDownloadBegin)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_PROGRESSCHANGE, OnProgressChange)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_PROPERTYCHANGE, OnPropertyChange)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_TITLECHANGE, OnTitleChange)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR, OnNavigateError)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_PRIVACYIMPACTEDSTATECHANGE, OnPrivacyImpactedStateChange)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW3, OnNewWindow3)
		SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_SETSECURELOCKICON, OnSetSecureLockIcon)
	END_SINK_MAP()

	//■追加ここから↓の関数いっぱい

	void __stdcall OnStatusTextChange(BSTR bstrText)
	{
	}

	void __stdcall OnDownloadComplete()
	{
	}

	void __stdcall OnCommandStateChange(long lCommand,VARIANT_BOOL vbEnable)
	{
	}

	void __stdcall OnDownloadBegin(void)
	{
	}

	void __stdcall OnProgressChange(long lProgress,long lProgressMax)
	{
	}

	void __stdcall OnPropertyChange(BSTR bstrProperty)
	{
	}

	void __stdcall OnTitleChange(BSTR bstrTitle)
	{
		//タブに表示されている名前を変更
		if(_pTabView == NULL || _pIWebBrowser2 == NULL)
			return;

		int			nPage;
		CComBSTR	bstr;

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

	void __stdcall OnNavigateComplete2(IDispatch *pDisp,VARIANT *vURL)
	{
	}

	void __stdcall OnNavigateError(IDispatch *pDisp,VARIANT *vURL,VARIANT *vTargetFrameName,VARIANT *vStatusCode,VARIANT_BOOL *vbCancel)
	{
	}

	void __stdcall OnPrivacyImpactedStateChange(VARIANT_BOOL vbPrivacyImpacted)
	{
	}

	void __stdcall OnNewWindow3(IDispatch **ppDisp,VARIANT_BOOL *vbCancel,DWORD dwFlags,BSTR bstrUrlContext,BSTR bstrUrl)
	{
	}

	//MSDNにはVARIANTとあるが、longとの間違え
	void __stdcall OnSetSecureLockIcon(long lSecureLockIcon)
	{
	}

	//■追加ここまで↑
	////////////////////////


	//HTMLページが読み終わったときに呼ばれる処理
	void	_stdcall OnDocumentComplete(IDispatch* pDisp, VARIANT* vURL)
	{
		//■内部処理を削除
	}

tabbrowser61.gif
これで「タブ」に変なタイミングでホームページ名が表示されることがなくなった。

次回は「タブ」にアイコンを表示する。

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


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