
これまでにステータスバーに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()

そして関連した関数とメンバー変数をコメントアウトする。
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;
//}

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

ビューウインドウ側からメッセージを送る部分はコメントアウトしていないが、これでビルド/実行するとステータスバー関連の機能がすべて使えなくなった。
次回はステータスバー関連機能の再実装を行う。
プロジェクトファイルをダウンロード