MFC初始化机制

合集下载

关于MFC的有些知识

关于MFC的有些知识

关于MFC的有些知识实验⼀1、在VC++中,⼯程与各种源⽂件之间是什么关系?解答:⼯程的实质是⼀些相互关联的源⽂件的集合,可以把项⽬理解成⼀个⼯作任务, 开发环境中,⼯程包含在⼯作区间中,⼀个⼯作区可以管理多个⼯程2、⼀个VC++⼯程下会有3个⽂件夹,这3个⽂件夹分别是什么?以.cpp为后缀的⽂件会添加到哪个⽂件夹中?以.h为后缀⽂件会添加到哪个⽂件夹中?解答:分别是head Files ,Sourse Files, Resourse Files ,.cpp放在Sourse ⽂件⾥⾯,.h放在Head Files⽂件⾥3,以win32 console application⼯程为例,简述⼯程的建⽴,⽂件的添加,⼯程的编译和链接及⼯程的执⾏过程。

解答:这个就是win32 console application⼯程的实例验证过程。

实验⼆1.简述Windows应⽤程序的特点。

解答:⼀.事件驱动的程序设计它是⼀种“被动”式程序设计⽅法,程序开始运⾏时,处于等待⽤户输⼊事件状态,然后取得事件并作出相应反应,处理完毕⼜返回并处于等待事件状态。

⼆. 消息循环与输⼊消息是⼀种报告有关事件发⽣的通知。

· 事件驱动是靠消息循环机制来实现的。

· Windows应⽤程序的消息来源有以下四种:(1)输⼊消息(2)控制消息(3)系统消息(4)⽤户消息三. 图形输出Windows程序的所有输出都是图形,字符也被作为图形来处理。

· GDI提供两种基本服务:创建图形输出和存储图象。

· 绘图函数分为三类:⼀是⽂字输出;⼆是⽮量图形函数,⽤于画线、圆等⼏何图形;三是光栅(位图)图形函数,⽤于绘制位图。

四. ⽤户界⾯对象⽤户界⾯对象:窗⼝边框系统菜单框标题栏菜单栏⼯具条客户区垂直滚动条和⽔平滚动条状态栏图标光标插⼊符对话框控件消息框五.资源共享· 常见的资源包括:设备上下⽂,画刷,画笔,字体,对话框控制,对话框,图标,定时器,插⼊符号,通信端⼝,电话线等。

mfc初始化函数

mfc初始化函数

mfc初始化函数
MFC初始化函数是指在使用MFC框架编写程序时,首先执行的一段代码块,通常用于在程序启动时初始化一些全局变量和资源,为后续程序运行做好准备。

MFC提供了三种初始化函数:
1. InitInstance()函数:在程序启动时调用,用于初始化应用程序的主窗口和其他资源。

2. ExitInstance()函数:在程序结束时调用,用于释放应用程序占用的资源。

3. OnAppInit()函数:在程序启动时调用,用于初始化框架级别的资源,例如全局共享内存和线程。

除了以上三个函数,MFC还提供了一些其他的初始化函数,例如OnCmdLine()函数,用于在程序启动时处理命令行参数。

在编写MFC 程序时,我们需要根据具体需求选择合适的初始化函数,并编写相应的代码进行初始化操作。

- 1 -。

mfc使用手册

mfc使用手册

mfc使用手册MFC(Microsoft Foundation Class Library)是微软提供的一个类库,用于简化Windows应用程序的开发过程。

以下是MFC使用手册的简要介绍:1. 简介:MFC是一个基于C++的类库,它提供了许多用于构建Windows应用程序的类和函数。

通过使用MFC,开发人员可以快速地构建具有一致外观和感觉的应用程序,并利用Windows平台提供的各种功能。

2. 安装和配置:在开始使用MFC之前,您需要安装Microsoft Visual Studio并确保安装了MFC开发工作负载。

安装完成后,您需要创建一个新的MFC项目或打开一个现有的MFC项目。

3. 创建MFC应用程序:要创建一个新的MFC应用程序,您需要使用Microsoft Visual Studio的向导。

选择“File”菜单中的“New”选项,然后选择“Project”。

在弹出的对话框中,选择“MFC Application”并按照向导的提示完成应用程序的创建过程。

4. MFC类库:MFC提供了许多用于构建应用程序的类和函数。

以下是一些常用的MFC类:CWinApp:应用程序对象类,用于管理应用程序级别的操作,例如初始化应用程序和退出应用程序。

CWnd:窗口类,用于管理窗口的各种操作,例如创建窗口、处理消息和绘制窗口。

CDocument:文档类,用于管理应用程序中的文档数据。

CView:视图类,用于管理应用程序中的视图,例如显示文档数据和与用户交互。

5. MFC消息处理:MFC使用消息传递机制来处理用户与应用程序的交互。

每个窗口和控件都处理一组预定义的消息,例如鼠标点击、键盘输入和窗口大小改变等。

通过覆盖类中的虚函数,您可以定义应用程序如何响应这些消息。

6. MFC对话框和控件:MFC提供了许多内置的对话框和控件,例如按钮、文本框和列表框等。

您可以使用对话框编辑器来创建对话框,并将控件拖放到对话框中。

MFC的六大机制

MFC的六大机制

MFC的六⼤机制MFC的六⼤机制程序的初始化过程运⾏时类型识别动态创建永久保存消息映射命令传递运⾏时类型识别MFC的运⾏时类型识别就是在程序运⾏过程中判断某个对象是否属于某个类,MFC通过为需要进⾏运⾏时类型识别的类添加⼀个静态CRuntimeClass类对象,其属于此类⽽不是属于某⼀特定对象,其在没有实例化对象的时候就已经存在并且可以被使⽤。

struct CRuntimeClass{//省略其他⽆关的成员LPCSTR m_lpszClassName; //类的名称int m_nObjectSize; //类的⼤⼩CRuntimeClass* m_pBaseClass; //指向基类的CRuntimeClass对象CRuntimeClass* m_pNextClass; //指向同类型对象的CRuntimeClass对象};然后提供了⼀个能返回类⾃⾝CRuntimeClass对象地址的函数GetRuntimeClass()CRuntimeClass* class_name::GetRuntimeClass() const/{ return &class_name::class##class_name;}CObject类提供⼀个IsKindof虚拟函数,此函数通过从对象⾃⼰的CRuntimeClass成员对象开始往基类遍历,判断是否有CRuntimeClass成员对象等于待判断类的CRuntimeClass成员对象,有则说明此对象属于此类(也就是说此对象是此类或其派⽣类的实例),⽆则说明不属于此类。

BOOL CObject::IsKindof(const CRuntimeClass *pClass) const{CRuntimeClass* pClassThis=GetRuntimeClass();while(pClassThis != NULL){if(pClassThis==pClass)return TRUE;pClassThis=pClassThis->m_pBaseClass;}return FALSE;}例如:IsKindof()最后就会返回TRUE,因为MFC⾃⼰定义的类都实现了运⾏时类型识别,⽽所有的类都是从CObject中派⽣的,所以CWnd类的对象实例属于CObject类。

3.MFC原理介绍

3.MFC原理介绍

3.MFC原理介绍包括C++封装原理和MFC六⼤关键技术,以及类向导和MFC应⽤程序向导的使⽤⽅法。

讲解MFC消息映射机制的原理、消息映射函数的建⽴,以及消息发送和接收的⽅法。

CTime类,C语⾔中time函数void CTmDlg::OnButton1(){CTime t = CTime::GetCurrentTime();int nYear = t.GetYear();int nMonth = t.GetMonth();int nDay = t.GetDay();int nHour = t.GetHour();int nMin = t.GetMinute();int nSec = t.GetSecond();int nWeek = t.GetDayOfWeek();//周三CString str;str.Format("当前时间是:%d年%02d⽉%02d⽇ %02d:%02d:%02d",nYear,nMonth,nDay,nHour,nMin,nSec);//AfxMessageBox(str);SetWindowText(str);//SetTimer}void CTmDlg::OnButton2(){time_t tt = time(NULL);tm * pTime = localtime(&tt);int nYear = pTime ->tm_year+1900;int nMonth = pTime ->tm_mon+1;int nDay = pTime ->tm_mday;int nHour = pTime ->tm_hour;int nMin = pTime ->tm_min;int nSec = pTime ->tm_sec;CString str;str.Format("当前时间是:%d年%02d⽉%02d⽇ %02d:%02d:%02d",nYear,nMonth,nDay,nHour,nMin,nSec);//AfxMessageBox(str);SetWindowText(str);//SetTimer}类// MyTime.h: interface for the CMyTime class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_MYTIME_H__A7F50C7B_E6B7_4ED5_BB03_E00EB9935406__INCLUDED_)#define AFX_MYTIME_H__A7F50C7B_E6B7_4ED5_BB03_E00EB9935406__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000//⾯向对象(C++)特点:抽象,封装和派⽣,(多态)#include <time.h>class CMyTime{time_t m_time;public:int GetYear() const;static CMyTime GetCurrentTime();CMyTime();~CMyTime();};#endif // !defined(AFX_MYTIME_H__A7F50C7B_E6B7_4ED5_BB03_E00EB9935406__INCLUDED_)// MyTime.h: interface for the CMyTime class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_MYTIME_H__A7F50C7B_E6B7_4ED5_BB03_E00EB9935406__INCLUDED_)#define AFX_MYTIME_H__A7F50C7B_E6B7_4ED5_BB03_E00EB9935406__INCLUDED_#if _MSC_VER > 1000#pragma once#endif// _MSC_VER > 1000//⾯向对象(C++)特点:抽象,封装和派⽣,(多态)#include <time.h>class CMyTime{time_t m_time;public:int GetYear() const;static CMyTime GetCurrentTime();CMyTime();~CMyTime();};#endif// !defined(AFX_MYTIME_H__A7F50C7B_E6B7_4ED5_BB03_E00EB9935406__INCLUDED_)#include "stdafx.h"#include <time.h>#include <stdio.h>#include "MyTime.h"int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){CMyTime t = CMyTime::GetCurrentTime();int nYear = t.GetYear();//CTime time;/* time_t tt = time(NULL);tm * pTime = localtime(&tt);int nYear = pTime ->tm_year+1900;int nMonth = pTime ->tm_mon+1;int nDay = pTime ->tm_mday;int nHour = pTime ->tm_hour;int nMin = pTime ->tm_min;int nSec = pTime ->tm_sec;char s[200];sprintf(s,"当前时间是:%d年%02d⽉%02d⽇ %02d:%02d:%02d",nYear,nMonth,nDay,nHour,nMin,nSec);MessageBox(NULL,s,"提⽰",0);*/return0;}MFC所有封装类⼀共200多个,但是MFC的内部技术不只是简单的封装。

VS2010 VS2008MFC openGL初始化

VS2010 VS2008MFC openGL初始化

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概述

1.MFC概述1.MFC是一个编程框架MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。

因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。

Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。

1.封装构成MFC框架的是MFC类库。

MFC类库是C++类库。

这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。

(1)对Win32应用程序编程接口的封装用一个C++ Object来包装一个Windows Object。

例如:classCWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ windowobject的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。

(2)对应用程序概念的封装使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口,等等。

MFC把许多类似的处理封装起来,替程序员完成这些工作。

另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。

文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。

(3)对COM/OLE特性的封装OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。

VC++6[1].0入门【第三章、MFC编程概述】

VC++6[1].0入门【第三章、MFC编程概述】

第三章 MFC 应用程序概述第3章 MFC 应用程序概述Microsoft Windows 是微软公司推出的一个应用于微机上的具有图形用户界面的多任务和多窗口的操作系统。

Windows 应用程序也称为窗口应用程序,所有的窗口应用程序都有着相同的窗口风格和菜单结构,用户界面友好,方便用户操作。

本章从剖析窗口应用程序的基本结构入手,继而介绍使用MFC 类库开发的应用程序框架结构,并介绍窗口应用程序运行的核心机制-消息映射。

学习了本章,你将对MFC 应用程序框架结构和运行机制有个整体的了解,为后面进入窗口应用程序开发打下良好的基础。

3.1 窗口应用程序概述窗口应用程序的开发一般采用可视化的面向对象的开发,可选择的窗口应用程序开发语言有Visual C++、Visual Basic 、Visual Java 、Dephi 等等。

无论采用哪一种开发语言,首先要了解窗口应用程序的基本机制。

3.1.1 窗口编程基础窗口应用程序运行于Windows 操作系统,Windows操作系统是一个多任务操作系统,因此窗口应用程序的组成,支持技术,基本运行机制等与DOS 应用程序有着本质的区别。

在学习开发窗口应用程序之前,先要对窗口应用程序有一个概念上的了解。

1. 窗口窗口是应用程序与用户进行交互的界面,应用程序通过窗口传递信息给用户,同样用户通过窗口输入数据,发布命令给应用程序。

Windows 界面包含了丰富的标准用户界面元素,包括窗口、图标、菜单、滚动条、对话框、控件和消息框等。

用户使用这些界面元素可以方便的与应用程序进行交互,一个典型的窗口外观如图3-1所示。

垂直滚动条控制菜单栏标题栏菜单栏关闭按钮最小化按钮最大化按钮客户区VC++6简明教程图3-1 Windows应用程序窗口组成在Windows编程中,各种窗口、菜单、按钮、对话框及程序模块等Windows的规范部件是按“对象”来组织的。

为了提高开发窗口应用程序的效率,微软公司为用户提供了大量能创建上述标准元素的API函数和C++类,并且以Windows API函数库和C++类库的形式提供给用户,以充分满足构成应用程序操作界面的需要。

MFC笔记

MFC笔记

GetDlgItem:根据ID获取一个子窗口的对象地址(包含窗口句柄) GetDlgItemText和SetDlgItemText:根据ID获取或设置一个子窗口标题文字 GetDlgItemInt和SetDlgItemInt:根据ID获取或设置一个子窗口内显示的数字 GetDlgCtrlID和SetDlgCtrlID:根据窗口对象内的句柄获取或设置该窗口的ID GetParent和IsChild:这两个函数是等价的 GetWIndow: GetNextWIndow:
InitDialog函数用于初始化对话框中的子控件,可操作子窗口 Create函数主要用于 通用窗口的创建函数,如菜单、工具条等,窗口还未显示出来, 只有父窗口,子窗口还没创建 在非模式对话框中: 在使用EndDialog函数关闭时,只有隐藏没有真正关闭 使用DestroyWindow函数进行真正关闭
3—4讲,24分18秒
系统消息和非系统消息
• 系统消息编号:1—WM_USER-1 • 非系统消息:消息编号要大于1024,主要 用于传递数据
SendMessage函数和PostMessage函数的区别: 二者的功能: 能够向指定的窗口发送窗口消息,既可以是本进程内窗口 也可以是其它进程的 可以发送系统和非系统消息 SendMessage是阻塞型函数,用于调用指定窗口的内部程序,直到窗口 程序处理完毕后再返回 是非阻塞型函数,是将一个消息寄送到指定窗口内的消息 队列后立即返回
步骤如下: 1.定义自己的消息宏,如UM_ADD等,消息编号必须是大于 WM_USER,因为从1到WM_USER是系统消息; 2.自动添加消息处理函数 3.将“自定义的消息宏”和“消息处理函数”绑定,利用ON_ MESSAGE宏实现; 4.添加自己的代码,实现具体的功能

MFC消息机制详解

MFC消息机制详解

消息映射的实现Windows消息概述Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。

这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。

消息的分类队列消息和非队列消息从消息的发送途径上看,消息分两种:队列消息和非队列消息。

队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。

这里,对消息队列阐述如下:Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。

鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。

Windows 每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。

线程消息队列接收送给该线程所创建窗口的消息。

线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。

除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。

这些队列消息以外的绝大多数消息是非队列消息。

系统消息和应用程序消息从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。

系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。

消息结构和消息处理消息的结构为了从消息队列获取消息信息,需要使用MSG结构。

mfc ctreeview用法

mfc ctreeview用法

mfc ctreeview用法MFC CTreeView 是Microsoft Foundation Classes(MFC)中的一个类,用于创建和管理树形视图控件。

树形视图控件是一种常用的界面控件,它通常用于展示层级结构的数据,如文件系统,项目组织或数据库表等。

在本文中,我们将一步一步介绍如何使用MFC CTreeView 创建和管理树形视图控件,包括创建视图类,初始化树形视图,添加节点,展开和折叠节点以及响应节点的选择事件等。

第一步:创建视图类首先,在MFC 应用程序中创建一个新的视图类,以用于展示树形视图控件。

可以使用Visual Studio IDE 中的“添加类”功能来创建视图类。

确保选择“CFormView”为基类,并为视图类命名,例如“CTreeViewDemoView”。

第二步:添加树形视图控件到视图中在视图类的头文件中声明一个CTreeView 对象,以用于管理树形视图控件。

可以使用类向导或手动添加以下代码:cppclass CTreeViewDemoView : public CFormView{...CTreeView m_treeView;...};然后,在视图类的初始化过程中,创建树形视图控件并将其添加到视图中。

可以在OnInitialUpdate 方法中添加以下代码:cppvoid CTreeViewDemoView::OnInitialUpdate(){CFormView::OnInitialUpdate();初始化树形视图控件CRect rect;GetClientRect(&rect);m_treeView.Create(WS_VISIBLE WS_CHILD TVS_HASLINES TVS_LINESATROOT TVS_HASBUTTONS, rect, this, 0);...}第三步:初始化树形视图在树形视图控件创建并添加到视图中后,我们需要初始化树形视图的数据。

MFC控件使用详细教程

MFC控件使用详细教程

使用Windows标准控件我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。

在Visual C++中,可以使用的控件分成三类:(1) Windows标准控件Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。

所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。

Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。

表6.1 Windows标准控件续表6.1前面提到过,在MFC中,类CWnd是所有窗口类的基类,很自然的,它也是所有控件类的基类。

Windows标准控件在以下环境下提供:•Windows 95•Windows NT 3.51及以后版本•Win32s 1.3•注意:•Visual C++ 4.2及以后版本不再支持Win32s。

(2) ActiveX控件ActiveX控件可用于对话框中,也可用于HTML文档中。

这种控件过去被称为OLE 控件。

本书将在专门的章节中来讲述关于ActiveX控件的知识。

这里仅指出ActiveX控件使用了与标准控件完全不同的接口和实现方法。

(3) 其它MFC控件类除了Windows标准控件和自己编写的或者来自于第三方软件开发商的ActiveX 控件以外,MFC还提供了另外三种控件,它们由下面的三个类进行封装:•类CBitmapButton用于创建以位图作为标签的按钮,位图按钮最多可以包括四个位图图片,分别代表按钮的四种不同状态。

•类CCheckListBox用于创建选择列表框,这种列表框中的每一项前面有一个复选框,以决定该项是否被选中。

•类CDragListBox用于创建一种特殊的列表框,这种列表框允许用户移动列表项。

在本章我们仅讲述第一类控件,即Windows标准控件。

所涉及的内容包括各个控件的使用及相应的技巧。

mfc运行流程

mfc运行流程

mfc运行流程
MFC程序的运行流程如下:
1.程序启动
程序启动时,首先会调用WinMain函数。

WinMain函数是MFC程序的入口函数,负责程序的初始化和运行。

2.程序初始化
在WinMain函数中,会调用CWinApp::InitInstance()函数进行程序的初始化。

CWinApp::InitInstance()函数负责注册窗口类、创建应用程序对象、创建窗口等工作。

3.窗口创建
在程序初始化完成后,会创建应用程序的窗口。

应用程序窗口是应用程序的入口,用户可以通过应用程序窗口与应用程序进行交互。

4.消息循环
在窗口创建完成后,会进入消息循环。

消息循环是MFC程序的核心,负责处理来自操作系统的消息。

5.程序退出
用户关闭应用程序时,会调用CWinApp::ExitInstance()函数退出程序。

CWinApp::ExitInstance()函数负责释放程序使用的资源。

MFC运行机制

MFC运行机制

MFC运行机制MFC程序框架的剖析----------SDI程序流程图MFC运行机制C中的main函数就相当于MFC中的WinMain函数。

感兴趣的可以利用VC的断点设置自己跟踪下面讲述的各个函数,就明白它的执行顺序了。

一、C语言程序执行步骤在C语言中,大约的步骤如下:1,全局变量内存分配2,进入main函数二、MFC程序的运行步骤(主要是初始化)打开一个MFC APPWizard(exe)工程,跟踪其执行步骤,可以发现,是以下顺序:1)CXXApp中的全局变量定义CXXApp theApp;2)调用CXXApp构造函数CXXApp::CXXApp(){}3)进入Winmain函数(_tWinMain为宏,值为WinMain)_tWinMain(){}4)完成初始化工作:包括窗口类注册、窗口产生、显示和更新pThread->InitInstance()对于MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口注册与创建、显示等要反复调用多次,一次对应一个窗口(1)注册窗口类AfxEndDeferRegisterClass(2)创建窗口CMainFrame::PreCreateWindow()//反复调用一次是给我们修改窗口属性的机会CFrameWnd::Create()(3)消息循环PumpMessage()补充1:在MFC中,由于涉及到(窗口)类定义,所以定义全局变量的时候,需要进行更多的步骤。

全局变量涉及到类定义(类似于C中的类型定义)的话,那么需要遵循以下步骤(以MFC的窗口类为例)1)设计一个窗口类2)注册窗口类3)创建窗口4)显示及更新窗口5)消息循环补充2:其他需要注意的几点1,每一个MFC程序,有且只有一个从WinApp类派生的类(应用程序类),也只有一个从应用程序类所事例化的对象,表示应用程序本身。

在WIN32程序当中,表示应用程序是通过WINMAIN入口函数来表示的(通过一个应用程序的一个事例号这一个标识来表示的)。

T-MFC程序的执行流程

T-MFC程序的执行流程

1.2、theApp初始化机制引发的思考——代码抢先执行
1.2.1、正名---我所谓的代码抢先执行
我们暂且将主函数运行之前的代码称为抢先执行代码,具有一定意义的抢先执行代码(对于程序员来说)的执行暂且称为代码抢先执行。
1.2.2、使用theApp的初始化机制实现反调试示例
1.2.5、DLL_PROCESSS_ATTACH实现代码抢先执行的示例
1.2.6、基于高优先级的线程代码抢先执行
1.3、CWinApp构造函数与模块、线程状态信息
1.3.1、编码中的模块基址指明
1.3.2、PE中的模块基址及引发的问题
1.3.3、GetModuleHandle()函数的反汇编代码与缺陷弥补
00401320 |. FF15 088B4100 CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA
00401326 |. 3BF4 CMP ESI,ESP
00401328 |. E8 AB1C0000 CALL draw.__chkesp ; JMP 到 MSVCRTD._chkesp
1020AD2E 8339 00 CMP DWORD PTR DS:[ECX],0 ;地址中是否有内容
1020AD31 74 05 JE SHORT MSVCRTD.1020AD38
1020AD33 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8] ; draw.$S374 在这里F4执行到此处
0040132D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00401330 |. 5F POP EDI

MFC的基本组成及程序模式类型

MFC的基本组成及程序模式类型

MFC的基本组成及程序模式类型MFC(Microsoft Foundation Class)是一种用于开发Microsoft Windows平台应用程序的编程框架,它提供了一套可重用的类库,使开发人员可以更轻松地创建Windows应用程序。

1. 控件(Controls):MFC提供了很多常用的控件,如按钮、文本框、列表框、组合框等,开发人员可以直接使用这些控件来构建用户界面。

2. 对话框(Dialogs):MFC支持对话框的创建和管理,开发人员可以通过对话框来实现复杂的用户交互。

3. 文档视图架构(Document-View Architecture):MFC提供了文档视图架构,使开发人员可以更方便地实现文档和视图的交互,以及与用户的交互。

4. 消息映射(Message Mapping):MFC通过消息映射机制来处理事件,开发人员可以通过添加消息映射函数来响应用户的输入或其他事件。

5. 消息循环(Message Loop):MFC提供了消息循环机制,用于处理窗口消息,并将其传递给适当的窗口进行处理。

6. 应用程序类(Application Class):MFC的应用程序类是一个派生自CWinApp的类,它提供了应用程序的初始化和运行控制。

MFC的程序模式类型主要有以下几种:1. 单文档(SDI,Single Document Interface)模式:在单文档模式下,应用程序只能打开一个文档,并在主窗口中显示该文档。

用户可以通过菜单或工具栏命令来操作文档。

2. 多文档(MDI,Multiple Document Interface)模式:在多文档模式下,应用程序可以同时打开多个文档,并在子窗口中显示这些文档。

用户可以通过菜单或工具栏命令在不同的子窗口之间切换。

3. 对话框(Dialog)模式:在对话框模式下,应用程序的主窗口是一个对话框。

用户可以通过对话框上的控件进行操作,以实现与应用程序的交互。

MFC简介

MFC简介

• Ctrl+F9
7、消息映射和控件变量映射
• 只要是 只要是CCmdTarget(用于所有能够消息映射的基类 派生 用于所有能够消息映射的基类)派生 用于所有能够消息映射的基类 必有消息映射以处理消息, 类,必有消息映射以处理消息,则在类的说明文件的尾部 必有消息映射以处理消息 有DECLARE_MESSAGE_MAP宏,在类的定义文件中有 宏 BEGIN_MESSAGE_MAP宏和 宏和END_MESSAGE_MAP宏 宏和 宏 以处理用户消息。 以处理用户消息。 • 其中BEGIN_MESSAGE_MAP(参数 参数 ,参数 为该 参数1,参数 参数 其中 参数 参数2) 参数1为该 类的类名,参数2为该类基类的类名。 类的类名,参数 为该类基类的类名。 为该类基类的类名 • 例:
2、MFC框架
• CObject:CObject为Microsoft基础类库中主要的基类,提供了 : 基础类库中主要的基类, 为 基础类库中主要的基类 基本的服务:支持串行化,运行类信息,对象诊断输出, 基本的服务:支持串行化,运行类信息,对象诊断输出,与收集 类兼容。 类兼容。 • CCmdTarget:类CCmdTarget是MFC类库中消息映射体系的一 : 是 类库中消息映射体系的一 个基类。 个基类。消息映射把命令或消息引导给用户为之编写的响应函数 • CWinApp: CWinApp为应用程序类, MFC 中的主应用程序类 CWinApp: CWinApp为应用程序类 为应用程序类, 操作系统的应用程序的初始化、运行和终止。 封装用于 Windows 操作系统的应用程序的初始化、运行和终止。 基于框架生成的应用程序必须有且仅有一个从 CWinApp 派生的 类的对象。 类的对象。 • CWnd: CWnd在MFC类结构中的核心地位就无可争议了。它派 : 类结构中的核心地位就无可争议了。 在 类结构中的核心地位就无可争议了 生于CCmdTarget类,是最基本的 对象。 生于 类 是最基本的GUI对象。我们在屏幕上看到 对象 的一切对象都与窗口有关,它 们或者派生于CWnd,属继承关系, 的一切对象都与窗口有关, 们或者派生于 ,属继承关系, CWnd是MFC中所有组件对象的父类 是 中所有组件对象的父类

MFC原理(PPT)

MFC原理(PPT)

MFC应用程序运行后各函数的调用关系 应用程序运行后各函数的调用关系
InitInstance()函数是派生类唯一需要重载的函数,它负 责应用程序的初始化,如初始化数据,创建文档模板,处理 命令行以及显示应用程序主窗口.
6.3.3 常用的 常用的MFC文件和库文件 文件和库文件
文件名称 afxwin.h afxext.h afxdisp.h afxdtctl.h afxcmn.h Mfc42.lib Mfc42D.lib MfcS42.lib MfcS42D.lib Mfc42U.lib 声明MFC核心类 MFC扩展文件,声明工具栏,状态栏,拆分窗口等类 声明OLE类 声明支持IE 4公用控件的MFC类,如CImageList等 声明Windows公共控件类 MFCxx.DLL的导入函数库(Release版) MFCxx.DLL的导入函数库(Debug版) MFCSxx.DLL的导入函数库(Static Release版) MFCSxxD.DLL的导入函数库(Static Debug版) MFCxxU.DLL的导入函数库(Unicode Release版) 说 明
MFC应用程序对象之间的关系 应用程序对象之间的关系
6.3.2 MFC应用程序的生与死 应用程序的生与死
在MFC应用程序的CWinApp派生类对象theApp是一个全局 变量,代表了应用程序运行的主线程.它在程序整个运行 期间都存在,它的销毁意味着运行程序的消亡. MFC应用程序启动时,首先创建应用程序对象theApp,这 时将自动调用应用程序类的构造函数初始化对象theApp, 然后由应用程序框架调用MFC提供的AfxWinMain()主函数. AfxWinMain()主函数首先通过调用全局函数AfxGetApp()获 取应用程序对象theApp的指针pApp,然后通过pApp调用应 用程序对象的有关成员函数,完成程序的初始化和启动工 作,最后调用成员函数Run(),进入消息循环. 程序运行后将收到WM_PAINT消息,调用OnPaint()函数绘 制客户区窗口.如果Run()收到WM_QUIT消息,则结束消 息循环,然后调用函数ExitInstance(),结束程序运行.

MFC期末复习简答题及答案

MFC期末复习简答题及答案

MFC 期末复习及答案1 简述MFC 应用程序的执行过程。

2 简述文档/视图与其他类对象的关系。

3 简述MFC 消息映射机制。

4 消息WM_LBUTTONDOWN 的消息映射宏和消息处理函数是什么?5 如何自定义消息?如何发送自定义消息?6 GDI 创建哪几种类型的图形输出?7 什么是设备环境?它的主要功能有哪些?8 什么是GDI,它有什么功能?MFC 将GDI 函数封装在哪个类中?9 请叙述设备无关性的含义,实现设备无关性需要哪几个环节?10 MFC 提供了哪几种设备环境类?它们各自有什么用途?11 简述传统的SDK 获取设备环境的方法。

12 简述创建和使用自定义画笔的步骤。

13 简述采用MFC 方法编程时,显示一个DDB 位图的步骤。

14 简述菜单设计的主要步骤。

15 为应用程序创建快捷菜单主要有哪些方法?16 如何动态创建菜单?17 创建工具栏的基本步骤有哪些?18 简述MFC 创建状态栏所做的工作。

19 简述创建和使用模态对话框的主要步骤。

20 如何向对话框模板资源添加控件?如何添加与控件关联的成员变量?21 什么是DDX 和DDV?编程时如何使用MFC 提供的DDX 功能?22 简述创建属性页对话框的主要步骤。

23 在应用程序中访问控件的方法有哪些?24 单选按钮控件如何成组?25 组合框与列表框相比有什么不同?如何给组合框添加初始的列表项?26 通过哪几个主要成员函数完成文档与视图之间的相互作用?并简述这些成员函数的功能。

27 简述文档序列化与一般文件处理的区别。

28.如何让用户定义的类支持序列化?1 简述MFC 应用程序的执行过程。

MFC 应用程序启动时,首先创建应用程序对象theApp。

这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC 提供的WinMain( )主函数。

在WinMain( )主函数中,首先通过调用全局函数GetApp( )来获取theApp 的指针pApp,然后通过该指针调用theApp 的成员函数InitInstance( )来初始化应用程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C**App theApp;
//这个全局变量就是代表一个程序,并且它是在WinMain函数执行之前就创建了.然后执行其构造函数
//但是这个类是C**App::public CWinApp的,所以要先执行其父类的构造函数. CWinApp::CWinApp()
{
......
AFX_MODULE_STATE *pModuleState = AfxGetModuleState();
pModuleState->m_pCurrentWinApp = this;
......
}
//由于这个构造函数被派生类C**App继承过来了,所以这个this就是theApp,然后还会执行一些相关的信息
//然后就是WinMain函数开始执行了.
int AFXAPI AfxWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
CWinThread *pThread = AfxGetThread();
CWinApp *pApp = AfxGetApp();
if( pApp != NULL && !pApp->InitApplication() )
goto InitFailure;
if( !pThread->InitInstance() )
{
if( pThread->m_pMainWnd != NULL )
{
TRACE0("......");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturCode = pThread->Run();
//Run()函数就是开始执行消息循环的函数.
}
//WinMain函数的主要作用就是来调用InitApplication,InitInstance,Run三个函数.
CWinThread *AFXAPI AfxGetThread()
{
AFX_MODULE_THREAD_STATE *pState = AfxGetModuleThreadState();
CWinThread *pThread = pState->m_pCurrentWinThread;
if( pThread == NULL )
{
pThread = AfxGetApp();
}
}
_AFXWIN_INLINE CWinApp *AFXAPI AfxGetApp()
{
return afxCurrentWinApp;
}
#define afxCurrentWinApp AfxGetModuleState()->m_pCurrentWinApp
//上面的两个函数和一个宏定义,虽然两个函数的名字不同,但是实际上都是返回m_pCurrentWinApp,上面构造函数中也看到了m_pCurrentWinApp的值其实就是theApp;
BOOL CWinApp::InitApplication()
{
if (CDocManager::pStaticDocManager != NULL)
{
if (m_pDocManager == NULL)
m_pDocManager = CDocManager::pStaticDocManager;
CDocManager::pStaticDocManager = NULL;
}
if (m_pDocManager != NULL)
m_pDocManager->AddDocTemplate(NULL);
else
CDocManager::bStaticInit = FALSE;
return TRUE;
}
//这个函数大概就是文档类管理的,侯水货说要再后面几章节讲述,到时候我补上.上述的函数虽然是在CWinApp类中定义的,但是我们的C**App类派生自CWinApp,并且我们并没有改写InitApplication函数,所以实际上还是调用基类的函数.
BOOL C**WinApp::InitInstance()
{
m_pMainWnd = new CMyFrameWnd();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
//以上代码是MFC深入浅出里面的,但是在VC++深入详解确实这样写的: pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(C**Doc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(C**View));
AddDocTemplate(pDocTemplate);
//上述代码居然用到了RUNTIME_CLASS这个宏定义,感觉无限熟悉啊,看
来MFC的这几个精髓的宏我要看透了.
}
//为什么我这个这个函数的类不是CWinApp了,因为我们改写了这个函数,而且是必须改写的.并且这个是虚函数,所以是调用了子类theApp的InitInstance函数.
//而且第一句的函数就是来创建一个CFrameWnd对象,那么看一下CFrameWnd干什么了.
CFrameWnd::CFrameWnd()
{
Create(NULL,"Hello
MFC",WS_OVERLAPPEDWINDOW,rectDefault,NULL,"MainMenu");
}
//这个函数就是用来产生窗口的,但是在产生窗口之前,还没有注册窗口呢?也没有设置窗口的属性啊?所以在这个函数调用之前还需要调用一个函数CFrameWnd::Create(LPCRSTR lpszClassName,LPCTSTR lpszWindowName,DOWRD dwStyle = WS_OVERLAPPEDWINDOW,const RECT& rect = rectDefault,)
{
HMENU hMenu = NULL;
if( lpszMenuName != NULL )
{
hMenu = ::LoadMenu(hInst,lpszMenuName);
//加载菜单
}
CreateEx(...);
}
CFrameWnd::CreateEx()
{
}
//CreateEx是一个虚函数,并且CFrameWnd是派生自CWnd,并且没有改变虚函数,所以实际上就是调用CWnd::CreateEx函数.
BOOL CWnd::CreatEx()
{
//填充cs对象,它的类型是WNDCASS
PreCreateWindow(cs)
//重要的是这个函数PreCreateWindow(cs)
}
BOOL CFrameWnd::PreCreateWindow(CREATESTUCT &cs)
{
if( cs.lpszClass == NULL )
{
AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);
...
}
...
}
//此处需要说明一下我们自己创建的程序应该有一个C**FrameWnd类,里面同样有一个PreCreateWindow
BOOL C**FrameWnd::PreCreateWindow(CREATESTRUCT &cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
{
return FALSE;
}
// TO DO SOMETHING
//这个函数是继承过来的,并且首先点调用基类的PreCreateWindow先完成窗口的注册,如果我们要改变系统为
//我们创建的默认窗口的话,在这个函数里面修改就可以了,并且直接修改cs 就可以了,因为是引用.
}
#define AfxDeferRegisterClass(fClass) ((afxRegisteredClasses &fClass)?TRUE:AfxEndDeferRegisterClass(fClass))
#define afxRegisteredClasses AfxGetModuleState()->m_fRegisteredClasses
//实际上就是用我们定义的全局对象来注册窗口而已
BOOL AFXAPI AfxEndDeferRegisterClass(short fClass)
{
AfxRegisterClass(...);
RegisterWithIcon(...);
//主要工作就是调用这两个函数
}
//函数定义如下
static BOOL AFXPAI RegisterWithIcon(WNDCLASS *pWndCls...)
{
//会加载图标
return AfxRegisterClass(pWndCls);
}
BOOL AFXAPI AfxRegisterClass(WNDCLASS *lpWndClass)
{
::RegisterClass(lpWndClass);
//调用全局的RegisterClass函数来完成注册
}。

相关文档
最新文档