Chinaunix首页 | 论坛 | 博客
  • 博客访问: 589089
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:47:01

自动隐藏停泊窗体实现
-- 轻松实现类MSDN2002界面(二)(续)

作者:



自动隐藏停泊窗体在商业的MFC图形库中(如Xtreme)已支持得很好,但他们大多都重写了MFC相应的支持代码

像Cristi Posea的CSizingControlBar实现VC6界面那样,重用大部分MFC Dock 框架类而实现Vc .Net界面的免费库很少见(偶没发现:)

本实现,准确地说是在Cuick 的基础上的增强版。
其主要更新为:

Bugfixs:
1.增加定时器 TID_AUTO_HIDE_DELAY 避免出现两个自动隐藏窗口(AHFloatWnds)同时显示的问题.
2.focus 切换问题(特别是在 自动隐藏窗口(AHFloatwnd) 与 停泊窗体(DockPageBar)之间的切换).
3.在改变停泊窗体大小时会有的闪烁、颤动.
4.在改变自动窗体(AHFloatWnd)大小时,尺寸不能超出Mainframe.
5.static MFC 连接(Release & Debug)的问题(增加STATIC_MFC_LINK 编译选项).
6.在CDockPageBar::AddPage 函数中检验 pWnd的 style,确保其为 WS_CHILD style,
避免由此引发的窗口管理混乱(如把一个WS_POPUP类型的对话框加载到停泊窗).

Improvements&Newfeatures:

1.增加自动隐藏窗口( AHFloatWnd) SLIDE_IN/SLIDE_OUT 动画效果
(windows API ::AnimateWindow 对于自画窗体好像不行)
2.增加的新的自动停泊算法,即 精确停泊(as in VC .net), 但是由于停泊窗体的类
是从Cristi Posea的CSizingControlBar继承而来, 横向停泊的窗体会优先充满剩余空间
的问题依然存在
3. 重写了 CDockPageBar 类的NcPaint,NcCalClient,OnNcLButtonXXXX,OnNcHitTest 的实现
把标签和标题栏的重画放到非客户区来做,把原来的绘图效果作了改进
4.增加对MDI 的支持

仍有待解决的问题:
1.横向停泊的窗体会优先充满剩余空间
2.如果框架程序中有工具条,且为可停泊的(Dockable),在自动隐藏时行为不是很合理(浮动窗体
有可能会将遮住工具条)


图一: 多文档框架的停泊窗体


图二: 多文档框架的自动隐藏窗体

使用的方法与中基本一样

不同在于对于多文档 CMainframe 是从CDMIAutoHideFrame 继承的.
例子工程中MDI是vc2003 作的,SDI VC6和vc2003都可用

另外,如果你想使用静态MFC 连接,需要加一个编译选项STATIC_MFC_LINK ,否则画出的窗体会比较难看。

很希望有人能帮助解决尚存的两个问题


--------------------next---------------------

对于水平优先充满的问题,这里是一个主要原因:
CWnd::RepositionBars(...)
{
...
for (HWND hWndChild = ::GetTopWindow(m_hWnd);hWndChild != NULL;hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT))
{
...
}
...
}
这个获取子窗口的顺序决定了CFrameWnd中隐藏的四个CDockBar停靠优先的顺序。
知道了这点,就可以在这里做些小改动,目前我已试验完毕,证实有效。
不过你可以看到在VC2005里拖动时会出现几个定位按钮,从而灵活实现更多停靠方式。如果要做到这些,必须要监视用户拖动的位置,因而需要更多改动,目前还没有仔细研究。不过一切都是有原因的。 ( freelsen 发表于 2007-7-24 22:21:00)
 
写得确实不错,很好用,唯一美中不足的就是停泊在左边的时候,会顶到工具栏和菜单栏上面去(除非把工具栏设置成不可浮动的),不知道如何解决这个问题。 ( flyling 发表于 2007-7-17 17:33:00)
 
如果能把AutoHideBar DockPageBar sizecbar这几个文件都注释了,,该多好,,看了半天还是糊糊涂涂的 ( jackdo 发表于 2007-3-6 14:32:00)
 
垂直方向都可以优先停泊是怎么实现的啊,能告诉一下吗? 谢谢 ( flyling 发表于 2007-1-17 12:13:00)
 
如何才能设置为一开始进入程序 Dock就是隐藏的呢?
花了一天都搞不定。 ( zjroland 发表于 2006-12-27 9:16:00)
 
我今天偶然见看debug和release的大小,发现release版本比debug版本大一倍左右,不知怎么回事? ( wlggdm 发表于 2006-12-21 19:19:00)
 
在类CSizingControlBar 有 GlobalSaveState可以用了保存ControlBar的状态,所以CDockPageBar最好也能重写这个方法以支持ControlBar状态的保存 ( sunlair 发表于 2006-12-20 10:51:00)
 
Re: wlggdm
确实,停泊功能的不足,确实与使用MFC的原始类有关系,
不过这样做,是以最小的代价,实现VC2003界面。
最重要的是,它是基于MFC实现,是free的,可以灵活的用在任何MFC windows项目中,如果对MFC的原始类熟悉的话,可以很容易增加新功能。 ( redcloth 发表于 2006-12-19 9:20:00)
 
如果那位大虾把BCGControlBar中的停靠分离出来的话就太好了,不,是太强了
( wlggdm 发表于 2006-12-13 19:06:00)
 
不知道这里有没有用过BCG的,感觉这个虽然实现了停泊功能,但还有一些不足,我觉得还是与使用MFC的原始类有关系,像BCG一样改写后,功能更好扩充一些 ( wlggdm 发表于 2006-12-13 18:49:00)
 
.......................................................

--------------------next---------------------

阅读(262) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~