vc 6.0打造单文档界面与多文档界面的编程
VC++6.0入门【第八章 文档和视图】

第8章文档和视图MFC应用程序的核心是文档/视图结构。
在前面章节的学习中,已经接触了不少文档/视图结构的应用程序,本章将详细分析其结构和原理,并进一步学习使用复杂的文档结构、构造更加丰富的视图。
8.1 文档/视图概述使用MFC的AppWizard可以创建三种类型的应用程序:(1)单文档界面的应用程序(SDI:Single Document Interface)(2)多文档界面的应用程序(MDI:Multiple Documents Interface)(3)基于对话框的应用程序(Dialog based)基于对话框的应用程序框架非常简单,由应用程序类、对话框类构成。
通过应用程序类的InitInstance()函数,构造一个模式对话框对象;调用DoModal()函数,让Windows对话框处理程序象通常情况一样接受和分配消息;用户退出对话框后,程序也就结束了。
我们已经知道SDI应用程序由应用程序类(CWinApp)、框架窗口类(CFrameWnd)、文档类(CDocument)、视图类(CView)和文档模板类(CSingleDocTemplate)共同作用。
MDI应用程序与SDI 应用程序的主要差别在于:MDI有CMDIFrameWnd和CMDIChildWnd两个框架窗口类,前一个派生CMainFrame类,负责菜单等界面元素的主框架窗口管理;后一个派生CChildFrame类,负责相应的文档及其视图的子框架维护。
而SDI由框架窗口类CFrameWnd 派生CMainFrame类。
一个文档可以有多个视图,但一个视图只能对应一个确定的文档。
因此,MDI应用程序需要解决的问题是多个文档的数据管理方法。
在MDI应用程序中,文档模板只支持主窗口。
每打开一个新文档时,都调用文档类的成员函数OnNewDocument(),建立一个由CMDIChildWnd派生的新的MDI子窗口,在子窗口中保存已打开的文档,所有这些细节都由MFC库来处理。
vc++6.0入门教程

vc++6.0入门教程步骤是:(先工程—后文件—编译—连接---运行)1 桌面上的快捷方式如下:双击即可运行2 在所有程序里点击也可以运行:3 即会出现如下界面:4 进入后的界面如下:5 将每日提示关闭既可:6 建立一个工程,“文件”——“新建”1,建立一个工程,“文件”——“新建”,出现下面界面:选择“Win32 Console Application”(控制台应用程序,左边倒数第三个),命名工程名称,选择保存位置,点击“确定”,进入下一步,看到如下提示界面:建立一个空工程,对应其他需要的你一可以建立别的工程;点击“完成”,之后:显示你创建的工程的信息。
2,再在有一个的工程的条件下,我们再建立一个源文件;“文件”——“新建”(快捷键Ctri+N),出现:建立源文件,选择“C++ Source ”,一般都是建立这种文件的(适用在当文件中适用)如果要建立头文件的话,选择“C/C++ Header File”,(适用在多文件工程中使用)命名,文件名称,点击“确定”,之后:进入编辑区,在主界面编写代码:如下编写完之后呢:可以按编译按钮调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接),最后,点运行按钮,就可以运行了。
如果是您有代码如:cpp文件,或.h 文件,想添加都VC6.0里来测试的话,可以这样做:首先,要理解一下文件扩展名为:cpp和.h文件扩张名是.h,代表的是头文件,一般是书写一些函数原型,以及一些在整个程序中常用到的结构体,频繁使用的函数说明,定义等等;文件扩张名为,cpp的,是C++中的源文件,也是最常用到的文件,每建立一个工程都要至少一个源文件(至少要有一个函数入口——主函数main() ),包含了核心代码;建立与运行说明:(以VC 6.0编译器为例,其他编译器类似)首先,打开VC 6.0编译环境;在菜单栏——文件(的下拉菜单中选择“新建”),在弹出的选择窗口中,选择Win32 Console Application(控制台应用程序) ,在填写工程名称,选择一个程序保存路径,点击“完成”,查看工程信息。
VisualC6.0实用教程

9
1.5资源
打开资源 如果需要对已有资源进行查看或修改,可以首先切换到项目工作区窗口的 ResourceView标签页,然后选中要打开的资源,双击鼠标左键或者按Enter 键,这时相应的资源编辑器也会相应自动打开。
删除、复制资源 如果删除一个已有的资源,可以首先切换到项目工作区窗口的ResourceView 标签页,然后选中要打开的资源,按Del键或者利用Edit菜单下的Delete菜 单项可实现删除。复制资源的过程与删除类似,选中要打开的资源,按住 Ctrl键不放,并拖动鼠标左键或利用Edit菜单中的Copy和Paste菜单命令进 行操作,它同其他软件的复制过程相同。
动文件,还可以创建新的目录项以及将一些特殊类型的文件放在该目录项中。 创建一个新目录项,可在添加目录项的地方右击,选择“New Folder”,
如图,输入目录项名称和相关的文件扩展名,单击[OK]。
图1.22 “New Folder”对话框
7
1.5资源
1.5.1资源与资源标识
资源的分类 (1)快捷键列表 (2)工具栏按钮 (3)鼠标指针 (4)对话框 (5)HTML (6)图标 (7)菜单 (8)字符串列表 (9)版本信息
注意:在开发环境中,VC是通过左边的项目工作区窗口来对项目进行各种
管理。项目工作区窗口包含三个页面,是ClassView页、ResourceView页和
FileView页。
Debug或Release
编连过程产生的文件
文件夹
运行文件Ex_Sdi.exe
图标文件Ex_Sdi.ico等
Res文件夹
工具栏资源Toolbar.bmp
标识符 标识符的命名规则:
C++Builder6.0界面开发实例

3
实例 2
创建标题栏在左边的窗口界面
实例目标 实现左边标题,能拖动的窗口。如下图所示:
实现技术 第 一 步 先 指 明 窗 口 BorderStyle 为 bsNone, 这 样 就 不 能 拉 伸 窗 , 没 有 标 题 和 边 框 。 第 二
RECT rc; //左 边 标 题 栏 。 ::SetRect(&rc,0,0,nTitleWidth,ClientHeight); Canvas->Brush->Color = clBlue; Canvas->FillRect(rc); //右 边 边 界 。 ::SetRect(&rc,ClientWidth-2,0,ClientWidth,ClientHeight); Canvas->Brush->Color = clBlue; Canvas->FillRect(rc); //上 面 边 界 。 ::SetRect(&rc,0,0,ClientWidth,2); Canvas->Brush->Color = clBlue; Canvas->FillRect(rc); //下 面 边 界 。 ::SetRect(&rc,0,ClientHeight-2,ClientWidth,ClientHeight); Canvas->Brush->Color = clBlue;
TPoint pt; //取 得 鼠 标 位 置 。 pt.x=LOWORD(tMsg.LParam); pt.y=HIWORD(tMsg.LParam); pt =ScreenToClient(pt);//转 换 为 客 户 坐 标 。
VC++6.0定制窗口的方法+框架窗体、文档视图

3.基于对话框的应用程序(Dialog based Application)
基于对话框的应用程序非常简单,由应用程序类、 对话框类(可以作为其它控件的容器)构成。它的生 命周期可概括为:通过应用程序类的InitInstance()函 数,构造一个模式对话框对象;调用DoModal函数, 让基于对话框的应用程序像对待普通对话框一样接收 和分配消息;用户退出对话框后,程序也就随之结束。 常见的基于对话框的应用程序有计算器等(以对话框 为容器布局的程序)。
第7章 框架窗口、文档和视图
7.1 应用程序组成结构
1.单文档应用程序(Single Document Interface,SDI) 在单文档界面程序中,用户在同一时刻只能操作一个文
档,如记事本程序。在这些应用程序中,打开文档时会自 动关闭当前打开的活动文档,若文档修改后尚未保存,会 提示是否保存所做的修改。因为一次只开一个窗口,因此 不像WORD那样需要一个窗口菜单。单文档应用程序一般 都提供一个“文件”菜单,在该菜单下有一组命令,用于新 建文档、打开已有文档、保存或另存为等。这类程序相对 比较简单,常见的应用程序有终端仿真程序和一些工具程 序。
在文档视图结构中文档类的主要任务通常是对数据进行管理和维护数据将保存在文档类的成员变量中视图通过对这些变量的访问来获取或返回数据并能通过这种方式来更新并显示数据
VC++6.0 定制窗口的方法
VC++6.0 是 Microsoft 新近推出的可视化 C++集成开发环境。它在继承以前 VC++的 基础上增加了许多新的功能,用于支持 Win32 平台应用程序、服务程序和控件的开发。VC++5.0 提供了强 大、快捷的编程工具,其中最基本的是三个导航:AppWizard 用于程序框 架的生成,AppStudio 用于资源 的编辑,ClassWizard 用于类的编辑和管理。其中,窗口 、菜单等无需用户编写程序,而由系统自动生成。 但在许多情况下,用户要设置自己希 望的窗口(即定制窗口)。
Visual C++ 6.0使用说明

Visual C++ 6.0使用说明在VC6.0下,必须先创建工程(Project),然后再添加源文件。
一个真正的软件,往往需要多个源文件和多种资源,例如图片、视频、控件等,通常是把它们放到一个文件夹下,进行有效的管理。
你可以把工程理解为这样的一个文件夹,IDE通过工程来管理这些文件。
工程有不同的类型,例如开发“黑窗口”的控制台程序,需要创建Win32 Console Application工程;开发带界面的GUI程序,需要创建Win32 Application工程。
1) 新建Win32 Console Application工程打开VC6.0,在菜单栏中选择“文件-> 新建”,或者Ctrl+N,弹出下面的对话框:切换到“工程”选项卡,选择“Win32 Console Application”,填写工程名称和路径,点击“确定”,会弹出一个对话框询问类型,这里选择“一个空工程”,如下图所示:点击“完成”按钮完成工程的创建。
2) 新建C源文件在菜单栏中选择“文件-> 新建”,或者Ctrl+N,弹出下面的对话框:切换到“文件”选项卡,选择“C++ Source File”,填写文件名,点击确定完成。
该步骤是向刚才创建的工程添加源文件。
3) 编写C语言代码在工作空间中可以看到刚才创建的工程和源文件,如下图所示:双击hello.c,进入编辑界面,输入上节中的代码。
4) 编译并运行代码在“组建”菜单中找到编译、组建和运行的功能,如下图所示:更加简单的方法是使用快捷方式,如下图所示:保存编写好的源代码,点击运行按钮或Ctrl+F5,如果程序正确,可以看到运行结果,如下图所示:注意:编译生成的.exe 文件在工程目录下的Debug文件夹内。
以上面的工程为例,路径为 E:\cDemo,打开看到有一个Debug文件夹,进入可以看到cDemo.exe。
在Debug目录中还会看到一个名为hello.obj 的文件。
MFC的窗口分割实例以及CSplitterWnd类

3 分割窗口ቤተ መጻሕፍቲ ባይዱ
如图 1,把窗口分成三个视图,左视图基于 CView 类,可用来作几何图形;右上视图基 于 CEditView 类,用于显示文本消息;右下视图基于 CFormView 类,在此视图中做一个文 本框及发送、清除按钮,发送按钮用来向右上视图传送消息。
图 1 设计样式 打开 Microsoft VC++ 6.0,通过 MFC AppWizard(exe)新建名为 SplitWnd 的单文档(SDI) 工程,新建工程时所有选项均按默认设定。 工程建好后,把工程中的 CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,故不阐述,有兴趣读者可与作者联系),由于需要三个视图窗口对应三个
视图类,因此需要手动创建右上视图、右下视图对应的类,可以通过 MFC 向导向应用程序 添加两个 MFC 类(菜单“Insert | New Class>”),因为在右上视图用于显示文本,故其基类选 CEditView,类名为 CLeftTopView;另一个 MFC 类的基类选 CFormView 类,取类名为 CLeftBttmView,该类即对应右下视图(由于该类基于 CFormView 类,需要有对话框与之对 应,故应先在资源中新建对话框,对话框中的控件如图 1)。
void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,文本框对应的变量为 m_sText //通过 CMainFrame 类中的 m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->GetMainWnd(); CWnd * pWnd = pMainFrm->m_wndSplitterRight.GetPane(0, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView, pWnd); pLeftTopView ->GetMsg( m_sText + "\r\n" );//CLeftTopView 成员函数,接收数据 } 右上视图类 CLeftTopView 的成员函数 GetMsg 则需保存接收到的消息并显示,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg += sMsg; // m_sAllMsg 为成员变量,记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen, nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类 CLeftTopView 与右上视图类 CLeftBttmView 之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。
VC++6.0操作简介

VC++6.0操作简介一、 VC++6.0VC++6.0二、 VC++6.0环境的基本操作1. 建立应用程序操作步骤如下:(1) 关闭 当前工作区:【文件】→【关闭 工作区】 (必要时)(2) 建立工程:【文件】→【新建】(出现“新建”对话框)在“新建”对话框中选中“工程”选项卡→选中其中的“Win32 Console Application”项→选择存储“位置”→输入工程名→单击“确定”按钮(出现“Win32Console Application”对话框)在“Win32 Console Application”对话框中选择“An empty project”选项→单击“完成”按钮注意:在操作过程中,如果出现提示性对话框,可根据具体情况按“确定”或“取消”按钮。
至此,一个新的工程已经建立,接下来,可以在该工程中建立文件或(和)将已经存在的文件添加到工程中:在工程中新建文件:【工程】→【添加工程】→【新建】(出现“新建”对话框)在“新建”对话框中选中“文件”选项卡→选中其中的“C++ Source File”或者“C/C++ Header File”项→选择新建的置(目录)→输入文件名→单击“确定”按钮→输入文件内容。
例如,新建的名为M1.cpp的源文件内容如下:向工程中添加文件【工程】→【添加工程】→【Files…】(出现“插入文件到工程”对话框)在“插入文件到工程”对话框中选中要插入的文件→选择文件要插入的工程(插入到)→单击“确定”按钮2.编辑文件操作步骤如下:在“工作区”窗口中选择“FileView”选项卡→展开相应工程的文件分支(工程名files)→双击类要编辑的文件名(此时,相应文件的内容已经显示在编辑窗口中)→对文件进行编辑3.编译、构建与运行应用程序编译源文件:在“工作区”窗口选择“FileView”选项卡→选择要编译的源文件→【编译】→【编译xx】构建可执行文件:设置活动工程(工作区中有多个工程时):【工程】→【设置活动工程】→【xx (工程名)】【编译】→【构建xx.exe】运行应用程序:设置活动工程(工作区中有多个工程时):【工程】→【设置活动工程】→【xx (工程名)】【编译】→【执行xx.exe】4.在工程中新建类(1)新建类:设置活动工程(工作区中有多个工程时需要此步)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
vc++6.0打造单文档界面与多文档界面的编程VC++6中,可以利用MFC向导分别创建单文档和多文档界面的应用程序。
有了这两种类型的应用程序,您就可以实现简单的记事本,写字本和WORD的功能了。
以下介绍一个在文档中输出一段文字,点击菜单项,输入文字内容按OK按钮后可以更改输出的文字。
1.首先,点击MFC向导,选择多文档视图类型,新建一个名为MdiDemo的工程。
2.新建一个对话框。
上面放置一个Static控件和一个Edit控件,按CTRL+W,将Edit控件改成m_Caption.3.新建一个类与对话框对应,如CDlgDemo类。
4.在菜单中,增加一项Demo,并增加菜单项Test.按CTRL+W,并双击后,在消息的上面选择Doc,下面选择Command,双击就产生了对应的事件处理函数。
5.在MdiDemoDoc.cpp类中输入以下:// DlgDemo.cpp : implementation file//#include "stdafx.h"#include "MdiDemo.h"#include "DlgDemo.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CDlgDemo dialogCDlgDemo::CDlgDemo(CWnd* pParent /*=NULL*/): CDialog(CDlgDemo::IDD, pParent){//{{AFX_DATA_INIT(CDlgDemo)m_Caption = _T("");//}}AFX_DATA_INIT}void CDlgDemo::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CDlgDemo)DDX_Text(pDX, IDC_EDIT1, m_Caption);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDlgDemo, CDialog)//{{AFX_MSG_MAP(CDlgDemo)// NOTE: the ClassWizard will add message map macros here//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CDlgDemo message handlers6.在MdiDemoView.cpp中输入以下内容:// MdiDemoView.cpp : implementation of the CMdiDemoView class//#include "stdafx.h"#include "MdiDemo.h"#include "MdiDemoDoc.h"#include "MdiDemoView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMdiDemoViewIMPLEMENT_DYNCREATE(CMdiDemoView, CView) BEGIN_MESSAGE_MAP(CMdiDemoView, CView)//{{AFX_MSG_MAP(CMdiDemoView)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMdiDemoView construction/destruction CMdiDemoView::CMdiDemoView(){// TODO: add construction code here}CMdiDemoView::~CMdiDemoView(){}BOOLCMdiDemoView::PreCreateWindow(CREATESTRUCT&a mp; cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CMdiDemoView drawingvoid CMdiDemoView::OnDraw(CDC* pDC){CMdiDemoDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCRect crect;GetClientRect(&crect);CSize sizeClient=crect.Size();CString str=pDoc->strCaption;CSize sizeTextExtent=pDC->GetTextExtent(str);pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2,(size Client.cy-sizeTextExtent.cy)/2,str);}/////////////////////////////////////////////////////////////////////////////// CMdiDemoView printingBOOL CMdiDemoView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CMdiDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CMdiDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CMdiDemoView diagnostics#ifdef _DEBUGvoid CMdiDemoView::AssertValid() const{CView::AssertValid();}void CMdiDemoView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMdiDemoDoc* CMdiDemoView::GetDocument() //non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMdiDemoDoc)));return (CMdiDemoDoc*)m_pDocument;}#endif //_DEBUG///////////////////////////////////////////////////////////////////////////// // CMdiDemoView message handlers6。
按“CTRL+F5”即可运行。