第21回 IEコントロールからのメッセージをステータスバーに表示する (タブブラウザーを作る)

tabbrowser80.gif
Internet Explorerではステータスバーに「ページが表示されました」などのメッセージが表示される。この文字列はIEコントロールのイベントDISPID_STATUSTEXTCHANGEで受信できる。今回はこれを利用してステータスバーにメッセージを表示する。

ステータスバーメッセージ表示機能の実装はアドレスバーに開かれているページのURLを表示したのと基本的に同じ流れだ。

まず「stdafx.h」にメインウインドウへメッセージが変更されたことを知らせる独自メッセージを定義する。
#define	WM_DNP_CHANGESTATUSTEXT	(WM_APP + 4)			//■追加

tabbrowser81.gif 次にビュークラスの中にIEコントロールからのイベントを受信したときにメインウインドウへ通知する処理を実装する。またユーザーによって「タブ」が切りかえられたときに、そのページ用のステータスバーメッセージがきちんと表示されるように取得用の関数GetLastStatusText()も実装しておく。
	CAtlString	_strLastStatusText;		//■追加 最後に送られてきたステータステキストを保管

	void __stdcall OnStatusTextChange(BSTR bstrText)
	{
		//■処理を実装

		_strLastStatusText = bstrText;		//いつでも参照できるようにクラスのメンバーに保存しておく

		if(_pTabView == NULL || _pTabView->GetActivePage() != _pTabView->PageIndexFromHwnd(m_hWnd))
			return;			//このビューがアクティブでなければこれ以降処理しない

		//メインウインドウに変更を通知する
		GetTopLevelWindow().SendMessage(WM_DNP_CHANGESTATUSTEXT,(WPARAM)(LPCTSTR)_strLastStatusText);
	}

	//■追加
	//最後にIEコントロールから受け取ったステータスバー用メッセージを返す
	void	GetLastStatusText(CAtlString& strText)
	{
		strText = _strLastStatusText;
	}

tabbrowser82.gif そして「MainFrm.h」内に独自メッセージWM_DNP_CHANGESTATUSTEXTを受け取ったときや、タブが切り替わったときにステータスバーの表示を更新する処理を追加する。
	BEGIN_MSG_MAP(CMainFrame)
		MESSAGE_HANDLER(WM_DNP_CREATENEWTAB, OnDnpCreateNewTab)
		MESSAGE_HANDLER(WM_DNP_CHANGEFOCUS, OnDnpChangeFocus)
		MESSAGE_HANDLER(WM_DNP_CHANGEADDRESS, OnDnpChangeAddress)
		MESSAGE_HANDLER(WM_DNP_CHANGESTATUSTEXT, OnDnpChangeStatusText)	//■追加
		NOTIFY_CODE_HANDLER(CBEN_ENDEDIT, OnAddressbarEnter)
		MESSAGE_HANDLER(WM_CREATE, OnCreate)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
		COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)
		COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
		COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)
		COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)
		COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
		COMMAND_ID_HANDLER(ID_WINDOW_CLOSE, OnWindowClose)
		COMMAND_ID_HANDLER(ID_WINDOW_CLOSE_ALL, OnWindowCloseAll)
		COMMAND_RANGE_HANDLER(ID_WINDOW_TABFIRST, ID_WINDOW_TABLAST, OnWindowActivate)
		COMMAND_ID_HANDLER(ID_IE_BACK, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_NEXT, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_STOP, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_REFRESH, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_ADDFAVORITE, OnIEAddFavorite)
		COMMAND_ID_HANDLER(ID_IE_ORGANIZE_FAVORITE, OnIEOrganizeFavorite)
		NOTIFY_CODE_HANDLER(TBVN_CONTEXTMENU, OnTabContextMenu)
		NOTIFY_CODE_HANDLER(TBVN_PAGEACTIVATED, OnTabPageActivated)
		MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
		COMMAND_RANGE_HANDLER(ID_FAVORITE_FIRST,ID_FAVORITE_LAST,OnFavorite)
		CHAIN_MSG_MAP_MEMBER(_cFovMenu)
		CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
		CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
	END_MSG_MAP()

	//■追加
	//ステータスバーの表示テキストの変更処理
	//アクティブなタブのIEでステータスバーのテキストが変わったときにメッセージが届く
	LRESULT OnDnpChangeStatusText(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		LPCTSTR		pszText = (LPCTSTR)wParam;

		if(pszText == NULL)
			return	0;

		if(::IsWindow(m_hWndStatusBar))
			::SetWindowText(m_hWndStatusBar,pszText);

		return	0;
	}


	//■処理を変更/追加
	//タブが選択されたときの処理
	LRESULT OnTabPageActivated(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
	{
		if(pnmh == NULL)
			return	0;

		bool		ret;
		CTabBrowser100View*	pView;

		pView = GetActivePageView();		//アクティブビュー取得
		if(pView == NULL)
			return	0;

		//アドレスバーのURL変更
		{
			CAtlString	strURL;

			ret = pView->GetURL(strURL);		//URL取得
			if(ret)
				_wndAddressBar.SetWindowText(strURL);
		}

		//ステータスバーのテキスト変更
		{
			CAtlString	strText;

			pView->GetLastStatusText(strText);
			if(::IsWindow(m_hWndStatusBar))
				::SetWindowText(m_hWndStatusBar,strText);
		}

		return	0;
	}

tabbrowser83.gif
これでビルド/実行するとステータスバーにIEコントロールからのメッセージが表示されるようになった。

次回はダウンロード状況などがわかるようにステータスバーにプログレスバーを配置する。

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


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