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

全部博文(576)

文章存档

2011年(1)

2008年(575)

我的朋友

分类:

2008-10-14 14:51:47

轻松实现类MSDN2002界面(二)


作者:




  前段时间在VC知识库发表了,仅仅实现了标签页的拖放、停靠、浮动等功能,而上面的图钉按钮也只是一个假的^_^。通过参考的代码对程序进行了加强。现在已经可以实现自动隐藏了!!!效果图如下。(比较匆忙,程序还有很多不令人满意的地方,有待改进。上周刚接到新任务,不能继续做了,只好请大家来完善了,希望你把修改后的代码发我一份,谢谢)


图一

下面,我将一步步介绍怎样使用 DockPage、AutoHideBar。

一、通过AppWizard使用默认选项生成一个SDI界面工程。把src目录拷贝到你的工程文件夹下。

在菜单Project->Add to project->Files将六个文件加入工程中。 在stdafx.h文件中加上:

#define WM_AUTOHIDE_ON		WM_USER+1
#include ".\src\sizecbar.h"
#include ".\src\AutoHideBar.h"
二、修改 MainFrame 的继承关系。

头文件修改为:class CMainFrame : public CautoHideFrame
cpp文件修改:IMPLEMENT_DYNCREATE(CMainFrame, CAutoHideFrame)
BEGIN_MESSAGE_MAP(CMainFrame, CAutoHideFrame)
三、 声明DockPageBar:
	CDockPageBar		m_wndDockPageBar
在OnCreate创建DockPageBar:
	if (!m_wndDockPageBar.Create(_T("DockPageBar"), this, CSize(230,260),TRUE,123))
	{
		TRACE0("Failed to create DockPageBar.\n");
		return -1;
	}
	m_wndDockPageBar.SetBarStyle(m_wndDockPageBar.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
	m_wndDockPageBar.EnableDocking (CBRS_ALIGN_ANY);
允许Frame停靠:
	EnableDocking(CBRS_ALIGN_ANY);
将DockPageBar停靠到左边:
	DockControlBar(&m_wndDockPageBar, AFX_IDW_DOCKBAR_LEFT);
四、好了,停靠 Bar 已经创建好了,并且具有了自动隐藏功能。下面你就可以忘停靠条里添加标签页了!!
	if (!m_wndEdit.Create(WS_CHILD|WS_VISIBLE|
			ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL,
		CRect(0,0,0,0), this, 123))
		return -1;
	m_wndDockPageBar.AddPage(&m_wndEdit,"Edit",IDI_INDEX);
  OK,编译执行就可以了!!就这么简单。至于实现原理就不在这里讲了,有幸趣的话可以看源码,不过源码有点乱,现在实在是没有时间整理了!!自动隐藏功能的实现代码没有加注释,抱歉!!!
  还有,以前发表的存在的Bug修改了一下,并加了注释,一并发上来。本程序匆忙中完成,不足之处请见凉。

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

你好,
  这个代码对CEditView也是好用的,不过必须指定CEditView的属性为WS_CLIPSIBLINGS ( runforu 发表于 2008-6-18 15:00:00)
 
你好,
  对于很多控件源代码的隐藏功能是正常的,但是对于从CEditView继承的view,自动隐藏功能有个问题,当从隐藏状态下点击鼠标或移动鼠标到tab上,界面显示错误,怀疑是由于CEditView和dockbar共同绘图有关。我已经把一个整理好的例子程序发到你的信箱tony__cb@hotmail.com 里了。我不知道怎么解决这个问题,请感兴趣的人向我索要用CEditView的例子程序。大家共同解决这个问题。 ( runforu 发表于 2008-6-18 14:44:00)
 
解决静态链接出错的办法:
将DockPageBar.cpp中五处_AfxAdjustRectangle改为自定义的函数名 ( zhouzhonghao 发表于 2007-10-31 7:15:00)
 
为什么加入这个仿MSDN界面之后,工具条和菜单的风格都发生变化了啊?没有朋友发现这个问题吗? ( larusoft 发表于 2007-7-26 22:46:00)
 
为什么加入这个仿MSDN界面之后,工具条和菜单的风格都发生变化了啊 ( larusoft 发表于 2007-7-24 14:30:00)
 
to:xxxxxlllll:
你说的没错,这样是可以避免CAutoHideBar创建到顶端的工具栏中,但是你发现工具栏还是会向右移动一个距离。
我感觉好像是lParam参数的问题, 不知道怎么解决。 ( flyling 发表于 2007-7-19 12:00:00)
 
工具栏如果可停靠,则CAutoHideBar会创建到工具栏区域
LRESULT CAutoHideBar::OnSizeParent(WPARAM wParam, LPARAM lParam)中

else if (dwStyle & CBRS_ORIENT_VERT)
{//使用保存的矩形中的top信息可以避免CAutoHideBar创建到顶端的工具栏中
if(pHideItem != NULL)
rect.top = pHideItem->m_oldWndRect.top;
( xxxxxlllll 发表于 2007-6-15 14:37:00)
 
你好
   谢谢你的源码.我在使用中想将停靠中的关闭X去掉,但是我是做不到,不知作者能不能想办法.望有时间给于回答.xjlhw@163.com ( xjlhw 发表于 2006-11-26 8:01:00)
 
很好很好!只是程序在运行时,如果下面的不隐藏,左边的隐藏后自动出现时会覆盖下面的frame,有点不爽,能不能修改?希望作者修改后发表上来!! ( hcn5460 发表于 2004-12-7 9:03:00)
 
发现做安装包后在没有装vc的机器上运行出错,用dependency看没有未包含的dll,为什么? ( pinel 发表于 2004-9-17 16:15:00)
 
.......................................................

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

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