轻松实现类VC界面(窗口停靠)

extiyak

extiyak

2016-02-19 20:11

下面图老师小编要跟大家分享轻松实现类VC界面(窗口停靠),简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

一、实现原理

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

二、实现步骤示例

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

[1]前期准备

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

新建一个名为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增加成员变量

CCoolBar m_wndMyBar1;///我们将它作为左边的窗口CCoolBar m_wndMyBar2;///停靠在下方的窗口
以下代码需要添加到CMainFrame::OnCreate中,方法与普通工具条的创建没有太大的区别!

2.2 创建ControlBar

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

2.3 停靠控制

m_wndMyBar1.SetBarStyle(m_wndMyBar1.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndMyBar2.SetBarStyle(m_wndMyBar2.GetBarStyle() | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_SIZE_DYNAMIC);m_wndMyBar1.EnableDocking(CBRS_ALIGN_ANY);m_wndMyBar2.EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_LEFT);///停靠在左边DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM);///停靠在右边
此时我们已经生成了两个控制条窗口,但窗口中还没有任何东西!让我们来做最后一件事情:往窗口添加所需部件!

2.4 添加我的控件

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

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

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

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

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

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

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

m_wndVCKBASE.Create(IDD_DIALOGBAR,&m_wndMyBar1);m_wndVCKBASE.ShowWindow(SW_SHOW);
(4)将TabCtrl放入左边的控制条

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

    m_TabCtrl.Create(TCS_DOWN|WS_CHILD|WS_VISIBLE,CRect(0,0,100,100),&m_wndMyBar1,125);    /**//////////////这一段代码创建树型控件////////////    if (!m_wndTree.Create(WS_CHILD|WS_VISIBLE|        TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,        CRect(0, 0, 0, 0), &m_TabCtrl, 100))  /**////注意,这里是将m_TabCtrl作为m_wndTree的父窗口    ...{        TRACE0("Failed to create instant bar child ");        return -1;    }    m_wndTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);    /**////往树型控件添加内容    HTREEITEM hti = m_wndTree.InsertItem(_T("VC知识库在线杂志"));    m_wndTree.InsertItem(_T("电子文档"));    m_wndTree.InsertItem(_T("在线杂志第一期"), hti);    m_wndTree.InsertItem(_T("在线杂志第二期"), hti);    /**////将树型控件加入到TabCtrl中    m_TabCtrl.AddPage(&m_wndTree,"VC知识库",IDI_ICON1); /**////将树型控件添加到第一页    m_TabCtrl.AddPage(RUNTIME_CLASS(CVCKBASEDlg),IDD_DIALOGBAR,"第二页",IDI_ICON2); /**////将CVCKBASEDlg对话框添加到第二页    m_TabCtrl.AddPage(RUNTIME_CLASS(CMyDlg),IDD_DIALOGBAR2,"第三页",IDI_ICON3);   /**////将CMyDlg对话框添加到第三页    m_TabCtrl.UpdateWindow(); /**////更新TabControl
需要注意的是希望添加到TabControl中的对话框,在其类定义,类实现文件中必须添加如下信息:
例如CVCKBASEDlg类,在VCKBASEDlg.h中添加 DECLARE_DYNCREATE(CVCKBASEDlg)

class CVCKBASEDlg : public CDialog...{// Constructionpublic:    CVCKBASEDlg(CWnd* pParent = NULL);   // standard constructor    DECLARE_DYNCREATE(CVCKBASEDlg)在.CPP中增加 IMPLEMENT_DYNCREATE(CVCKBASEDlg, CDialog)

至此我们已经大功告成!我们可以编译运行一下看看两个控制条有没有创建成功。
哇噻!只用这几行代码就实现了梦寐以求的界面!

三、更加高级的话题

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


3.2 该类的另外一种风格可以

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

在stdafx.h中加上 #define _SCB_STYLE_FLAT 产生,您不妨试试!

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

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

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

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

展开更多 50%)
分享

猜你喜欢

轻松实现类VC界面(窗口停靠)

编程语言 网络编程
轻松实现类VC界面(窗口停靠)

轻松实现类VC界面

C语言教程 C语言函数
轻松实现类VC界面

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

轻松实现类 MSDN 2002 界面

C语言教程 C语言函数
轻松实现类 MSDN 2002 界面

轻松实现类 MSDN 2002 界面(二)

C语言教程 C语言函数
轻松实现类 MSDN 2002 界面(二)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VC界面的实现

C语言教程 C语言函数
VC界面的实现

在类VC的界面实现中加入目录树

C语言教程 C语言函数
在类VC的界面实现中加入目录树

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

操作系统WinXP系统下载安装参数

操作系统WinXP系统下载安装参数

vc分割字符串的函数

vc分割字符串的函数
下拉加载更多内容 ↓