第40回 ステータスバーダブルクリック処理を再実装する (タブブラウザーを作る)

tabbrowser166.gif
前回はステータスバーへメッセージやアイコンを表示する部分を再実装した。今回はスクリプトエラーが発生しているときにステータスバーのダブルクリックでエラーの詳細情報を表示する処理を再実装する。

ステータスバー用のクラスCIELikeStatusbarへダブルクリックを検出するためのメッセージ処理を追加する。これまではメインウインドウでNM_DBLCLKを処理することで簡単にダブルクリックされたペインまで取得できた。しかし今回はペインのRECTからダブルクリックされたペインを計算している。
class	CIELikeStatusbar	: public CWindowImpl<CIELikeStatusbar>
{
	CIconManager	_cIconList;

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


	CAtlString	_strText;

	long	_nLastProgress;			//最後に受け取ったプログレス情報
	long	_nLastProgressMax;		//最後に受け取ったプログレス最大値

	bool	_bPageError;	//現在のページでスクリプトエラーなどがあればtrue、通常はfalse

	HWND	_hWndNotify;	//■追加 ダブルクリック通知先。通常ビューウインドウのHWND
public:

	CIELikeStatusbar()
	{
		_hWndNotify			= NULL;		//■追加
		_nLastProgress		= -1;
		_nLastProgressMax	= -1;
		_bPageError = false;
	}


	BEGIN_MSG_MAP(CIELikeStatusbar)
		MESSAGE_HANDLER(WM_SIZE, OnSize)
		MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk)		//■追加
	END_MSG_MAP()


	//■追加
	//ステータスバーのダブルクリック処理
	LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		int		i;
		RECT	rect;
		BOOL	ret;
		POINT	pt;

		CStatusBarCtrl	wndStatusBar = m_hWnd;

		if(_hWndNotify == NULL || ::IsWindow(_hWndNotify) == FALSE)
			return	0;		//通知先が死んでいたらこれ以降処理しない

		::GetCursorPos(&pt);
		ScreenToClient(&pt);

		i = 0;
		while(1)
		{
			ret = wndStatusBar.GetRect(i,&rect);
			if(ret == FALSE)
				break;

			if(::PtInRect(&rect,pt))
			{
				//i番目のペインがダブルクリックされた
				if(i == 0)
					::SendMessage(_hWndNotify,WM_DNP_SHOWSCRIPTERROR,NULL,NULL);

				break;
			}

			i++;
		}

		return	0;
	}

	//■追加
	BOOL	SubclassWindow(HWND hWnd,HWND hWndNotify)
	{
		_hWndNotify = hWndNotify;

		return	__super::SubclassWindow(hWnd);
	}

tabbrowser167.gif そしてステータスバークラスから送られてきた独自メッセージのハンドラをビュークラスに追加する。
	BEGIN_MSG_MAP(CTabBrowser100View)
		MESSAGE_HANDLER(WM_DNP_SCRIPTERROR, OnDnpScriptError)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
		MESSAGE_HANDLER(WM_DNP_SHOWSCRIPTERROR, OnShowScriptError)		//■追加
	END_MSG_MAP()

tabbrowser168.gif また、サブクラス化するときにビュークラスのHWNDがステータスバーにわたるようにしておく。
	//■追加
	LRESULT OnShowScriptError(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		ShowScriptError();
		return	0;
	}

	CIELikeStatusbar	_wndStatusbar;


	//メインウインドウから呼ばれる
	//bCapture=trueでこのビューがステータスバーを制御する
	//bCapture=falseでこのビューがステータスバーを解放する
	bool	SetStatusBar(HWND hWnd,bool bCapture)
	{
		if(bCapture)
		{
			if(_wndStatusbar.IsWindow())
				return	false;
			_wndStatusbar.SubclassWindow(hWnd,m_hWnd);			//■変更
			_wndStatusbar.Refresh(true);
		}
		else
		{
			if(_wndStatusbar.IsWindow())
				_wndStatusbar.UnsubclassWindow();
			_wndStatusbar.Refresh(false);
		}

		return	true;
	}

tabbrowser169.gif 最後に「stdafx.h」で新しい独自メッセージWM_DNP_SHOWSCRIPTERRORを追加する。また不要になって使われていないメッセージを削除しておいた。
#define	WM_DNP_CHANGEFOCUS		(WM_APP + 1)
#define	WM_DNP_CREATENEWTAB		(WM_APP + 2)
#define	WM_DNP_CHANGEADDRESS	(WM_APP + 3)
//#define	WM_DNP_CHANGESTATUSTEXT	(WM_APP + 4)		//■削除
//#define	WM_DNP_CHANGEPROGRESS	(WM_APP + 5)		//■削除
#define	WM_DNP_SCRIPTERROR		(WM_APP + 6)
#define	WM_DNP_SHOWSCRIPTERROR	(WM_APP + 7)		//■追加

tabbrowser170.gif
これでビルド/実行すると再びスクリプトエラーの詳細情報を見れるようになった。

だんだんソースコードが増えてきたので、次回は少しソースコードを整理する。

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


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