`
java-mans
  • 浏览: 11436320 次
文章分类
社区版块
存档分类
最新评论

轻松实现类VC界面

 
阅读更多

Keyword coloring edit control点击打开链接

原文点击打开链接

源码点击打开链接

下图是一个类似VC的界面,左边、底下有两个可浮动、可变大小的控制窗口。许多朋友都希望在自己的程序中实现类似的界面,因为此种类型的界面用途很广、通用性很强,所以笔者总结了一下实现的步骤,辑此一文,并提供源代码供大家参考!

44.3K (最新更新:2004年2月8日)

一、实现原理

图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。

二、实现步骤示例

[1]前期准备

新建一个名为BarDemo的MFC工程,SDI界面,其它选项默认。

将本文示例代码中的sizecbar.h sizecbar.cpp scbarg.h scbarg.cpp 四个文件复制到工程目录下。

在菜单Project->Add to project->Files将四个文件加入工程中,此时在ClassView中将出现了一个称为CCoolBar的类。

在stdafx.h文件中加上

#include "sizecbar.h"

#include "scbarg.h"

[2]开始编码

2.1 为CMainFrame增加成员变量

1.CCoolBar m_wndMyBar1;///我们将它作为左边的窗口
2.CCoolBar m_wndMyBar2;///停靠在下方的窗口

以下代码需要添加到CMainFrame::OnCreate中,方法与普通工具条的创建没有太大的区别!

2.2 创建ControlBar

1.if (!m_wndMyBar1.Create(_T("我的控制条"),this,123))
2.{ TRACE0("Failed to create mybar\n"); return -1; }
3.if (!m_wndMyBar2.Create(_T("我的控制条2"),this,CSize(100,100),TRUE,124))
4.{ TRACE0("Failed to create mybar\n"); return -1; }

2.3 停靠控制

1.m_wndMyBar1.SetBarStyle(m_wndMyBar1.GetBarStyle() | CBRS_TOOLTIPS |
2.CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
3.m_wndMyBar2.SetBarStyle(m_wndMyBar2.GetBarStyle() | CBRS_TOOLTIPS |
4.CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
5.m_wndMyBar1.EnableDocking(CBRS_ALIGN_ANY);
6.m_wndMyBar2.EnableDocking(CBRS_ALIGN_ANY);
7.DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_LEFT);///停靠在左边
8.DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM);///停靠在右边

此时我们已经生成了两个控制条窗口,但窗口中还没有任何东西!让我们来做最后一件事情:往窗口添加所需部件!

2.4 添加我的控件

这个问题看似有些麻烦其实相当简单:我们只要在创建这些控件时将控制条窗口指针作为父窗口指针赋值给这些控件即可!
请看如下例子(需要注意的是以下列举的几种形式,你只能选择其一,同时往一个控制条窗口添加多个子窗口将导致失败!)

(1)将编辑控件放入下面那个控制条窗口中

1.在CMainFrame类中添加成员变量CEdit m_wndEdit;
2.在创建ControlBar后创建编辑控件
3.m_wndEdit.Create(WS_VSCROLL|WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|
4.ES_MULTILINE|ES_WANTRETURN,CRect(0,0,0,0),&m_wndMyBar2,101);
5.m_wndEdit.ModifyStyleEx(0,WS_EX_CLIENTEDGE);

(2)将树型控件放入左边那个控制条窗口中

01.在CMainFrame类中添加成员变量 CTreeCtrl m_wndTree;;
02.在创建ControlBar后创建树型控件
03./////////////这一段代码创建树型控件////////////
04.if (!m_wndTree.Create(WS_CHILD|WS_VISIBLE|
05.TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
06.CRect(0, 0, 0, 0), &m_wndMyBar1, 100))
07.{
08.TRACE0("Failed to create instant bar child\n");
09.return -1;
10.}
11.m_wndTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
12.////往树型控件添加内容///
13.HTREEITEM hti = m_wndTree.InsertItem(_T("VC知识库在线杂志"));
14.m_wndTree.InsertItem(_T("电子文档"));
15.m_wndTree.InsertItem(_T("在线杂志第一期"), hti);
16.m_wndTree.InsertItem(_T("在线杂志第二期"), hti);

(3)将对话框放入控制条中

首先在资源编辑器里制作一个CHILD类型的无BORDER对话框,ID为IDD_DIALOGBAR,并以此作为模板生成CVCKBASEDlg类,
并在CMainFrame中添加成员变量 CVCKBASEDlg m_wndVCKBASE;然后在创建ControlBar后用如下代码创建对话框

1.m_wndVCKBASE.Create(IDD_DIALOGBAR,&m_wndMyBar1);
2.m_wndVCKBASE.ShowWindow(SW_SHOW);

(4)将TabCtrl放入左边的控制条

本文的示例代码中提供了一个称为CCoolTabCtrl的封装类,我们用它可以简单地创建出TabCtrl,先请看如下代码

01.m_TabCtrl.Create(TCS_DOWN|WS_CHILD|WS_VISIBLE,CRect(0,0,100,100),&m_wndMyBar1,125);
02./////////////这一段代码创建树型控件////////////
03.if (!m_wndTree.Create(WS_CHILD|WS_VISIBLE|
04.TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
05.CRect(0, 0, 0, 0), &m_TabCtrl, 100)) ///注意,这里是将m_TabCtrl作为m_wndTree的父窗口
06.{
07.TRACE0("Failed to create instant bar child\n");
08.return -1;
09.}
10.m_wndTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
11.///往树型控件添加内容
12.HTREEITEM hti = m_wndTree.InsertItem(_T("VC知识库在线杂志"));
13.m_wndTree.InsertItem(_T("电子文档"));
14.m_wndTree.InsertItem(_T("在线杂志第一期"), hti);
15.m_wndTree.InsertItem(_T("在线杂志第二期"), hti);
16.///将树型控件加入到TabCtrl中
17.m_TabCtrl.AddPage(&m_wndTree,"VC知识库",IDI_ICON1); ///将树型控件添加到第一页
18.m_TabCtrl.AddPage(RUNTIME_CLASS(CVCKBASEDlg),IDD_DIALOGBAR,"第二页",IDI_ICON2); ///将CVCKBASEDlg对话框添加到第二页
19.m_TabCtrl.AddPage(RUNTIME_CLASS(CMyDlg),IDD_DIALOGBAR2,"第三页",IDI_ICON3); ///将CMyDlg对话框添加到第三页
20.m_TabCtrl.UpdateWindow(); ///更新TabControl

需要注意的是希望添加到TabControl中的对话框,在其类定义,类实现文件中必须添加如下信息:

例如CVCKBASEDlg类,在VCKBASEDlg.h中添加 DECLARE_DYNCREATE(CVCKBASEDlg)

1.class CVCKBASEDlg : public CDialog
2.{
3.// Construction
4.public:
5.CVCKBASEDlg(CWnd* pParent = NULL); // standard constructor <B> DECLARE_DYNCREATE(CVCKBASEDlg)</B>

在.CPP中增加 IMPLEMENT_DYNCREATE(CVCKBASEDlg, CDialog)

至此我们已经大功告成!我们可以编译运行一下看看两个控制条有没有创建成功。

哇噻!只用这几行代码就实现了梦寐以求的界面!

三、更加高级的话题

3.1 该ControlBar在浮动的时候顶部的把手会消失,变成了普通的ToolWindow类型的标题栏。为了避免这种情况,我们需要在CMainFrame::OnCreate()中,在EnableDocking()后加入:

1.#ifdef _SCB_REPLACE_MINIFRAME
2.m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);
3.#endif //_SCB_REPLACE_MINIFRAME
4.并在stdafx.h中加上#define _SCB_REPLACE_MINIFRAME

3.2 该类的另外一种风格可以在stdafx.h中加上 #define _SCB_STYLE_FLAT 产生,您不妨试试!

3.3 如何将两个ControlBar停靠在同一行中

1.DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_BOTTOM);///停靠在底部
2.RecalcLayout();
3.CRect rect;
4.m_wndMyBar1.GetWindowRect(rect);
5.rect.OffsetRect(1, 0);//偏移一个位置
6.DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM,rect);///也停靠在底部

3.4 如何将两个ControlBar停靠在同一列中

1.DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_RIGHT);///停靠在右边
2.RecalcLayout();
3.CRect rect;
4.m_wndMyBar1.GetWindowRect(rect);
5.rect.OffsetRect(0, 1);//看到这里的区别了吗
6.DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_RIGHT,rect);///也停靠在右边

后记

本文是在百忙中匆匆完成,错误之处希望大家批评指正!

最后,让我们再次感谢Cristi Posea先生为我们提供了如此好用的CSizingControlBar!

分享到:
评论

相关推荐

    轻松实现类VC界面 轻松实现类VC界面

    轻松实现类VC界面 轻松实现类VC界面 轻松实现类VC界面 轻松实现类VC界面

    《轻松实现类VC界面》配套源代码

    《轻松实现类VC界面》配套源代码,左边、底下有两个可浮动、可变大小的控制窗口。

    类VC界面 轻松实现类VC界面

    下图是一个类似VC的界面,左边、底下有两个可浮动、可变大小的控制窗口。许多朋友都希望在自己的程序中实现类似的界面,因为此种类型的界面用途很广、通用性很强,所以笔者总结了一下实现的步骤,辑此一文,并提供源...

    商业编程-源码-《轻松实现类VC界面》配套源代码.zip

    商业编程-源码-《轻松实现类VC界面》配套源代码.zip

    VC窗口停靠类 实现类似VC6.0界面

    里面包含一个通用的VC窗口停靠类,你只需将它添加到你的工程中,就可以随意地添加你所需要的窗口和控件,且窗口可以自由停靠,里面的示例代码生成了树控件,树控件的节点可以动态添加,节点图标等。具体操作查看里面...

    VC-interface.rar_VC 界面_VC界面_Vc_vc++_界面

    轻松实现类VC界面 轻松实现类VC界面 轻松实现类VC界面

    VC界面+停靠窗口+自动隐藏窗口

    VC6.0实现如同VS2010的弹出式工具栏一样的功能,让对话框可以在窗口的任意位置进行停靠,并且实现窗口的自动隐藏和弹出

    like_class_VC.zip_VC界面_like_class_VC_类vc界面

    轻松实现类VC界面,该界面类似VC开发环境的文件列表框。

    vc界面停靠窗口

    软件简介: 轻松实现类VC界面_界面-窗口。一个类似VC的界面,左边、底下有两个可浮动、可变大小的控制窗口

    VC6下实现停靠窗源代码与例子

    VC6下实现停靠窗类源文件+例子,可以轻松实现停靠窗口。

    轻松实现VC界面Demo

    【轻松实现VC界面Demo】 一、实现原理 图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美...

    轻松实现类 MSDN 2002 界面

    看到这个标题大家肯定会想到王骏发表在知识库第十一期的《轻松实现类VC界面》,呵呵,没错,俺参考并借用了他的部分代码,在这里先表示感谢!  一直想实现类似 MSDN 2002 式样的界面,到 codeproject 也没找到...

    vc++ 应用源码包_13

    独立打包,保证可解压,内含大量...轻松实现类VC界面.zip 全屏幕播放AVI文件的启动界面程序.rar 全屏幕播放flash的动画启动界面.rar 任务栏终级编程.rar 三种方法来检索处理器信息.zip 深入解剖远程管理软件编写.zip

    实现VC界面的类

    图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽...

    vc++ 应用源码包_6

    利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC...

    轻松实现类 MSDN 2002 界面(二)VC源代码

    前段时间在VC知识库发表了《轻松实现类MSDN2002界面》,仅仅实现了标签页的拖放、停靠、浮动等功能,而上面的图钉按钮也只是一个假的^_^。。现在已经可以实现自动隐藏了...... 关键字:msdn,ui

    vc++ 应用源码包_2

    利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 ...

Global site tag (gtag.js) - Google Analytics