![]()
前回はステータスバーにプログレスコントロールを配置した。今回はプログレスコントロールにIEコントロールから受けとった進行状況を表示する。
基本的な流れはステータスバーにIEコントロールからのメッセージを表示したときと同じだ。
「stdafx.h」にIEコントロールからの進行状況を知らせる独自メッセージを定義する。#define WM_DNP_CHANGEPROGRESS (WM_APP + 5) //■追加
//■2つ変数を追加
long _nLastProgress; //最後に受け取ったプログレス情報
long _nLastProgressMax; //最後に受け取ったプログレス最大値
//■処理を実装
void __stdcall OnProgressChange(long lProgress,long lProgressMax)
{
if(lProgress < 0 || (lProgressMax == 0 && lProgress == 0)) //MSDNには記述がないが(0,0)で終わることが多いため(0,0)でも非表示
lProgressMax = lProgress - 1; //lProgressMax < lProgress にしておく -> 自動的にプログレスバーが消える
//状態を保存しておく
_nLastProgress = lProgress;
_nLastProgressMax = lProgressMax;
if(_pTabView == NULL || _pTabView->GetActivePage() != _pTabView->PageIndexFromHwnd(m_hWnd))
return; //このビューがアクティブでなければこれ以降処理しない
//メインウインドウに変更を通知する
GetTopLevelWindow().SendMessage(WM_DNP_CHANGEPROGRESS,(WPARAM)_nLastProgress,(LPARAM)_nLastProgressMax);
}
//■追加
//最後にIEコントロールから受け取ったプログレス情報を返す
void GetLastProgress(long& nProgress,long& nProgressMax)
{
nProgress = _nLastProgress;
nProgressMax = _nLastProgressMax;
}
CTabBrowser100View(CTabView* pTabView)
{
_pTabView = pTabView;
_nLastProgress = 0; //■追加
_nLastProgressMax = -1; //■追加
}
![]()
そして「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) //■追加
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()
//■追加
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;
}
//タブが選択されたときの処理
LRESULT OnTabPageActivated(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
if(pnmh == NULL)
return 0;
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);
}
//■追加
//プログレス変更
{
long nProgress;
long nProgressMax;
pView->GetLastProgress(nProgress,nProgressMax);
RefreshProgressBar(nProgress,nProgressMax);
}
return 0;
}
![]()
これでビルド/実行するとステータスバーにあるプログレスバーコントロールにページの読み込み状況が表示されるようになった。
次回はちょっと趣向を変えて「Googleツールバー」を利用する。実現方法がまだわからないので挫折したらほかの話題に変わるかもしれません。
