Winforms:Windows 7中Taskbar的新效果(4)——缩略图工具栏

                Win7中,运行Windows Media Player,然后把鼠标移到任务栏(Taskbar)上播放器的按钮上,我们注意到在播放器的缩略图的底部,有一个小的工具栏(Toolbox),上面有三个按钮。如下图所示:

Windows Media Player的缩略图,上面的工具栏上有三个按钮

点击中间的按钮可以开始播放或者暂停播放,点击最左边的按钮播放上一个音频或者视频,而点击最右边的按钮下一个音频或者视频。

                Win7提供了三个API ThumbBarSetImageListThumbBarAddButtonsThumbBarUpdateButtons在状态栏缩略图上添加和更新工具栏。接下来我们通过一个例子来演示如何使用这些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就会自动显示出来,如下图所示:

 

工具栏上有两个按钮,当鼠标停在第一个按钮上时显示出Tooltip

接着我们单击工具栏的第二个按钮,该按钮的背景图片会由绿色编程黄色,如下图所示:

点击工具栏上第二个按钮时,该按钮的背景图片换成新的图像

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
效果图:音乐播放控制按钮 教程开始: 实现方法在微软的帮助文档,我发不了链接(百度关键词 任务栏扩展 MSDN) 文档提供了3三个API:ThumbBarAddButtons(创建按钮)、 ThumbBarSetImageList、 ThumbBarUpdateButtons(更按钮) 这三个API在动态链接库 Explorerframe.dll ,我尝试过直接调用它们,结果却不存在。 不过MSDN提供了C++的调用方法,在C++这三个API被封装在 ITaskBarList3 类,ITaskBarList3类定义在“ Shobjidl.h ”头文件 所以我想想到个方法,利用微软提供的C++代码编写一个DLL库来实现这三个方法,让易语言程序调用。 接下来我编写了 TaskBarEx.dll 这个链接库(C++源码在最下面),里面提供了 AddThumbarButtons 这个方法,方法易语言定义如下: 复制代码 .版本 2 .DLL命令 AddThumbarButtons, 整数型, "TaskBarEx", "_AddThumbarButtons@12", 公开 .参数 句柄, 整数型 .参数 sum, 整数型 .参数 pTHUMBBUTTON, THUMBBUTTON, 数组 这个链接库的代码都是MSDN现成的,从微软的帮助文档复制过来,稍加修改就行了。 你们以为这样就结束了! 当我在易语言声明此API调用后,才发现并没有什么卵用,我也不知道为什么。后面才知道微软提供的这三个API是用COM对象的方式调用的。于是 我在论坛找了一大堆关于如何调用COM对象的教程,完全看不懂! 当然!什么事情都是有解决的办法的,最终我还是找到办法了,以下方法是我乱搞搞出来的。 我在易语言创建了一个“对象”类型的变量(用来调用COM对象的)取名: ITAskBarList3并创建了 ITAskBarList3类的COM对象 复制代码 ITAskBarList3.创建 (“{56FDF344-FD6D-11d0-958A-006097C9A090}”, ) 代码那一串文本是COM对象的唯一标识符,我在VS2017 ITAskBarList3类的声明找得到。定义在“ Shobjidl.h ”头文件。 然后声明了一个THUMBBUTTON 结构(见MSDN),定义按钮的信息: 复制代码 .版本 2 ' 按钮1 Button.hIcon = LoadIconA (mHwnd, 112)' 112为“上一首按钮”的图标在TaskBarEx.dll链接库的资源编号 Button.dwMask = 位或 (2, 4, 8)' 表示你准备使用THUMBBUTTON结构的哪些成员 Button.iId = 0' 按钮的编号,用于在窗口的消息循环的WM_COMMAND消息下判断是哪个按钮 Button.dwFlags = 0' 表示按钮状态,可用还是禁用,0表示可用 wtext = Ansi转Unicode (“上一首”)' 按钮提示文本需要Unicode类型 toBytes (Button.szTip, wtext, 取字节集长度 (wtext)) 加入成员 (sButton, Button)' 声明好一个按钮结构就加sButton数组 最后调用TaskBarEx.dll我提供的AddThumbarButtons函数 复制代码 AddThumbarButtons (窗口句柄, 1, sButton) 以上就是创建一个略图按钮的基本代码。下面还有一些问题: 以下是MSDN的原话: 注意 当应用程序显示窗口时,系统会创建其任务栏按钮。当按钮就位时,任务栏会向窗口发送TaskbarButtonCreated消息。它的值通过调用RegisterWindowMessage(L(“TaskbarButtonCreated”))计算。该消息必须在应用程序调用任何ITaskbarList3方法之前接收。 意思就是创建按钮的所有代码都在TaskbarButtonCreated消息之后,并且这个消息值需要我们调用API自己注册。我做过测试,发现要想在窗口创建完成后创建按钮,就必须这样做;如果将创建按钮代码放在 __按钮__被按下事件 下就不一定,不知道为什么。 教程结束 当然还有一些细节问题需要处理,在我的源码都有注释,可以看看。如果代码看不懂可以问我,不过关于COM对象的问题我也不懂。 TaskBarEx.dll的源代码:整个VC++工程目录100多MB,无语了,如果需要我后面再发;下面两个主要函数代码,其实MSDN都有。 我用的是VS2017 EXTERN_C __declspec(dllexport) int _stdcall eG

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值