第38回 ステータスバー関連処理の実装を見直す (タブブラウザーを作る)

tabbrowser156.gif
これまでにステータスバーにIEコントロールからのメッセージを表示、スクリプトエラーがあったときにエラーメッセージとアイコンの表示、スクリプトエラー時にダブルクリックでエラーの詳細情報を表示する機能を実装した。

しかしその過程でかなりソースコードがゴチャゴチャして崩壊寸前にまで追い込まれている。これからステータスバー関連の処理を整理する。まずはその前段階としてMainFrm.h内のステータスバー関連処理をすべてコメントアウトしてしまう。

ステータスバーの処理はビューからメインウインドウへメッセージを送ることで開始していた。それらのメッセージマップをコメントアウトする。
	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)		//■コメントアウト
//		MESSAGE_HANDLER(WM_DNP_SCRIPTERROR, OnDnpScriptError)			//■コメントアウト
		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_ID_HANDLER(ID_FILE_PRINT, OnFileCommand)
		COMMAND_ID_HANDLER(ID_FILE_PRINT_PREVIEW, OnFileCommand)
		COMMAND_ID_HANDLER(ID_FILE_PRINT_SETUP, OnFileCommand)
		COMMAND_ID_HANDLER(ID_EDIT_COPY, OnFileCommand)
		COMMAND_ID_HANDLER(ID_EDIT_CUT, OnFileCommand)
		COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnFileCommand)
		COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnFileCommand)
		COMMAND_ID_HANDLER(ID_FILE_SAVE, OnFileCommand)
		COMMAND_ID_HANDLER(ID_FILE_SAVE_AS, OnFileCommand)
		COMMAND_ID_HANDLER(ID_FILE_CREATE_SHORTCUT, OnFileCommand)
		COMMAND_ID_HANDLER(ID_FILE_PROPERTY, OnFileCommand)
		COMMAND_ID_HANDLER(ID_EDIT_FIND, OnFileCommand)
		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)
//		NOTIFY_HANDLER(ATL_IDW_STATUS_BAR, NM_DBLCLK, OnStatusBarDblClk)	//■コメントアウト
		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()

tabbrowser157.gif そして関連した関数とメンバー変数をコメントアウトする。
class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,
		public CMessageFilter, public CIdleHandler
{
	CAddressBarCtrl	_wndAddressBar;			// アドレスバー用コンボボックス

	////■コメントアウト
	//CIconManager	_cIconList;

public:

	////■コメントアウト
	////ステータスバーのダブルクリック処理
	//LRESULT OnStatusBarDblClk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
	//{
	//	bHandled = FALSE;

	//	NMMOUSE*	pNmMouse = (NMMOUSE*)pnmh;
	//	CTabBrowser100View*	pView;

	//	if(pNmMouse == NULL)
	//		return	0;

	//	if(pNmMouse->dwItemSpec == 0)
	//	{
	//		//ゼロ番目のペインがダブルクリックされた
	//		pView = GetActivePageView();
	//		if(pView)
	//			pView->ShowScriptError();			//スクリプトエラー情報を表示する
	//	}

	//	return	0;
	//}


	////■コメントアウト
	//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;
	//}

	////■コメントアウト
	//CProgressBarCtrl	_wndProgressBar;			//ステータスバーに配置するプログレスバーコントロール

	////■コメントアウト
	////bVisible=falseならプログレスバーを消す
	////nProgress < 0、nProgressMax < 0ならプログレス設定はしない
	////nProgressMax < nProgressなら強制的に非表示にする
	//bool	RefreshProgressBar(int nProgress=-1,int nProgressMax=-1,bool bVisible=true)
	//{
	//	if(::IsWindow(m_hWndStatusBar) == FALSE)
	//		return	false;				//ステータスバーがない

	//	int		nProgressWidth = 100;			//■プログレスバーの幅は100px固定とする
	//	CRect	rect;
	//	CStatusBarCtrl	wndStatusBar = m_hWndStatusBar;

	//	if(nProgressMax < nProgress)
	//		bVisible = false;

	//	if(bVisible == false)
	//		nProgressWidth = 0;

	//	//ステータスバーのペインの作成/更新
	//	{
	//		int		pnParts[2];						//2つペインを作成(1つはデフォルト、もう1つはプログレスバー用)

	//		wndStatusBar.GetClientRect(&rect);
	//		pnParts[0] = rect.Width() - nProgressWidth;
	//		pnParts[1] = rect.Width();

	//		wndStatusBar.SetParts(sizeof(pnParts) / sizeof(pnParts[0]),pnParts);
	//	}


	//	//プログレスバーの生成/更新
	//	{
	//		wndStatusBar.GetRect(1,&rect);			//2つめのペインをプログレスバーに利用する

	//		if(_wndProgressBar.IsWindow() == FALSE)
	//			_wndProgressBar.Create(m_hWndStatusBar,rect,0,WS_CHILD);	//プログレスバーを生成
	//		else
	//			_wndProgressBar.MoveWindow(&rect);			//位置を移動

	//		if(bVisible)
	//		{
	//			if(_wndProgressBar.IsWindowVisible() == FALSE)
	//				_wndProgressBar.ShowWindow(SW_NORMAL);		//可視に
	//		}
	//		else
	//		{
	//			if(_wndProgressBar.IsWindowVisible())
	//				_wndProgressBar.ShowWindow(SW_HIDE);		//不可視に
	//		}

	//		//プログレスの設定
	//		if(nProgressMax >= 0)
	//			_wndProgressBar.SetRange(0,nProgressMax);
	//		if(nProgress >= 0)
	//			_wndProgressBar.SetPos(nProgress);
	//	}

	//	return	true;
	//}




	////■コメントアウト
	////ステータスバーの表示テキストの変更処理
	////アクティブなタブの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;
	//}

tabbrowser158.gif Visual Studioではコメントアウトしたい部分を選択して、[Ctrl+K]→[Ctrl+C]とキー操作をするとその部分がコメントアウトされる。逆にコメントを外したい場合は[Ctrl+U]とキー操作する。覚えておくと今回のようにコメントアウトする部分が多いときに便利だ。
	//タブが選択されたときの処理
	LRESULT OnTabPageActivated(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
	{
		if(pnmh == NULL)
			return	0;

		//全てのビューに対してタブ変更があったことを通知
		{
			int		i;
			int		nCount;
			CTabBrowser100View*	pView;

			int kk=m_view.GetActivePage();

			nCount = m_view.GetPageCount();
			for(i = 0; i < nCount; i++)
			{
				pView = GetPageView(i);
				if(pView == NULL)
					continue;

				if(pnmh->idFrom == i)
					pView->OnTabPageChange(true);
				else
					pView->OnTabPageChange(false);
			}
		}

		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);
		//}

		////■コメントアウト
		////ステータスバーのエラーアイコン変更
		//{
		//	CStatusBarCtrl	wndStatusBar = m_hWndStatusBar;

		//	if(wndStatusBar.IsWindow())
		//	{
		//		if(pView->IsPageError())
		//			wndStatusBar.SetIcon(0,_cIconList.GetIcon(CIconManager::ICON_WARNING_SM));
		//		else
		//			wndStatusBar.SetIcon(0,NULL);
		//	}
		//}

		////■コメントアウト
		////プログレス変更
		//{
		//	long	nProgress;
		//	long	nProgressMax;

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

		return	0;
	}


	////■コメントアウト
	////ステータスバーのエラーアイコン変更
	//LRESULT OnDnpScriptError(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	//{
	//	BOOL	bPageError = (BOOL)wParam;
	//	CStatusBarCtrl	wndStatusBar = m_hWndStatusBar;

	//	if(wndStatusBar.IsWindow())
	//	{
	//		if(bPageError)
	//			wndStatusBar.SetIcon(0,_cIconList.GetIcon(CIconManager::ICON_WARNING_SM));
	//		else
	//			wndStatusBar.SetIcon(0,NULL);
	//	}

	//	return	0;
	//}

tabbrowser159.gif
ビューウインドウ側からメッセージを送る部分はコメントアウトしていないが、これでビルド/実行するとステータスバー関連の機能がすべて使えなくなった。

次回はステータスバー関連機能の再実装を行う。

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


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