![]()
Internet Explorerはステータスバーにプログレスバーが表示され、ページの読み込み状態がひと目でわかるようになっている。
今回はInternet Explorerのように進行状況を表示するためステータスバーにプログレスバーコントロールを配置する。
CStatusBarCtrl::SetParts() を利用してペインを1つ作り、そのうちの1つにプログレスバーコントロールが重なるように配置した。表示するタイミングはWM_SIZEを利用し、ステータスバーががメインウインドウのサイズ変更されたときもきちんと更新されるようにした。 また、今回はプログレスバーを表示するにとどめ、進行状況の表示はしていない。
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)
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()
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;
}
//■追加
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
bHandled = FALSE;
RefreshProgressBar(50,100); //プログレスバーを50%で表示
return 0;
}
![]()
これでビルド/実行するとステータスバーにプログレスバーコントロールが表示された。
次回はこのプログレスバーコントロールにIEコントロールから受け取った進行状況を表示する。
