在Win7中,运行Windows Media Player,然后把鼠标移到任务栏(Taskbar)上播放器的按钮上,我们注意到在播放器的缩略图的底部,有一个小的工具栏(Toolbox),上面有三个按钮。如下图所示:
点击中间的按钮可以开始播放或者暂停播放,点击最左边的按钮播放上一个音频或者视频,而点击最右边的按钮下一个音频或者视频。
Win7提供了三个API ThumbBarSetImageList、ThumbBarAddButtons和ThumbBarUpdateButtons在状态栏缩略图上添加和更新工具栏。接下来我们通过一个例子来演示如何使用这些API。
1. 准备三个Icon,分别为红、绿、蓝三种颜色;
2. 在Form中添加一个ImageList,并把前面的三个Icon添加到ImageList中;
3. 在类TaskManager中添加一个方法ThumbBarSetImageList如下:
public void ThumbBarSetImageList(IntPtr hwnd, IntPtr himl)
{
ThrowIfNotSupport();
TaskbarList.ThumbBarSetImageList(hwnd, himl);
}
4. 在类TaskManager中添加一个方法ThumbBarAddButtons如下:
public void ThumbBarAddButtons(IntPtr hwnd, THUMBBUTTON[] buttons)
{
ThrowIfNotSupport();
TaskbarList.ThumbBarAddButtons(hwnd, (uint)(buttons.Length), buttons);
}
5. 在类TaskManager中添加一个方法ThumbBarUpdateButtons如下:
public void ThumbBarUpdateButtons(IntPtr hwnd, THUMBBUTTON[] buttons)
{
ThrowIfNotSupport();
TaskbarList.ThumbBarUpdateButtons(hwnd, (uint)buttons.Length, buttons);
}
6. 在form中获取TaskManager的一个实例:
// Keep a reference to the Taskbar instance
private TaskbarManager windowsTaskbar = TaskbarManager.Instance;
7. 为form添加Show事件响应器如下:
private const int numButtons = 2;
private String[] strButtons = new String[numButtons];
private THUMBBUTTON[] buttons = new THUMBBUTTON[numButtons];
private void ThumbButton_Shown(object sender, EventArgs e)
{
windowsTaskbar.ThumbBarSetImageList(this.Handle, imageList1.Handle);
for (uint i = 0; i < numButtons; ++i)
{
strButtons[i] = "button " + (i + 1).ToString();
buttons[i].iId = i;
buttons[i].szTip = strButtons[i];
buttons[i].iBitmap = i;
buttons[i].dwMask = THBMASK.THB_TOOLTIP | THBMASK.THB_BITMAP | THBMASK.THB_FLAGS;
}
windowsTaskbar.ThumbBarAddButtons(this.Handle, buttons);
}
在上述代码中,我们为该应用程序在任务栏上的缩略图的工具栏设置了一个ImageList。接着我们创建两个工具栏按钮,并设置了几个属性:首先是序号。按钮序号在处理点击消息时用来确定发出点击消息的按钮。接着我们设置了一个提示字符串。这个字符串在我们把鼠标停在按钮上时会以ToolTip的形式显示出来。第三个该按钮的背景图片在ImageList中序号。在设置好两个按钮的属性之后,我们把这两个按钮添加到任务栏缩略图的工具栏中。
8. 在Form上重载WndProc方法如下:
private const int WM_COMMAND = 0x111;
private bool showOriginalIcon = true;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_COMMAND)
{
// high bits of WParam
if ((m.WParam.ToInt32() & 0xffff0000) >> 16 == THUMBBUTTON.THBN_CLICKED)
{
// low bits of WParam is the button ID
if ((m.WParam.ToInt32() & 0x0000ffff) == 1)
{
showOriginalIcon = !showOriginalIcon;
if (showOriginalIcon)
buttons[1].iBitmap = 1;
else
buttons[1].iBitmap = 2;
}
windowsTaskbar.ThumbBarUpdateButtons(this.Handle, buttons);
}
}
base.WndProc(ref m);
}
当我们用鼠标点击任务栏上缩略图的工具栏上按钮时,Windows会给应用程序主窗口发送一个WM_COMMAND消息。在消息的WPARAM中,前半部分的16位是消息的类型THBN_CLICKED,而后半部分的16位是被点击的按钮的序号。
在上面的代码中,当我们发现鼠标点击了工具栏上的第二个按钮(button[1])时,我们改变该按钮的背景图在ImageList中图像的序号,然后更新工具栏上的按钮。
9. 编译运行程序。
当我们把鼠标移到该应用程序在任务栏上的按钮时,Windows就会弹出它的缩略图。我们再把鼠标移到缩略图上工具栏的第一个按钮,该按钮的Tooltip就会自动显示出来,如下图所示:
接着我们单击工具栏的第二个按钮,该按钮的背景图片会由绿色编程黄色,如下图所示: