Yan`s Notepad

--- My Notepad......Articles, tools and etc.
任务栏缩略图按钮
这次的目的,是实现任务栏预览图上的那个小按钮。也就是下面的这个:
small
这个东西,百度找“任务栏拓展”也找不到,找任务栏按钮更是没有。实在没办法。上次在群里问,一位大大说是ITaskbarList3接口,便在msdn上简单的了解了这个接口,简单的编写了一下:
// 文件:ITaskbarListClass.h
//
#pragma once

#include <Windows.h>
#include <Shobjidl.h>
#include <Commctrl.h>
#pragma comment(lib, "Comctl32.lib")

typedef struct tagTASKBARBUTTONADD {
	HBITMAP hBmp;
	wchar_t *wcbuff;
	int btnID;
}TASKBARBUTTONADD;

// 对外开放的函数

// 初始化ITaskbarList3类
bool ITaskbarList3_init();
// 释放
bool ITaskbarList3_free();
// 添加按钮
bool ITaskbarList3_AddButton(HWND, TASKBARBUTTONADD*, int);
// 文件:ITaskbarListClass.cpp
// 
#include "ITaskbarListClass.h"

HIMAGELIST		hImgL;					// 按钮的图标
ITaskbarList3	*ptbl;

bool ITaskbarList3_init() {
	hImgL = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 0);
	return TRUE;
}

bool ITaskbarList3_free() {
	ImageList_Destroy(hImgL);
	return TRUE;
}

bool ITaskbarList3_AddButton(HWND hWnd, TASKBARBUTTONADD *bmpbuff, int cbSize) {
	THUMBBUTTON *thbBtn = (THUMBBUTTON*)malloc(cbSize * sizeof(THUMBBUTTON));

	DWORD dwMask = THB_BITMAP | THB_TOOLTIP;
	for (int i = 0; i < cbSize; i++) {
		ImageList_Add(hImgL, bmpbuff[i].hBmp, NULL);
		thbBtn[i].dwMask = (THUMBBUTTONMASK)dwMask;
		thbBtn[i].iId = bmpbuff[i].btnID;	// 按钮ID
		thbBtn[i].iBitmap = 0;				// 位图在位图集中的编号
		memset(thbBtn[i].szTip, 0, sizeof(wchar_t) * 260);
		CopyMemory(thbBtn[i].szTip, bmpbuff[i].wcbuff, sizeof(wchar_t)*wcslen(bmpbuff[i].wcbuff));
	}

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

	hr = ptbl->ThumbBarSetImageList(hWnd, hImgL);
	hr = ptbl->ThumbBarAddButtons(hWnd, cbSize, thbBtn);

	free(thbBtn);
	return TRUE;
}

但是也有缺点,就是添加按钮的时候只能来一次,而且得在窗口创建完毕后添加,在WM_CREATE消息中添加不行,下面是添加的例子与效果
// 范例
//
#include "ITaskbarListClass.h"
// ================================================
// tb[0].btnID:发送WM_COMMAND时候的ID
// tb[0].hBmp :显示的那个位图句柄
// tb[0].wcbuff:鼠标放上去了,显示的文字
// ================================================
TASKBARBUTTONADD tb[1] = { 0 };
tb[0].btnID = TBN_STOPBUTTON;
tb[0].hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP_PLAY));
tb[0].wcbuff = (wchar_t*)L"停止";
ITaskbarList3_AddButton(hDlg, tb, 1);
效果:
small
事末小结:
因为用的是空位图(懒的去做了),所以是白色的。当然,ITaskbarList3还可以做任务栏的进度显示,就是有些时候看到窗口的任务栏中的图标的绿色部分进度什么的,这里给的代码还是比较简单的,任务栏按钮有更多功能(详见msdn上的ITaskbarList3接口说明),在这里不提及了。