该功能主要是通过COM接口ITaskbarList3* 来实现进度效果显示功能。
头文件定义(CSWTaskBarList.h):
#pragma once
#include <Windows.h>
#include <Shobjidl.h>
#include <Commctrl.h>
#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);
}