Win7: タスクバープログラミング(オーバーレイアイコンとプログレスバー)

タスクバープログラミングの第二弾です。
今回は、オーバーレイアイコンとプログレスバーに関するネタです。

  • タスクバーへのオーバーレイアイコン
    • プログラムアイコンに重ねて表示することができる

  • タスクバーへのプログレスバー
    • プログラムアイコンの背景をプログレスバーとして表示することができる

イメージがわかってもらえたと思います。
まずは、オーバレイアイコンの実装方法を説明します。

タスクバーへのオーバーレイアイコンですが、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 対応のアプリケーションでは、ぜひ、実装してみてはいかがでしょうか。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。