タスクバープログラミングの第二弾です。
今回は、オーバーレイアイコンとプログレスバーに関するネタです。
- タスクバーへのプログレスバー
- プログラムアイコンの背景をプログレスバーとして表示することができる
イメージがわかってもらえたと思います。
まずは、オーバレイアイコンの実装方法を説明します。
タスクバーへのオーバーレイアイコンですが、ITaskbarList3 インターフェースにある SetOverlayIcon メソッドを使用します。
使い方は非常に簡単です。(コードを簡潔にするために ATL を使っています)
CComPtr<ITaskbarList3> m_ptrTaskbarList3;
HICON m_hOverlayIcon; // アイコンリソースハンドル
・・・
LRESULT CMainDlg::OnInitDialog(UINT, WPARAM, LPARAM, BOOL& )
{
・・・
// オーバーレイアイコンの読み込み
m_hOverlayIcon = (HICON)LoadImage(_Module.m_hInstResource,
MAKEINTRESOURCE(IDI_OVERLAY),
IMAGE_ICON,
::GetSystemMetrics(SM_CXICON),
::GetSystemMetrics(SM_CYICON),
LR_DEFAULTCOLOR);
// ITaskbarList3 インターフェースのアクティベート
HRESULT hRes = m_ptrTaskbarList3.CoCreateInstance(CLSID_TaskbarList);
ATLASSERT(SUCCEEDED(hRes));
・・・
}
void CMainDlg::SetTaskbarOverlayIcon(BOOL b)
{
HRESULT hRes;
if (b)
{
// オーバーレイアイコンの表示
hRes = m_ptrTaskbarList3->SetOverlayIcon(
m_hWnd, m_hOverlayIcon, TEXT("ErrorInformation"));
}
else
{
// オーバーレイアイコンを消す
hRes = m_ptrTaskbarList3->SetOverlayIcon(
m_hWnd, NULL, TEXT("AppDemo2"));
}
ATLASSERT(SUCCEEDED(hRes));
}
上記コードのように、SetOverlayIcon メソッドを使い、アイコンリソースハンドルを指定するだけです。
アイコンを消す場合には、アイコンリソースハンドルを NULL に指定します。
次に、プログレスバーの実装方法を説明します。これも ITaskbarList3 インターフェースを使います。
このインターフェースにある SetProgressState メソッドと SetProgressValue メソッドを使用します。
先ほどと同じようにコードサンプルを載せておきます。(コードを簡潔にするために ATL を使っています)
CComPtr<ITaskbarList3> m_ptrTaskbarList3;
UINT m_uTimerID; // タイマー識別子
UINT m_nRef;
WTL::CProgressBarCtrl m_ProgressBar;
・・・
LRESULT CMainDlg::OnInitDialog(UINT, WPARAM, LPARAM, BOOL& )
{
・・・
// ITaskbarList3 インターフェースのアクティベート
HRESULT hRes = m_ptrTaskbarList3.CoCreateInstance(CLSID_TaskbarList);
ATLASSERT(SUCCEEDED(hRes));
m_ProgressBar.Attach(GetDlgItem(IDC_PROGRESS));
・・・
}
LRESULT CMainDlg::OnBnClickedProgressBar(WORD, WORD, HWND, BOOL& )
{
// タスクバー プログレスバーの値をトータルで 100 に設定
m_ptrTaskbarList3->SetProgressValue(m_hWnd, 0, 100);
・・・
// タイマーの仕込み
m_uTimerID = SetTimer(UM_TIMEREVENT, 500);
if (m_uTimerID == 0)
{
DWORD dwErr = GetLastError();
// エラー処理
}
return 0;
}
LRESULT CMainDlg::OnTimer(UINT, WPARAM wParam, LPARAM, BOOL& )
{
if (wParam == UM_TIMEREVENT)
{
m_nRef++;
・・・
// タスクバー プログレスバーの色を指定する
m_ptrTaskbarList3->SetProgressState(m_hWnd, TBPF_NORMAL);
// タスクバー プログレスバーの位置を進める
m_ptrTaskbarList3->SetProgressValue(m_hWnd, m_nRef * 5, 100);
if (m_nRef == 20)
{
ClearTimerEvent(); // この中で KillTimer() を呼んでいる
m_nRef = 0;
・・・
}
}
return 0;
}
タスクバー プログレスバーの色ですが、SetProgressState メソッドを呼び出す際のパラメーターで制御することができます。
上記コードでは、TBPF_NORMAL を指定しています。この場合、グリーンで表示されます。
TBPF_ERROR を指定するとレッドになり、TBPF_PAUSED を指定するとイエローになります。
Windows 7 タスクバーに表示されるアイコンですが、マウスを Hover した際、プログラムアイコンの色をベースに
Hover 色が決定されます。
MSDN フォーラムでも回答したのですが、タスクバー プログレスバーを使う際には、プログラムアイコンのデザインで
あまり、グリーン、レッド、イエローを使わない方がいいかもしれません。
でないと、せっかく、プログレスバーにステータス表示しているにもかかわらず、よく見えないということになってしまい
本末転送になってしまいます。
オーバーレイアイコンやプログレスバーは、プログラムの状態を表示する非常によい手段だと思います。
Windows 7 対応のアプリケーションでは、ぜひ、実装してみてはいかがでしょうか。