OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

Windows7 ThmbnailToolbar ボタンを作る(その2)

2009/12/26 作成

ついでに、トグル動作をするThumbnailToolbarボタンをメモしておきます。

トグル動作をさせるにボタンアイコンを更新します。更新はThumbBarUpdateButtons()でボタンを更新できます。

メディアプレーヤーもどきの、RunボタンとPauseボタンをボタンを押下するたびにボタンアイコン更新するプログラムを考えます。

アイコンは、RunボタンとPauseボタンの2個を作成します。

PauseButton Pauseボタン(IDI_ICON1)
RunButton Runボタン(IDI_ICON2)

WindowProcハンドラはこんな感じになります。
(ハンドラ内に処理を押し込むためにstatic変数としていますがインスタンス変数でも可です。)

WindowProc()ハンドラ:
 LRESULT CTaskbar2Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
 {
     // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
     static UINT msgTBC = (UINT)-1;
     static HICON hIcon1 = 0;
     static HICON hIcon2 = 0;
     static THUMBBUTTON button;
     static BOOL bRun = FALSE;
	
     switch(message){
     case WM_CREATE:
         msgTBC = RegisterWindowMessage(_T("TaskbarButtonCreated"));
         hIcon1 = AfxGetApp()->LoadIcon(IDI_ICON1);
         hIcon2 = AfxGetApp()->LoadIcon(IDI_ICON2);
         //権限を昇格する場合を考慮するならメッセージフィルタにスルー指示を行う
         //ChangeWindowMessageFilter(msgTBC , MSGFLT_ADD);
         //ChangeWindowMessageFilter(WM_COMMAND, MSGFLT_ADD);
         break;
     case WM_COMMAND:
         int const CtlId = LOWORD(wParam);
         switch (CtlId){
         case IDTB_BUTTON1://Thumbnail ボタン1が押された処理
             {
                 BOOL bNextState = FALSE;
                 if(TRUE == bRun){
                     button.dwMask = THB_ICON|THB_TOOLTIP;
                     button.hIcon = hIcon1;//Pause
                     StringCchCopy(button.szTip, 
                     ARRAYSIZE(button.szTip), 
                         _T("Pause"));
                     bNextState = FALSE;
                 }
                 else{
                     button.dwMask = THB_ICON|THB_TOOLTIP;
                     button.hIcon = hIcon2;//Run
                     StringCchCopy(button.szTip, 
                         ARRAYSIZE(button.szTip), _T("Run"));
                     bNextState = TRUE;
                 }
                 // Create an instance of ITaskbarList3
ITaskbarList3 *ptbl; HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&ptbl)); if (SUCCEEDED(hr)){ // Attach the toolbar to the thumbnail. hr = ptbl->ThumbBarUpdateButtons(this->m_hWnd, 1, &button); if(SUCCEEDED(hr)){ bRun = bNextState; } } else{ //error !comインスタンス生成失敗 } ptbl->Release(); } return 0; } break; } if(message == msgTBC){ //The taskbar button has been created button.dwMask = THB_ICON|THB_TOOLTIP|THB_FLAGS; button.iId = IDTB_BUTTON1; button.hIcon = hIcon2;//Run StringCchCopy(button.szTip, ARRAYSIZE(button.szTip), _T("Run")); button.dwFlags = THBF_ENABLED; // Create an instance of ITaskbarList3 ITaskbarList3 *ptbl; HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&ptbl)); if (SUCCEEDED(hr)){ // Attach the toolbar to the thumbnail. hr = ptbl->ThumbBarAddButtons(this->m_hWnd, 1, &button); if(SUCCEEDED(hr)){ bRun = TRUE; } } else{ //error !comインスタンス生成失敗 } ptbl->Release(); } return CDialog::WindowProc(message, wParam, lParam); }

実行すると、RunボタンとPauseボタンが交互に表示します。

Run状態  
Pause状態