随笔-3  评论-4  文章-0  trackbacks-0
关于Docking Window的文章有很多,基本都是讲主程序内部的工具栏小窗口的Docking,看看代码,一般都很复杂。关于桌面Docking的文章并不多见。实际上从Windows95开始,Win32 API就提供了一个叫做SHAppBarMessage的函数,用于实现完全等同于Windows Task Bar的功能。即可以停靠在屏幕在任意一边,并把自己排除到桌面空间之外。当其他应用程序窗口最大化的时候,不占据Task Bar的空间。同时,也可以设置成自动隐藏,让出所有的桌面空间。这样的窗口,就称为AppBar。

象QQ这样的程序可以停靠在窗口的一边,也可以自动隐藏,但似乎和AppBar的行为还是有不少差距的。本文提供的是对标准AppBar的一个实现。

利用SHAppBarMessage函数实现一个AppBar并不困难,这篇文章介绍了几乎所有实现细节,但所提供的例子却是SDK风格的代码,基本没有实际使用价值。但是对于SDK文档是一个很好的补充,很多SDK中没有说清楚的问题在文中给出了解释。

另一个问题是,SHAppBarMessage函数并没有提供我想当然认为应该实现的功能。比如对拖动的支持,比如自动隐藏窗口的隐藏和出现功能都必须额外的代码实现。SHAppBarMessage函数所做的主要工作似乎是划分屏幕,使其他窗口不会占用AppBar的空间。当然,能实现这个也足够了,毕竟,没有SHAppBarMessage函数,其他功能肯定都可以实现,而这个划分屏幕的功能我不知道该怎么做。

写一个可重用的AppBar基础类的愿望马上出现在我头脑中。WTL由于其超低的耦合性成为我必然的选择。模板类CAppBar<T>就是工作的结果。这个类不只是对SHAppBarMessage函数的简单封装,同时提供了通过拖动实现停靠或脱离屏幕的功能,并提供自动隐藏的实现。

任何从CWindowImpl直接或间接继承的弹出式窗口类都可以使用CAppBar。使用的方法很简单:
    1、把CAppBar作为一个父类继承
    2、使用CHAIN_MSG_MAP把消息传递给CAppBar
    3、在窗口创建时调用InitAppBar函数,参数可选
这样,这个窗口就具备了AppBar的功能了,下面你就可以通过拖动把它停靠在屏幕边上了。
当然,也可以通过调用DockAppBar停靠或脱离;或者调用SetAutoHide改变自动隐藏的设置。
如果在停靠状态改变时需要有特殊操作,可以重载OnDockingChanged函数。

基本就是这样,代码很简单,就象其他WTL类一样。希望下一版的WTL可以收录它

下载例子程序
posted on 2005-09-15 09:42 章鱼 阅读(1401) 评论(2)  编辑 收藏 引用

评论:
# re: AppBar的WTL实现 2006-03-28 00:43 | Miaohua
Nice article!  回复  更多评论
  
# re: AppBar的WTL实现 2006-03-28 01:02 | Miaohua
A small suggestion:

When docking without Autohide checked, if be resized the window to larger, the windows doesn't respond immediately. I guess you are reusing some function for autohide, which deliberately wait a moment before hiding.  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理