第23回 プログレスバーでページの読み込み状況を表示する (タブブラウザーを作る)

tabbrowser86.gif
前回はステータスバーにプログレスコントロールを配置した。今回はプログレスコントロールにIEコントロールから受けとった進行状況を表示する。

基本的な流れはステータスバーにIEコントロールからのメッセージを表示したときと同じだ。

「stdafx.h」にIEコントロールからの進行状況を知らせる独自メッセージを定義する。
#define	WM_DNP_CHANGEPROGRESS	(WM_APP + 5)		//■追加

tabbrowser88.gif 次にビュークラスでIEコントロールからのDISPID_PROGRESSCHANGEイベントを受信してメインウインドウへ通知する処理を実装する。
	//■2つ変数を追加
	long	_nLastProgress;			//最後に受け取ったプログレス情報
	long	_nLastProgressMax;		//最後に受け取ったプログレス最大値

	//■処理を実装
	void __stdcall OnProgressChange(long lProgress,long lProgressMax)
	{
		if(lProgress < 0 || (lProgressMax == 0 && lProgress == 0))	//MSDNには記述がないが(0,0)で終わることが多いため(0,0)でも非表示
			lProgressMax = lProgress - 1;		//lProgressMax < lProgress にしておく -> 自動的にプログレスバーが消える

		//状態を保存しておく
		_nLastProgress		= lProgress;
		_nLastProgressMax	= lProgressMax;

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

		//メインウインドウに変更を通知する
		GetTopLevelWindow().SendMessage(WM_DNP_CHANGEPROGRESS,(WPARAM)_nLastProgress,(LPARAM)_nLastProgressMax);
	}

	//■追加
	//最後にIEコントロールから受け取ったプログレス情報を返す
	void	GetLastProgress(long& nProgress,long& nProgressMax)
	{
		nProgress		= _nLastProgress;
		nProgressMax	= _nLastProgressMax;
	}

tabbrowser87.gif long型のメンバー変数_nLastProgressと_nLastProgressMaxをコンストラクタで初期化する処理を忘れずに追加しておく。
	CTabBrowser100View(CTabView* pTabView)
	{
		_pTabView = pTabView;
		_nLastProgress		= 0;		//■追加
		_nLastProgressMax	= -1;		//■追加
	}

tabbrowser89.gif
そして「MainFrm.h」側で独自メッセージを受信したときにそれをプログレスバーに表示する処理を追加する。

また、OnSize内でタブブラウザー起動時にプログレスバーが表示されないようにIsWindow()でチェックする処理を入れた。
	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)
		MESSAGE_HANDLER(WM_DNP_CHANGEPROGRESS, OnDnpChangeProgress)		//■追加
		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)
		MESSAGE_HANDLER(WM_SIZE, OnSize)
		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()

	//■追加
	LRESULT OnDnpChangeProgress(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		RefreshProgressBar((long)wParam,(long)lParam);
		return	0;
	}


	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		bHandled = FALSE;

		//■変更
		if(_wndProgressBar.IsWindow())
			RefreshProgressBar();		//プログレスバー表示更新

		return	0;
	}

tabbrowser90.gif 最後に、タブが切り替わったときに、新しいタブでの進行状況が表示されるように、OnTabPageActivated()の中にプログレスバーの更新処理を入れておく。
	//タブが選択されたときの処理
	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);
		}

		//■追加
		//プログレス変更
		{
			long	nProgress;
			long	nProgressMax;

			pView->GetLastProgress(nProgress,nProgressMax);
			RefreshProgressBar(nProgress,nProgressMax);
		}

		return	0;
	}

tabbrowser91.gif
これでビルド/実行するとステータスバーにあるプログレスバーコントロールにページの読み込み状況が表示されるようになった。

次回はちょっと趣向を変えて「Googleツールバー」を利用する。実現方法がまだわからないので挫折したらほかの話題に変わるかもしれません。

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


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