📄 chap6_4.htm
字号:
<html>
<head>
<title>6.4 在非对话框窗口中使用控件</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="615" cellspacing="0" cellpadding="0">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></a></span></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="CENTER"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">6.4 </font><font SIZE="3" color="#3973DE">在非对话框窗口中使用控件</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">控件并不是对话框独有的,事实上,很多非对话框窗口都可以使用控件.比较典型的应用是在表单视图、工具条和状态栏中使用控件.</font><font FACE="Times New Roman" SIZE="3"></p>
<b><p ALIGN="JUSTIFY"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">6.4.1
</font><font SIZE="3" color="#3973DE">在表单视图中使用控件</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">MFC</font><font SIZE="3">提供了一个名为</font><font FACE="Times New Roman" SIZE="3">CFormView</font><font SIZE="3">的特殊视图类,我们称其为表单视图.表单视图是指用控件来输入和输出数据的视图,用户可以方便地在表单视图中使用控件.表单视图具有对话框和滚动视图的特性,它使程序看起来象是一个具有滚动条的对话框.在有些情况下,用表单视图比用普通视图更符合用户的需要,例如,在向数据库输入数据时,显然用表单的形式可以更习惯些.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">用</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">可以方便地创建基于表单视图的应用程序,只要在</font><font FACE="Times New Roman" SIZE="3">MFC AppWizard</font><font SIZE="3">对话框的第六步先选择</font><font FACE="Times New Roman" SIZE="3">CView</font><font SIZE="3">,然后在</font><font FACE="Times New Roman" SIZE="3">Base class</font><font SIZE="3">栏中选择</font><font FACE="Times New Roman" SIZE="3">CFormView</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">就会创建一个基于</font><font FACE="Times New Roman" SIZE="3">CFormView</font><font SIZE="3">的应用程序.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">读者可以按上述方法建立一个名为</font><font FACE="Times New Roman" SIZE="3">Test</font><font SIZE="3">的应用程序.在</font><font FACE="Times New Roman" SIZE="3">Test</font><font SIZE="3">工程的资源中,读者会发现一个</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">IDD_TEST_DIALOG</font><font SIZE="3">的对话框模板,该对话框模板可供用户放置和安排控件.在程序运行时,框架根据该对话框模板创建</font><font FACE="Times New Roman" SIZE="3">CFormView</font><font SIZE="3">对象,并根据模板的信息在表单视图中自动创建控件.与设计对话框类相类似,用户可以用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">为表单视图类加入与控件对应的成员变量,可以调用</font><font FACE="Times New Roman" SIZE="3">UpdateData</font><font SIZE="3">在控件和成员变量之间交换数据,但对控件的初始化工作是在</font><font FACE="Times New Roman" SIZE="3">OnInitialUpdate</font><font SIZE="3">函数而不是在</font><font FACE="Times New Roman" SIZE="3">OnInitDialog</font><font SIZE="3">函数中进行的.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">基于表单视图的应用程序与基于对话框的应用程序都是在应用程序中直接使用控件,但二者有很多不同之处.基于对话框的应用程序是用一个对话框来作为程序的主窗口的,因而程序的主窗口的特性与对话框类似,如窗口的大小不能改变,程序没有菜单条、工具条和状态栏等.基于表单视图的应用程序仍然是基于</font><font FACE="Times New Roman" SIZE="3">Doc/View</font><font SIZE="3">框架结构的(见七、八、九章),只是视图被换成了表单视图,也就是说,应用程序的窗口可以改变大小,程序有菜单条、工具条和状态栏,且程序仍然可以</font><font FACE="Times New Roman" SIZE="3">Dov/View</font><font SIZE="3">运行机制来处理文档.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">表单视图比较简单,这里就不举例说明了.在第十章,读者会看到使用表单视图的例子.</font><font FACE="Times New Roman" SIZE="3"></p>
<b><p ALIGN="JUSTIFY"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">6.4.2
</font><font SIZE="3" color="#3973DE">在工具条和状态栏中使用控件</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">一个专业的程序常常会在工具条和状态栏中加入一些控件以方便用户的使用.例如,在</font><font FACE="Times New Roman" SIZE="3">Developer Studio</font><font SIZE="3">的工具条中就有不少组合框,而在状态栏中则常常会显示一个进度条来表明工作的进度.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">如果读者想在自己程序的工具条和状态栏中加入控件,则需要掌握一些技巧.在本小节,我们将结合一个具体实例来演示这些技巧.例程的名为</font><font FACE="Times New Roman" SIZE="3">CtrlInBar</font><font SIZE="3">,其界面如图</font><font FACE="Times New Roman" SIZE="3">6.8</font><font SIZE="3">所示.可以看出,该程序在工具条中创建了一个组合框,在状态栏中创建了一个进度条.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="center"></font><img src="T6_8.gif" alt="T6_8.tif (174388 bytes)" WIDTH="480" HEIGHT="342"><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="center"></font><font SIZE="3">图</font><font FACE="Times New Roman" SIZE="3">6.8
CtrlInBar</font><font SIZE="3">程序</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">现在让我们开始工作.首先,请读者用</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">建立一个名为</font><font FACE="Times New Roman" SIZE="3">CtrlInBar</font><font SIZE="3">的单文挡</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">应用程序,然后,请按清单</font><font FACE="Times New Roman" SIZE="3">6.4</font><font SIZE="3">修改源代码.注意在程序中编写了一个</font><font FACE="Times New Roman" SIZE="3">CToolBar</font><font SIZE="3">类的派生类</font><font FACE="Times New Roman" SIZE="3">CMyToolBar</font><font SIZE="3">,以及一个</font><font FACE="Times New Roman" SIZE="3">CStatusBar</font><font SIZE="3">的派生类</font><font FACE="Times New Roman" SIZE="3">CMyStatusBar</font><font SIZE="3">,这两个类与</font><font FACE="Times New Roman" SIZE="3">CMainFrame</font><font SIZE="3">类在同一模块中.</font><font FACE="Times New Roman" SIZE="3"></p>
</font><b><font SIZE="3"><p ALIGN="JUSTIFY">清单</font><font FACE="Times New Roman" SIZE="3">6.4 </font><font SIZE="3">在工具条和状态栏中创建控件的有关代码</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// MainFrm.h : interface of the CMainFrame class</p>
<p ALIGN="JUSTIFY">//</p>
<p ALIGN="JUSTIFY">/////////////////////////////////////////////////////////////////////////////</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">#define IDC_MYCOMBO 100</p>
<p ALIGN="JUSTIFY">class CMyToolBar : public CToolBar</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">public:</p>
<p ALIGN="JUSTIFY">CComboBox m_ComboBox;</p>
<p ALIGN="JUSTIFY">BOOL CreateComboBox(int nIndex);</p>
<p ALIGN="JUSTIFY">}; </p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">#define ID_INDICATOR_PROGRESS 100</p>
<p ALIGN="JUSTIFY">class CMyStatusBar : public CStatusBar</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">public:</p>
<p ALIGN="JUSTIFY">CProgressCtrl m_Progress;</p>
<p ALIGN="JUSTIFY">int m_nProgressPane;</p>
<p ALIGN="JUSTIFY">BOOL CreateProgressCtrl(int nPane);</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">afx_msg void OnSize(UINT nType, int cx, int cy);</p>
<p ALIGN="JUSTIFY">DECLARE_MESSAGE_MAP()</p>
<p ALIGN="JUSTIFY">};</b></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">class CMainFrame : public CFrameWnd</p>
<p ALIGN="JUSTIFY">{</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">. . . . . .</b></p>
<p ALIGN="JUSTIFY">protected: // control bar embedded members</p>
<p ALIGN="JUSTIFY"><b>CMyStatusBar</b> m_wndStatusBar;</p>
<p ALIGN="JUSTIFY"><b>CMyToolBar</b> m_wndToolBar;</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">. . . . . .</b></p>
<p ALIGN="JUSTIFY">};</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// MainFrm.cpp : implementation of the CMainFrame class</p>
<p ALIGN="JUSTIFY">//</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">. . . . . .</b></p>
<p ALIGN="JUSTIFY">static UINT indicators[] =</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">ID_SEPARATOR, // status line indicator</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">ID_SEPARATOR</b></p>
<p ALIGN="JUSTIFY">};</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</p>
<p ALIGN="JUSTIFY">return -1;</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if (!m_wndToolBar.Create(this) ||</p>
<p ALIGN="JUSTIFY">!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">TRACE0("Failed to create toolbar\n");</p>
<p ALIGN="JUSTIFY">return -1; // fail to create</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if (!m_wndStatusBar.Create(this) ||</p>
<p ALIGN="JUSTIFY">!m_wndStatusBar.SetIndicators(indicators,</p>
<p ALIGN="JUSTIFY">sizeof(indicators)/sizeof(UINT)))</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">TRACE0("Failed to create status bar\n");</p>
<p ALIGN="JUSTIFY">return -1; // fail to create</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// TODO: Remove this if you don't want tool tips or a resizeable
toolbar</p>
<p ALIGN="JUSTIFY">m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |</p>
<p ALIGN="JUSTIFY">CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_wndToolBar.CreateComboBox(0); //</font><font SIZE="3">在工具条的最左边创建组合框</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_wndStatusBar.CreateProgressCtrl(1); //</font><font SIZE="3">在第二个窗格创建进度条</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_wndToolBar.m_ComboBox.AddString("Item1");</p>
<p ALIGN="JUSTIFY">m_wndToolBar.m_ComboBox.AddString("Item2");</p>
<p ALIGN="JUSTIFY">m_wndToolBar.m_ComboBox.AddString("Item3");</p>
<p ALIGN="JUSTIFY">m_wndToolBar.m_ComboBox.AddString("Item4");</p>
<p ALIGN="JUSTIFY">m_wndStatusBar.m_Progress.SetRange(0,200);</p>
<p ALIGN="JUSTIFY">m_wndStatusBar.m_Progress.SetPos(100);</b></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -