![]()
前回はステータスバーへメッセージやアイコンを表示する部分を再実装した。今回はスクリプトエラーが発生しているときにステータスバーのダブルクリックでエラーの詳細情報を表示する処理を再実装する。
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);
}
BEGIN_MSG_MAP(CTabBrowser100View) MESSAGE_HANDLER(WM_DNP_SCRIPTERROR, OnDnpScriptError) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) MESSAGE_HANDLER(WM_DNP_SHOWSCRIPTERROR, OnShowScriptError) //■追加 END_MSG_MAP()
//■追加
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;
}
#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) //■追加
![]()
これでビルド/実行すると再びスクリプトエラーの詳細情報を見れるようになった。
だんだんソースコードが増えてきたので、次回は少しソースコードを整理する。
