关于单文档多视与MFC的初始化过程
- 格式:doc
- 大小:2.82 MB
- 文档页数:43
mfc入门单文档MFC应用程序实例-图文14单文档MFC应用程序实例
对话框应用程序使用简洁高教,所以被广泛地使用。
对话框在默认情
况下缺少状态栏、f具栏等界面元素,不能算作是。
完整”的Wwbn应用
程序。
RIUt/Clllr面,可以看作是“标准”的Windown应用程序再面。
1.41技术要点
’MFC的单文档应用程序结构的一大特点是教据和界面分N,在单文
档应用程序中,程序中数据的保存、加藏和处理等功糖由CDocumtI完戚,而数据的显示由cV.州来完成a这种结构又被称为“文彬视田”结构,
在这种结构下.很容器做刊数据和界面的一对多关联。
‘MFC中提供T众多派生于CView的弦生类,每个类都翻IT同的功能,在新建项目时,可以根据蜜际需謇选样不同的根生类。
142实例步骤奉实棚将以CFonnView为例,演示在ViualC++60中新建单文档项目
的鼻体方法。
实例步骤如下所示。
(I)打开ViualC++6.0.单击。
File”/“N州‘菜单。
在弹出对话摧
中选择项目类撼为“MFCAppWiurd(e某e)1.在项目名称文本框中输
A“NffcSdi”,单击“OK-MHE入向导界面。
(2)在向导的Skpl中,选择“Sinlledoeummt“,其余琏项用默认值(参麒1:919)。
单击“Ne某t”按钮进人下一步。
(”向导的Step2.用于设置是否在程序中自动加A对散据库的支持,此步鼻对默认设置不做改动(参照图iIO),直接单击“Ne某r按钮进
AT一步。
MFC视图切换全总结交流的朋友请加我QQ:451072182我的百度空间:/%BB%B6stephen/home单纯视图之间的切换单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。
我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。
在MFC创建SDI的伊始,MFC默认的视图类是CView,如果CView 满足你的需求,可以直接单击finish,如果你不想让CView成为你的默认视图类,你可以在下图这个地方修改。
如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变:在App类里面有个函数叫InitInstance(),在这里面有一段代码CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(Cprogram8Doc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CView1)); //这里更改你的默认视图类,注意不要忘记包含头文件哦if (!pDocTemplate)return FALSE;AddDocTemplate(pDocTemplate);说完了默认视图类的更改,我们现在进入主题。
1、首先创建你需要切换的视图类,AddClass进入或者创建一个控件然后AddClass创建控件关联类,后者适用于Form之类的控件。
2、控制之处,比如菜单项单击、单击鼠标什么的,我是使用菜单项来切换窗口的void CMainFrame::OnView1(){// TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW1);}void CMainFrame::OnView2(){// TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW2);}3、SwitchToForm这个函数主要用于视图切换在这个函数中主要做以下几个动作:1、获得当前视图类指针和需要转换的视图类指针,如果是第一次使用需要New一个,并且与文档类关联;2、改变活动视图;3、显示新视图和隐藏旧视图;4、设置控件ID;5、调整框架视图。
MFC是一个编程框架MFC中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序。
MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。
AppWizard可以用来生成初步的框架文件。
资源编辑器用于帮助直观的设计用户接口。
ClassWizard用来协助添加代码到框架文件,最后,通过类库实现了应用程序特定的逻辑。
MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的。
而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理。
框架或者由其本身处理事件,不依赖程序员的代码,或者调用程序员的代码来处理应用程序特定的事件。
1.S DI生成1.步骤dxq2009首先,打开VC++6.0开发环境,然后,选择”File”菜单中的“New”子菜单,在弹出的对话框中选择“MFC AppWizard(exe)”项并在“Progect name”编辑框中输入合适的工程名字Simple1,如图,它的意思是创建一个基于MFC的应用,接着进入正式的创建过程,MFC 应用程序的创建过程有6步(基于对话框)或者6步(SDI或者MDI),下面首先介绍SDI 应用的创建过程。
(1)第一步用于选择应用的结构以及语言等。
如图1,首先确定应用是否需要Doc/View Architecture Support支持,因为不使用该结构的应用不支持从磁盘文件打开文档,也没有派生于类CWnd的窗口客户区。
上面3个单选按钮用于确定创建的应用类型,包括单文档,多文档,对话框,这里选择第一个。
然后从资源列表框选择应用所使用的语言种类,单击“Next”。
图1(2)第二步为用用程序选择4项数据库支持选项之一:如图2.如果选择了数据库支持,那么单击“Data Source”按钮,选择外部的数据库表项,一般按默认即可,单击“Next”。
图2(3)第三步选择希望包含在应用中的复合文档支持项,同时判定是否启用标准的ActiveX 资源,以及是否为应用的菜单条添加额外的自动化命令等,如图4,一般安默认,单击“Next”图4(4)第四步用于选择应用所需的基本用户接口特征,以及所想使用的工具栏类型,如图5,如果想要修改应用所使用的文件名和扩展名,或者想要调整应用的用户接口和框架风格,就单击“Advanced”,然后修改,一般默认,单击“Next”。
一档多视一设计要求:(1)建立一个多文档的应用项目(项目名称为学生姓名拼音首字母缩写),并将视图类设置为表单类视图。
(2)在该表单中采用编辑框和旋转按钮输入点的横、纵坐标值。
(3)对框架窗口进行切分。
(4)使得左边窗格输入点的坐标值后,右边窗格将在该点处显示一个小方块。
若在右边窗格中任意单击鼠标,则相应的小方块移动到当前鼠标位置处,同时左边编辑框的内容也会随之发生改变。
二实现步骤1、运用MFC应用程序向导新建一个多文档应用程序Ex_chenju。
在向导的第六步中选择视图的基类为CFormView.2、为文档类CEx_chenjuDoc编程:为CEx_chenjuDoc添加自定义数据成员:public:CPoint m_ptRect;在CEx_chenjuDoc构造函数中设置初值:m_ptRect.x=m_ptRect.y=0;用于存放文档数据:坐标位置值。
3、为视图类CEx_chenjuView(基类CFormView)编程:(1)为表单(ResourcesView\Dialog\IDD_EX_chenju_FORM)添加控件,设置控件属性:(2)为CEx_chenjuView建立控件关联变量:(3)为CEx_chenjuView添加自定义数据成员:public:BOOL m_bEditOK;在CEx_chenjuView构造函数中设置初值:m_bEditOK=FALSE;(4)为CEx_chenjuView::OnInitialUpdate()增加代码:void CEx_chenjuView::OnInitialUpdate(){CFormView::OnInitialUpdate();ResizeParentToFit();CEx_chenjuDoc*pDoc=(CEx_chenjuDoc*)GetDocument();m_CoorX=pDoc->m_ptRect.x;m_CoorY=pDoc->m_ptRect.y;m_SpinX.SetRange(0,1024);m_SpinY.SetRange(0,768);UpdateData(FALSE);//编辑框显示坐标位置初值m_bEditOK=TRUE;}(5)为CEx_chenjuView类编辑框IDC_EDIT1,IDC_EDIT2添加EN_CHANGE 消息映射,添加下列代码。
1.1 MFC 文档视图结构程序结构总揽当我们使用MFC AppWizard 生成一个MFC 程序,选用所有默认的设置(当然也是Multiple Documents ,本文讨论主要基于Multiple Documents ,对于Single Document 情况仅以简单表述提及,皆因后者和前者很多相似相同之处,但前者更为复杂,并且更加常用。
),假设你的程序名称为 A ,则你会得到CMainFrame 、CChildFrame 、CAboutDlg 、CADoc 、CAView 、CAApp 6 个类(Single Document 仅少一个CChildFrame 类,其余均同)。
这些类的具体含义将在后面给出,这里先要给出一个MFC 支持文档视图结构程序(以下简称App )的主要组成:一个App (对应类CAApp )可以包含多个文档模版(CDocTemplate ),但是MFC AppWizard (无论是SDI 还是MDI )都只是默认生成一个。
但是在实际开发中一个文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。
这个结构是通过MFC 中CWinApp 的成员变量CDocManager*m_pDocManager 实现的,我们的CAApp 正是继承自MFC 提供的CWinApp 类。
CDocManager 类则拥有一个指针链表CPtrList m_templateList 来维护这些文档模版。
这些文档模版都是在CAApp ::InitInstance ()中通过AddDocTemplate(pDocTemplate) 。
CDocTemplate 拥有3 个成员变量,分别保存着Document 、View 、Frame 的CRuntimeClass 指针,另外持有成员变量m_nIDResource ,用来指定这个Document 显示时候采用的菜单资源。
这 4 份数据都在CAApp ::InitInstance ()中CDocTemplate 的构造函数中指定。
VS2008和VS2010 OpenGL的MFC初始化(吐血整理)1.建立一个单文档工程XXX2.这时你会看见自动生成了很多的类,08和10版本的还是不一样,但是主要的类还是那么几个,我们主要关注的是XXXView类,首先得保证你的电脑包含了OpenGL工具包,没有的话自己下载个很方便。
查看方法安装路径下vc/include/GL看看有没有GL.h,glu.h,gluax.h,自己最好添加个glut.h.。
3.在stdafx.h头文件中,添加#include”GL/gl.h”, #include”GL/glu.h”,如果有glut.h的话就直接添加一句#include”GL/glut.h”就可以了。
4.在XXXView.h文件中加入所需的成员变量和函数:public:CClientDC *m_pDC;void InitOpengl();BOOL SetupPixelFormat(void);void DrawScene(void);5.在XXXView.cpp文件中,在CXXXView的构造函数中加入:m_pDC=NULL;6.在XXXView.cpp文件中,加入相应的成员函数(直接复制就行):void CXXXView::InitOpengl(){PIXELFORMATDESCRIPTOR pfd;int n;HGLRC hrc;m_pDC=new CClientDC(this);ASSERT(m_pDC != NULL);if(!bSetupPixelFormat())return;n=::GetPixelFormat(m_pDC->GetSafeHdc());::DescribePixelFormat(m_pDC->GetSafeHdc(), n,sizeof(pfd),&pfd);hrc=wglCreateContext(m_pDC->GetSafeHdc());wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);}BOOL CXXXView::SetupPixelFormat(){static PIXELFORMA TDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,24,0, 0, 0, 0, 0, 0,0,0,0,0, 0, 0, 0,32,0,0,PFD_MAIN_PLANE,0,0, 0, 0};int pixelformat;if((pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0) {MessageBox("ChoosePixelFormat failed");return FALSE;}if(SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) {MessageBox("SetPixelFormat failed");return FALSE;}return TRUE;}void CXXXView::DrawScene(void){//设置清屏颜色为黑色glClearColor(0.0f,0.0f,0.0f,0.0f);//清除颜色缓冲区和深度缓冲区glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//矩阵堆栈函数,和glPopMatrix()相对应添加你想要话的图形,如:glRectf(-0.5,-0.5,0.5,0.5);//画一个矩形;SwapBuffers(wglGetCurrentDC());//不能省略}7.在XXXView.cpp文件中,在PreCreateWindow函数中加入:cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;//比较重要8.在XXXView.cpp文件中,在OnDraw函数中加入:DrawScene();9.在CXXXView中,建立如下消息的映射函数:WM_CREATE, WM_DESTROY, WM_SIZE, WM_ERASEBKGND,并加入划线的代码,如下所示:int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code hereInitOpengl();return 0;}void CXXXView::OnDestroy(){CView::OnDestroy();// TODO: Add your message handler code hereHGLRC hrc;hrc = ::wglGetCurrentContext();::wglMakeCurrent(NULL,NULL);if(hrc)::wglDeleteContext(hrc);if(m_pDC)delete m_pDC;}BOOL CXXXView::OnEraseBkgnd(CDC* pDC){return TRUE;}void CXXXView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);// TODO: Add your message handler code hereint w=cx;int h=cy;GLfloat nRange=1.0f;//避免除数为0if(h==0)h=1;//设置视口与窗口匹配glViewport(0,0,w,h);//重新设置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();//建立正交变换下的剪切体if(w<h)glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);elseglOrtho(-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}需要注意的是08中没有类向导,需要右键你的类添加消息映射,最后祝大家学习愉快。
很多刚学MFC的人都会被MFC给弄的晕头转向。
以前传统的C语言中的main ()不见了,window sdk api 中的WinMain()函数也不见了,到底用MFC编写的程序是如何开始运行的呢?到底MFC有没有遵从最基本的C++的标准呢?到底MFC的代码运行的顺序又是怎么样的呢?那么多个文件,那么多函数,到底哪一个先运行,哪一个后运行,哪一个调用哪一个,哪一个又被哪一个调用(你看晕了吧?那么多“哪一个”^_^)?这里这么复杂,到底最真是的是怎么一回事呢?我开始学习的时候,也是一头雾水,什么都不明白,但是为了能先学习一些其他的,我囫囵吞枣的看了过去,先学习了CDIALOG和CVIEW的一些用法,并能编出了一个很简单的程序。
前几天,上网的时候,看到好多人都在看《孙鑫vc++讲座》视频教程,好像大家反应还不错,于是,我就去找个地方下载下来看了。
刚好今天看到了MFC 的运行机制,里面讲到了MFC的运行顺序。
孙同学在视频中是利用实例,利用断点,然后不断的进行调试运行,以实事(实事胜于雄辩啊!!!)告诉我们,MFC 是如何开始运行的。
下面,我就根据我看到的教程,和网上一些前辈整理出来的材料在整理:重点:MFC运行机制执行顺序各个函数用途以及调用顺序孙同学在视频中反复说明的是:MFC的程序和C语言的程序,从执行原理上说,是完全一致的。
抓住这一点,那么对于理解MFC程序的运行机制也就相对于简单了。
C中的main函数就相当于MFC中的WinMain函数。
感兴趣的可以利用VC的断点设置自己跟踪下面讲述的各个函数,就明白它的执行顺序了。
一、C语言程序执行步骤在C语言中,大约的步骤如下:1,全局变量内存分配例子如下:#include <iostream.h>int a=88;main(){cout<<a<<endl;}如果我们在main前设置断点,我们就会发现,在进入main之前,a就已经存在了。
MFC有些老了,但还不失为一种很好的编程工具,尽管他的类很复杂,这篇博客主要根据孙鑫的讲解总结一些到底MFC是将Win32的那套创建窗口的机制放到了那里了。
新建一个单文档的MFC应用程序,你会发现一开始就有5个类,假设你的工程叫做Test那么这五个类就是CTestApp CTestDoc CTestView CMainFram CTestDlg,首相声明那个CTestDlg是一个关于对话框也就是和你编程几乎没有太大关系,此处不做研究,其次关于CTestDoc,本篇博客也不做详细探究,你只需要知道他是一个关于数据的类就行了,ms这样做就是要将数据与显示相分离,以便逻辑更加清晰下面就剩下CTestApp CMainFram 和CTestView了,CMainFram和CTestView 同宗,他们都是从CWnd派生而来的,在每个工程中用CTestView的GetParent()就能够拿到他的父窗口,你会发现那个就是CMainFram。
每个程序只能有一个类从CWinApp派生出来,本程序就是CTestApp,这个类只能有一个实例,表示本程序,同时CTestApp负责将CTestDoc,CTestView,CMainFram结合到一起,好了了解到这里我们开始进入正题了在你的单文档MFC应用程序中是找不到WinMain()的,原因是ms将WinMain()通过连接器连接而来的WinMain(),但ms提供了MFC的源代码,到你的vc安装目录VC98/MFC/SRC里面存的就是MFC的源代码了,WinMain()的定义就放在了APPMODUL.cpp中(通过一个宏_tWinMain ()给出的),你要是感兴趣可以尽情的查看代码,这个比较枯燥,但对研究操作系统的人来说,这个很有趣~MFC的窗口时如何创建的呢?1、首先你会发现程序创建了一个全局的CTestApp对象theApp,由于它是全局对象,程序会先于WinMain()而执行到这句。
MFC使用教程范文MFC(Microsoft Foundation Classes)是微软开发的一种用于Windows操作系统的C++类库,可用于开发图形用户界面(GUI)应用程序。
MFC使用教程将指导您如何使用MFC库来创建基于Windows的应用程序。
第一部分:基本概念和环境设置(200字)在开始使用MFC之前,您需要了解一些基本概念和环境设置。
首先,MFC是一个C++类库,包含了各种用于构建Windows应用程序的类和函数。
它提供了处理窗口、控件、消息等等的功能。
其次,您需要一个C++编译器和开发环境,如Visual Studio。
确保您已经安装了Visual Studio以及所需的MFC组件。
第二部分:创建一个MFC应用程序(300字)步骤1:打开Visual Studio并选择创建“新项目”。
步骤2:选择MFC应用程序向导,并输入项目名称和位置。
步骤3:选择应用程序类型(单文档/多文档/对话框)。
步骤4:在向导的下一步中,选择所需的特性和选项。
步骤5:在应用程序向导中完成剩余设置,并单击“完成”来创建项目。
步骤6:Visual Studio将自动生成与所选应用程序类型相对应的源代码和资源文件。
第三部分:了解主要概念(300字)在了解如何使用MFC库之前,您需要了解一些主要概念。
首先是对话框,它是一个用于显示和与用户交互的窗口。
其次是框架窗口,用于包含和管理窗口的集合。
控件是用于接收和显示用户输入的界面元素,如按钮、文本框等。
消息是在窗口间传递的信息,用于处理用户输入和应用程序的操作。
第四部分:使用MFC库创建控件和处理消息(400字)步骤1:在资源视图中选择对应的对话框或窗口。
步骤2:在工具箱中选择所需的控件,并将其拖放到对话框或窗口上。
步骤3:在类视图中选择对应的对话框或窗口类。
步骤4:在类向导中选择“消息映射”选项,并添加所需的消息处理函数。
步骤5:在消息处理函数中编写代码来处理控件的事件或用户输入。
mfc运行流程
MFC程序的运行流程如下:
1.程序启动
程序启动时,首先会调用WinMain函数。
WinMain函数是MFC程序的入口函数,负责程序的初始化和运行。
2.程序初始化
在WinMain函数中,会调用CWinApp::InitInstance()函数进行程序的初始化。
CWinApp::InitInstance()函数负责注册窗口类、创建应用程序对象、创建窗口等工作。
3.窗口创建
在程序初始化完成后,会创建应用程序的窗口。
应用程序窗口是应用程序的入口,用户可以通过应用程序窗口与应用程序进行交互。
4.消息循环
在窗口创建完成后,会进入消息循环。
消息循环是MFC程序的核心,负责处理来自操作系统的消息。
5.程序退出
用户关闭应用程序时,会调用CWinApp::ExitInstance()函数退出程序。
CWinApp::ExitInstance()函数负责释放程序使用的资源。
MFC单文档窗体类的创建过程MFC(Microsoft Foundation Classes)是微软公司提供的一种面向对象的程序开发工具,用于简化Windows操作系统的应用程序开发。
MFC 提供了丰富的类库和框架,使开发人员能够更快速地创建Windows程序。
在MFC中,窗体类是常用的一种类,用于创建窗体应用程序。
本文将详细介绍MFC单文档窗体类的创建过程。
在MFC中,创建单文档窗体类的过程可以分为以下几个步骤:1.创建一个新的MFC应用程序项目首先,需要使用MFC应用程序向导创建一个新的MFC应用程序项目。
打开Visual Studio,选择“文件”->“新建”->“项目”,在“新建项目”对话框中选择“Visual C++”->“MFC”->“MFC应用程序”,并填写项目名称和保存路径,点击“确定”按钮。
接下来,按照向导的指引,选择“单文档”应用程序类型,并点击“完成”按钮。
2.添加对话框资源在MFC应用程序项目创建完成后,需要添加对话框资源。
在资源视图中,选择“添加”->“资源”->“对话框”,在弹出的对话框中输入对话框名称,并点击“确定”按钮。
此时,会自动生成一个对话框资源,可以在其中添加所需的控件。
3.创建窗体类在MFC应用程序项目中,会自动生成一个CWinApp类和一个CMainFrame类。
我们需要创建一个新的窗体类,用于承载对话框资源。
在Solution Explorer中,右击“源文件”->“添加”->“类”,在弹出的“添加类”对话框中选择“MFC”->“MFC类”->“单文档视图”,并填写类名称和保存路径,点击“添加”按钮。
此时,会自动生成一个新的窗体类,可以在其中添加处理逻辑。
4.修改窗体类代码打开新生成的窗体类的头文件和源文件,可以看到自动生成的代码。
在头文件中,需要包含所需的头文件,并声明成员变量和成员函数。
在源文件中,需要实现窗体类的构造函数、析构函数和其他成员函数。
MFC中创建基于CFormView的⽂档视图程序在MFC中可以创建多种类型的窗⼝程序,如对话框程序、单⽂档结构程序(⾮⽂档/视图结构)、单⽂档(⽂档/视图结构)以及多⽂档视图结构程序等。
在编写⼀般的⼩⼯具时,我们的⾸选显然是对话框程序,不过基于对话框的程序不⽀持视图类,有些功能实现起来会⿇烦许多。
此时我们可以使⽤CFormView作为基类来创建单⽂档(⾮⽂档/视图结构)和单⽂档(⽂档/视图结构)的程序。
⼀、使⽤MFC向导创建程序(1)单⽂档(⽂档/视图结构)(2)不需要状态栏和⼯具栏(3)使⽤CFormView作为基类(4)使⽤向导创建好的程序窗⼝⼆、程序初始化设置在这个由MFC向导创建的程序窗⼝中有些功能或许是我们不想要的,⽐如视图标题、视图凹陷效果、菜单栏、⿏标拖动窗⼝边框调整窗⼝⼤⼩等。
1. 不显⽰视图标题、禁⽌以拖动⽅式调整窗⼝⼤⼩、禁⽤菜单栏BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;// TODO: 在此处通过修改// CREATESTRUCT cs 来修改窗⼝类或样式cs.style &= ~FWS_ADDTOTITLE; /* 不显⽰视图标题 */cs.style &= ~WS_THICKFRAME; /* 禁⽌以拖动⽅式调整窗⼝⼤⼩ */cs.hMenu = NULL;return TRUE;}2. 去除视图凹陷效果BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改// CREATESTRUCT cs 来修改窗⼝类或样式cs.style &= ~WS_BORDER; /* 去除视图凹陷效果 */return CFormView::PreCreateWindow(cs);}3. 修改程序窗⼝标题BOOL CTestApp::InitInstance(){............m_pMainWnd->SetWindowText( L"测试程序" ); /* 修改程序窗⼝标题 */ // 唯⼀的⼀个窗⼝已初始化,因此显⽰它并对其进⾏更新m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();// 仅当具有后缀时才调⽤ DragAcceptFiles// 在 SDI 应⽤程序中,这应在 ProcessShellCommand 之后发⽣return TRUE;}经过以上⼏步的设置,程序界⾯就基本符合我们的需求了。
mfc 单文档框架加载流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 应用程序对象创建:创建一个应用程序对象(通常是从 `CWinApp` 类派生的类)。
MFC多视图单文档窗口分割当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图。
应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一。
一、引用当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图。
应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一。
切分窗口分为动态切分窗口和静态切分窗口,它们都是由CsplitterWnd类(MFC类库)来实现的,在这两种表示方式中,创建同一视图类的对象是比较容易的(Cview),而在同一应用程序使用两个或更多的视图类(如:ClistView、CtreeView等),相对来说则要困难一些。
动态切分功能多应用在编辑文本类的软件中,在实际的开发中,我们经常要用到的是静态切分功能。
静态切分窗口是指在窗口创建时,切分窗口的窗格就已经创建好了,且窗格的数量和顺序不会改变,窗格为一个分隔条所分隔,用户可以拖动分隔条调整相应窗格的大小。
静态切分窗口最多支持16行´16列的窗格,而且不同的窗格往往使用不同的视图类。
本文主要阐述静态切分窗口。
二、实例以单文档SDI应用程序为例,在框架客户区实现三叉切分窗口,且每个窗格使用不同的视图。
实现步骤:1、利用VC++6.0 的AppWizard创建一个单文档SDI应用程序,项目名为Test。
2、使用New Class对话框添加新的视图类:CinfoView 基类为列表视图类ClistViewCLineView 基类为表单视图类CFormViewCMyEditView 基类为编辑视图类CEditView要点:在添加ClineView之前,需要先创建一个对话模板资源,ID为IDD_FORMVIEW,3、在框架窗口类CMainFrame中声明一个CsplitterWnd类的成员变量m_wndSplitter1,用于第一次切分。
第三节建立简单MFC单文档CFrameView的实现(CCheckBox,List)一.建立MFC单文档首先打开VS2008,在“文件”中新建项目,选择visualC++中的“MFC应用程序”命名为“Thrid”确认,弹出“MFC应用程序向导”;点击下一步,在应用程序类型中选择“单文档”,在“用户功能界面”中勾选“最大化”;点击下一步,在生成的类中的基类选择“CFormView”,点击完成单文档的建立。
若弹出对话框显示“没有可用的CFormView的打印支持”,选择“是”即可。
二.MFC单文档的主要结构工程文件主框架文档视图头文件Thrid.h MainFrm.h ThridDoc.h ThridView.h源文件Thrid.cpp MainFrm.cpp ThridDoc.app ThridView.app 其中Thrid.cpp是进入接口,并在CThridApp 中初始化,并通过文档模板按顺序建立文档、主框架、视图,如下代码。
执行顺序可通过在源文件中的构造中建立断点,执行即可。
BOOL CThridApp::InitInstance(){......// 将用作文档、框架窗口和视图之间的连接CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CThridDoc),RUNTIME_CLASS(CMainFrame), // 主SDI 框架窗口RUNTIME_CLASS(CThridView));if (!pDocTemplate)return FALSE;AddDocTemplate(pDocTemplate);......m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);//主窗口的最大化显示m_pMainWnd->UpdateWindow();......}资源视图主要结构Dialog Menu ToolbarIDD_THRID_FORM IDR_MAINFRAME IDR_MAINFRAME在IDD_THRID_FORM中可以进行窗口的设计,IDR_MAINFRAME可以进行菜单栏和工具栏的编辑。
单文档多视的实现 多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。2)通过一个文档关联多个视图,窗口显示整个视图。第二种实现较第一种复杂,这里给出详细的实现方法。 Step 1:使用VC 6.0新建一个Project,命名为:MultiView。除选择单文档属性外,一切使用“默认”方式。于是你可以获得五个类:CMainFrame,CMultiViewApp,CMultiViewDoc,CMultiViewView,和CAboutDlg;
Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument的实现: CMultiViewDoc* CAnotherView::GetDocument() { return (CMultiViewDoc*)m_pDocument; }
Step 3:在CMultiViewApp添加成员变量记录这两个视图: private: CView* m_pFirstView; CView* m_pAnotherView; 给程序菜单IDR_MAINFRAME添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数:(voidCMultiViewApp::OnShowFirstview()和voidCMultiViewApp::OnShowSecondview()); 注意这里将菜单消息的响应都放在app对象里面,而不是放到MainFrame对象中进行。
Step 4:创建新的视图:在BOOLCMultiViewApp::InitInstance()中添加代码: „„. //创建一个新的视图 CView* m_pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView(); m_pFirstView = m_pActiveView;
m_pAnotherView = new CAnotherView();
//文档和视图关联 CDocument* m_pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
CCreateContext context; context.m_pCurrentDoc = m_pDoc;
//创建视图 UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1; CRect rect; m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd, m_IDFORANOTHERVIEW,&context); „„
Step 5:现在已经创建了视图,并且都和文档关联起来了。现在要作的就是视图间的转换。在voidCMultiViewApp::OnShowFirstview()中添加实现代码: void CMultiViewApp::OnShowFirstview() { // TODO: Add your command handler code here UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID); ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID)); ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);
m_pAnotherView->ShowWindow(SW_HIDE); m_pFirstView->ShowWindow(SW_SHOW);
((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pFirstView); ((CFrameWnd*) m_pMainWnd)->RecalcLayout(); m_pFirstView->Invalidate(); }
在voidCMultiViewApp::OnShowSecondview()中添加实现代码: void CMultiViewApp::OnShowSecondview() { // TODO: Add your command handler code here UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID); ::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID)); ::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);
m_pFirstView->ShowWindow(SW_HIDE); m_pAnotherView->ShowWindow(SW_SHOW);
((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pAnotherView); ((CFrameWnd*) m_pMainWnd)->RecalcLayout(); m_pAnotherView->Invalidate(); }
Step 6:为了演示,这里将不同的视图给予一个标记,在CMultiViewView和CAnotherView的OnDraw方法中分别添加以下代码: pDC->TextOut(400,300,"First View"); pDC->TextOut(400,320,pDoc->GetTitle()); 和 pDC->TextOut(400,300,"Another View"); pDC->TextOut(400,320,pDoc->GetTitle());
至此就大功告成了,但是实现过程中有4点说明: 1) 实现中由于使用到相关的类,因此在必要的地方要include相关的头文件,这里省略;CAnotherView的默认构造函数是Protected的,需要将其改为Public,或者提供一个产生CAnotherView对象的方法(因要创建视图对象); 2) 这里给出的是一个示例代码,实际开发中可以通过参考实现获得自己想要实现的具体应用情况(例如视图类的不同、数量不同,更重要的还有业务逻辑的不同实现等); 3) 本文的示例代码已上传到Blog,可以通过下面的地址获得代码。
MFC程序总体的架构 CWinApp――取代WinMain的地位 。。。。。。。
。。。。。 CFrameWnd――取代WndProc的地位
在MFC里面,似乎应该是在CWnd类里有一个WindowProc这个类,应该就是这个函数来作为窗口回调函数,因为所有的窗口回调函数都继承自CWnd类,CFrame类也是的。 在MFC中,为了让程序更加结构化,更容易理解和维护,利用了两个宏来处理消息映射:DECLARE_MESSAGE_MAP和BEGIN_MESSAGE_MAP,见前面第三章。
程序运行第一步:引爆器――Application Object 从这一节以下,将以此图解释MFC程序的激活,运行与结束,不同小节的图将标示出当时的程序进行状况 程序运行第二步:隐晦不明的WinMain 主要动作: tWinMain调用AfxWinMain,AfxWinMain调用AfxWinInit 在这个过程中, tWinMain的参数hInstance经过AfxWinMain传给AfxWinInit,然后在AfxWinInit中利用传进来的参数对theApp对象进行初始化(利用全局函数AfxGetApp) 在AfxWinInit中除了对theApp对象进行初始化之处,还调用AfxInitThread函数对线程进行初始化。 程序运行第三步:AfxWinInit――AFX内部初始化动作 程序运行第四步:CWinApp::InitApplication 程序运行第五步:CMyWinApp::InitInstance 程序运行第六步:CFramWnd::Create产生主窗口(并先注册窗口类别) 小结: 在MFC中,应用程序窗口的产生,必须经历窗口类的注册-》创建-》显示。 这一系列的动作是通过theApp->InitInstance()函数来组织调用的。PS:即在InitInstance里做了好多的工作,调用了相关的函数,这些函数就有窗口类的注册,窗口的创建和窗口的显示工作。 窗口类的注册动作,MFC给我们提供的接口是各个窗口类的PreCreateWindow()函数, BOOL CStudentInfoView::PreCreateWindow(CREATESTRUCT& cs) 利用这个结构体参数,对窗口的样式进行设定,这个结构体如下: typedef struct tagCREATESTRUCT { LPVOID lpCreateParams; HANDLE hInstance; HMENU hMenu; HWND hwndParent; int cy; int cx; int y; int x; LONG style; LPCSTR lpszName; LPCSTR lpszClass; DWORD dwExStyle; } CREATESTRUCT; 怎么让一个窗口居中显示?? 利用cy,cx参数??