VC++ 在任务栏图标上显示进度条效果

该功能主要是通过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);
}

猜你喜欢

转载自blog.csdn.net/u012156872/article/details/106196246