📄 轻松实现类vc界面http--www_5tb_com.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0033)http://www.5tb.com/list.asp?id=38 -->
<HTML><HEAD><TITLE>轻松实现类VC界面|http://www.5TB.com</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META
content="windows,winxp,winme,windows2000,win9x,winNT,linux,unix,office,3d max,photoshop,word,excel,vb,asp,cgi,php,wps,CorelDRAW,Authorware,AUTOCAD,Flash,电脑文摘,免费资源,操作系统,软件教程,编程心得,网页特效"
name=keywords><LINK href="轻松实现类VC界面http--www_5TB_com_files/style.css"
rel=stylesheet>
<OBJECT id=maximize type=application/x-oleobject
classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11><PARAM NAME="Command" VALUE="MAXIMIZE"></OBJECT>
<SCRIPT>if(self.screenLeft>10)maximize.Click()</SCRIPT>
<META content="MSHTML 6.00.3790.0" name=GENERATOR></HEAD>
<BODY bgColor=#efefef topMargin=0>
<TABLE class=td cellSpacing=1 cellPadding=10 width=700 align=center border=0>
<TBODY>
<TR class=td1>
<TD><B>您的位置:<A
href="http://www.5tb.com/">【网路文摘】</A></B>→编程心得→编程心得</TD></TR></TBODY></TABLE>
<TABLE class=td2 cellSpacing=1 cellPadding=5 width=700 align=center border=0>
<TBODY>
<TR class=td3>
<TD align=middle><B>轻松实现类VC界面</B></TD></TR>
<TR class=td4>
<TD>
<P> 下图是一个类似VC的界面,左边、底下有两个可浮动、可变大小的控制窗口。许多朋友都希望在自己的程序中实现类似的界面,因为此种类型的界面用途很广、通用性很强,所以笔者总结了一下实现的步骤,辑此一文,并提供源代码供大家参考!</P>
<P><A
href="http://ftp.enet.com.cn/pub/eschool/code/bardemo.zip">下载本文示例工程</A></P>
<P align=center><IMG
src="轻松实现类VC界面http--www_5TB_com_files/bcxd70-1.gif"></P>
<P><B>一、实现原理</B></P>
<P>图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi
Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。</P>
<P><B>二、实现步骤示例</B></P>
<P>[1]前期准备</P>
<P>新建一个名为BarDemo的MFC工程,SDI界面,其它选项默认。</P>
<P>将本文示例代码中的sizecbar.h sizecbar.cpp scbarg.h scbarg.cpp 四个文件复制到工程目录下。</P>
<P>在菜单Project->Add to
project->Files将四个文件加入工程中,此时在ClassView中将出现了一个称为CCoolBar的类。</P>
<P>在stdafx.h文件中加上</P>
<P>#include "sizecbar.h"</P>
<P>#include "scbarg.h"</P>
<P>[2]开始编码</P>
<P>2.1 为CMainFrame增加成员变量</P>
<P>CCoolBar m_wndMyBar1;///我们将它作为左边的窗口</P>
<P>CCoolBar m_wndMyBar2;///停靠在下方的窗口</P>
<P>以下代码需要添加到CMainFrame::OnCreate中,方法与普通工具条的创建没有太大的区别!</P>
<P>2.2 创建ControlBar</P>
<P>if (!m_wndMyBar1.Create(_T("我的控制条"),this,123))</P>
<P>{ TRACE0("Failed to create mybar\n"); return -1; }</P>
<P>if (!m_wndMyBar2.Create(_T("我的控制条2"),this,Csize(100,100),TRUE,124))
</P>
<P>{ TRACE0("Failed to create mybar\n"); return -1; }</P>
<P>2.3 停靠控制</P>
<P>m_wndMyBar1.SetBarStyle(m_wndMyBar1.GetBarStyle() | CBRS_TOOLTIPS |</P>
<P>CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</P>
<P>m_wndMyBar2.SetBarStyle(m_wndMyBar2.GetBarStyle() | CBRS_TOOLTIPS |</P>
<P>CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</P>
<P>m_wndMyBar1.EnableDocking(CBRS_ALIGN_ANY);</P>
<P>m_wndMyBar2.EnableDocking(CBRS_ALIGN_ANY);</P>
<P>DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_LEFT);///停靠在左边</P>
<P>DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM);///停靠在右边</P>
<P>此时我们已经生成了两个控制条窗口,但窗口中还没有任何东西!让我们来做最后一件事情:往窗口添加所需部件!</P>
<P>2.4 添加我的控件</P>
<P>这个问题看似有些麻烦其实相当简单:我们只要在创建这些控件时将控制条窗口指针作为父窗口指针赋值给这些控件即可!</P>
<P>请看如下例子</P>
<P>(1)将编辑控件放入下面那个控制条窗口中</P>
<P>在CMainFrame类中添加成员变量Cedit m_wndEdit;在创建ControlBar后创建编辑控件</P>
<P>m_wndEdit.Create(WS_VSCROLL|WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|</P>
<P>ES_MULTILINE|ES_WANTRETURN,Crect(0,0,0,0),&m_wndMyBar2,101);</P>
<P>m_wndEdit.ModifyStyleEx(0,WS_EX_CLIENTEDGE);</P>
<P>(2)将树型控件放入左边那个控制条窗口中 在CMainFrame类中添加成员变量 CTreeCtrl
m_wndTree;;在创建ControlBar后创建树型控件</P>
<P>/////////////这一段代码创建树型控件////////////</P>
<P>if (!m_wndTree.Create(WS_CHILD|WS_VISIBLE|</P>
<P>TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,</P>
<P>Crect(0, 0, 0, 0), &m_wndMyBar1, 100))</P>
<P>{</P>
<P>TRACE0("Failed to create instant bar child\n");</P>
<P>return -1;</P>
<P>}</P>
<P>m_wndTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);</P>
<P>////往树型控件添加内容///</P>
<P>HTREEITEM hti = m_wndTree.InsertItem(_T("VC知识库在线杂志"));</P>
<P>m_wndTree.InsertItem(_T("电子文档"));</P>
<P>m_wndTree.InsertItem(_T("在线杂志第一期"), hti);</P>
<P>m_wndTree.InsertItem(_T("在线杂志第二期"), hti);</P>
<P>(3)将对话框放入控制条中</P>
<P>首先在资源编辑器里制作一个CHILD类型的无BORDER对话框,ID为IDD_DIALOGBAR,并以此作为模板生成CVCKBASEDlg类,</P>
<P>并在CMainFrame中添加成员变量 CVCKBASEDlg
m_wndVCKBASE;然后在创建ControlBar后用如下代码创建对话框</P>
<P>m_wndVCKBASE.Create(IDD_DIALOGBAR,&m_wndMyBar1);</P>
<P>m_wndVCKBASE.ShowWindow(SW_SHOW);</P>
<P>至此我们已经大功告成!我们可以编译运行一下看看两个控制条有没有创建成功。</P>
<P>哇噻!只用这几行代码就实现了梦寐以求的界面!</P>
<P><B>三、更加高级的话题</B></P>
<P>3.1
该ControlBar在浮动的时候顶部的把手会消失,变成了普通的ToolWindow类型的标题栏。为了避免这种情况,我们需要在CMainFrame::OnCreate()中,在EnableDocking()后加入:</P>
<P>#ifdef _SCB_REPLACE_MINIFRAME</P>
<P>m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);</P>
<P>#endif //_SCB_REPLACE_MINIFRAME</P>
<P>并在stdafx.h中加上#define _SCB_REPLACE_MINIFRAME</P>
<P>3.2 该类的另外一种风格可以在stdafx.h中加上 #define _SCB_STYLE_FLAT 产生,您不妨试试! </P>
<P>3.3 如何将两个ControlBar停靠在同一行中</P>
<P>DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_BOTTOM);///停靠在底部</P>
<P>RecalcLayout();</P>
<P>Crect rect;</P>
<P>m_wndMyBar1.GetWindowRect(rect);</P>
<P>rect.OffsetRect(1, 0);//偏移一个位置</P>
<P>DockControlBar(&m_wndMyBar2,
AFX_IDW_DOCKBAR_BOTTOM,rect);///也停靠在底部</P>
<P>3.4 如何将两个ControlBar停靠在同一列中</P>
<P>DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_RIGHT);///停靠在右边</P>
<P>RecalcLayout();</P>
<P>Crect rect;</P>
<P>m_wndMyBar1.GetWindowRect(rect);</P>
<P>rect.OffsetRect(0, 1);//看到这里的区别了吗</P>
<P>DockControlBar(&m_wndMyBar2,
AFX_IDW_DOCKBAR_RIGHT,rect);///也停靠在右边</P><BR>
<P align=right>作 者:<B>王骏</B><BR><!--来 源:不详<br>-->共有<FONT color=red> 830
</FONT>位读者阅读过此文</P></TD></TR></TBODY></TABLE>
<HR width="100%" SIZE=1>
<TABLE cellSpacing=1 cellPadding=5 align=center border=0>
<TBODY>
<TR class=td6>
<TD align=middle><A href="http://www.5tb.com/"><IMG height=31
src="轻松实现类VC界面http--www_5TB_com_files/logo.gif" width=88
border=0></A><BR><B>欢迎转载、链接,请注明出处。</B><BR><B>MSN:</B><IMG
src="轻松实现类VC界面http--www_5TB_com_files/email.png"> <B>QQ:</B>6687198 <B><A
href="http://www.5tb.com/ly/index.asp?user=seekri">给我留言</A></B></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -