VC++タスクバーアイコンにプログレスバー効果を表示


この機能は主にCOMインタフェースITaskbarList 3*により進捗効果表示機能を実現している.
ヘッダファイル定義(CSWTaskBarList.h):
#pragma once

#include 
#include 
#include 
#pragma comment(lib, "Comctl32.lib")

namespace sw {
	class CSWTaskBarList
	{
		typedef struct tagTASKBARBUTTON {
			HBITMAP		hBitmap;
			wchar_t*	szTip;
			UINT		ID;
		}TASKBARBUTTON;

	public:
		CSWTaskBarList();
		~CSWTaskBarList();

	private:
		HIMAGELIST		m_hImageList;					//      
		ITaskbarList3*	m_pTaskBarlist;
		HWND			m_hWnd;

	public:
		//     
		void Attach(HWND hWnd);

		//     
		BOOL AddButton(TASKBARBUTTON* pButtonsInfo, UINT nButtons);

		//     
		void SetProgressValue(ULONGLONG ullCompleted, ULONGLONG ullTotal);

		//     
		void SetProgressState(TBPFLAG tbpFlags/* = TBPF_NOPROGRESS*/);
	};
}

ソース実装(CSWTaskBarList.cpp):
#include "pch.h"
#include "CSWTaskBarList.h"

using namespace sw;
 
CSWTaskBarList::CSWTaskBarList()
{
	m_hImageList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 0);
}

CSWTaskBarList::~CSWTaskBarList()
{
	ImageList_Destroy(m_hImageList);
}

//     
void CSWTaskBarList::Attach(HWND hWnd)
{
	m_hWnd = hWnd;
	if (NULL == m_pTaskBarlist)
	{
		CoCreateInstance(
			CLSID_TaskbarList, NULL, CLSCTX_ALL,
			IID_ITaskbarList3, (void**)&m_pTaskBarlist);
	}
	m_pTaskBarlist->SetProgressState(m_hWnd, TBPF_INDETERMINATE);
}

//     
BOOL CSWTaskBarList::AddButton(TASKBARBUTTON* pButtonsInfo, UINT nButtons)
{
	THUMBBUTTON* pThumbButtons = (THUMBBUTTON*)malloc(nButtons * sizeof(THUMBBUTTON));

	DWORD dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
	for (UINT i = 0; i < nButtons; i++) {
		ImageList_Add(m_hImageList, pButtonsInfo[i].hBitmap, NULL);
		pThumbButtons[i].dwMask = (THUMBBUTTONMASK)dwMask;
		pThumbButtons[i].iId = pButtonsInfo[i].ID;
		pThumbButtons[i].iBitmap = 0;
		memset(pThumbButtons[i].szTip, 0, sizeof(wchar_t) * 260);
		CopyMemory(pThumbButtons[i].szTip, pButtonsInfo[i].szTip, sizeof(wchar_t) * wcslen(pButtonsInfo[i].szTip));
		pThumbButtons[i].dwFlags = THBF_ENABLED;
	}

	HRESULT hr = CoInitialize(NULL);
	hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pTaskBarlist));
	if (FAILED(hr))
		return FALSE;

	hr = m_pTaskBarlist->ThumbBarSetImageList(m_hWnd, m_hImageList);
	hr = m_pTaskBarlist->ThumbBarAddButtons(m_hWnd, nButtons, pThumbButtons);

	free(pThumbButtons);
	return TRUE;
}

//     
void CSWTaskBarList::SetProgressValue(ULONGLONG ullCompleted, ULONGLONG ullTotal)
{
	m_pTaskBarlist->SetProgressValue(m_hWnd, ullCompleted, ullTotal);
}

//     
void CSWTaskBarList::SetProgressState(TBPFLAG tbpFlags = TBPF_NOPROGRESS)
{
	m_pTaskBarlist->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
}