2022年MFC入门教程 .pdf
《2022年MFC入门教程 .pdf》由会员分享,可在线阅读,更多相关《2022年MFC入门教程 .pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、该文章为学习了C 和 C+以及有 SDK 编程基础的,但还未学习MFC 的人员使用,我们开始使用一个基本的内容开始:全部的代码如下:#include class sample:public CFrameWnd public: sample() Create(NULL,MFC Window); MessageBox(My MFC Window,CFrame constructor,MB_OK); ; class App:public CWinApp public: BOOL InitInstance(); BOOL ExitInstance(); ; BOOL App:InitInstance(
2、) MessageBox(0,My MFC Window,InitInstance,MB_OK|M B_ICONASTERISK); sample *obj; obj=new sample; m_pMainWnd=obj; obj-ShowWindow(SW_SHOWMAXIMIZED); return TRUE; BOOL App:ExitInstance() MessageBox(0,My Window,ExitInstance,MB_OK|M B_ICONHAND); return TRUE; App a; 你只需将以上代码拷贝下来,在VC+6.0 编译器,建一个Window32 工程,
3、使用MFC 链接库编译即可名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 16 页 - - - - - - - - - 具体步骤:打开VC+6.0 ,点击主菜单File(文件 )-New( 新建 ) 弹出一个对话框,我们选择win32 Application (win32 应用程序) ,再工程文本框给她起一个名字MyMFC ,点击确定。在确认信息的对话框里点确定。这样我们就建了一个win32 应用程序这样一个类型的工程。下面我们在这个工程里建一个C+文件。点击菜单File
4、(文件 )-New( 新建 ) 弹出一个对话框,选择C+ source 文件 (C+源文件 ),再文件文本框里给他起个名字MyMFC ,点击确定,这是我们将上面的代码拷入,编译链接。你会发现有3 个错误。nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _endthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _beginthreadex Debug/MyMFC.exe : fatal error
5、LNK1120: 2 unresolved externals那么,这是因为没有使用MFC 类库。我们现在导入。点击菜单(project)工程 -setting 设置 ,弹出一个对话框,有一个下拉列表框,里面是Not Using MFC ,我们把她改为Using MFC in a Static Library,点击确定,再编译,运行,那么有这样一个窗体出现。下面是该程序的解释。在以上的程序中,只使用了两个类CFrameWnd 和 CWinApp, 我们先看第一个类:class sample:public CFrameWnd public: sample() Create(NULL,MFC Wi
6、ndow); MessageBox(My MFC Window,CFrame constructor,MB_OK); ; 第一个类 sample 继承了 CFrameWnd 类, CFrame类是 MFC 类库中的一个类,用它来代表窗体框架,我们先用 sample 类继承它 ,在构造函数调用了Create这个函数,在 Create这个函数时调用的CFrameWnd 类中的函数,使MFC 写好的函数, CFrameWnd 中封装了CreateWindow 这个 API 函数为它的成员函数Create(),他们的参数都是像似的。但你会问,CreateWindow 有 11 个参数,而这里的Crea
7、te 函数只用了两个参数,应为这里的Create有两个参数为必选参数,后面的参数有默认值由 MSDN 的定义可以看出BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 16 页 - - - - - - - - - WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd
8、* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext* pContext = NULL ); 后面的参数都带有一个等号和一个默认的值。我们再看在看第二个类,继承CWinApp 类的 App 类。class App:public CWinApp public: BOOL InitInstance(); BOOL ExitInstance(); ; 在这个类中仅仅重写了两个函数,一个InitInstance() ,一个 ExitInstance(),这个类是控制整个应用程序的,所以
9、称为 CWinApp 类,是不可或缺的一个类。而且要运行程序,要将该类实例化。实例化会自动调用构造函数,并调用InitInstance() 这个函数 (调用该函数是MFC 写好的 ),因为该函数是一个虚函数,所以我们实例化继承 CWinApp 类的 App 类时,会自动调用App:InitInstance()( 如果不明白, 请复习 c+的虚函数 ),这样就开始了一个应用程序实例的进程。来到的App:InitInstance() 函数BOOL App:InitInstance() MessageBox(0,My MFC Window,InitInstance,MB_OK|M B_ICONAST
10、ERISK); sample *obj; obj=new sample; m_pMainWnd=obj; obj-ShowWindow(SW_SHOWMAXIMIZED); return TRUE; 在这个函数,首先法一个消息框出来,使用MessageBox 函数,然后声明一个sample 类的指针 obj,第三行,为该 obj 分配内存, 即实例化,类的实例化要调用构造函数的初始化,程序的控制点到达sample 类的 sample函数,sample() Create(NULL,MFC Window); MessageBox(My MFC Window,CFrame constructor,M
11、B_OK); 这里才创建窗体,并且有一个消息框出现,然后程序的控制点回到App:InitInstance() 的 m_pMainWnd=obj;位置这一块是个难点,刚开始学的时候,我不明白m_pMainWnd ,你从哪里来,来了干什么。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 16 页 - - - - - - - - - 他从类 CWinThread 里来,他的定义为CWnd* m_pMainWnd; 他凭什么直接用?class CWinApp : public C
12、WinThread 因为 MFC 中的 CWinApp 类继承于 CWinThread 子类中用父类的成员变量,儿子用老爸的钱,当然可以拉,所以他可以直接用他有什么用,我们看sample *obj; obj=new sample; 这两个是在InitInstance() 这个成员函数声明的,也就是说,这个函数结束了,这个指针变量必然要析构,而这个指针是代表窗体框架的,这个指针释放了,那么,窗体也跟着消失了,所以,我们要把这个地址留下来,就给了m_pMainWnd 这个指针了,他是在线程类中的,有线程他就在,程序结束了,没线程了,他也消失了,窗体框架也就结束了。到现在我们还只是在内存中,创建了一
13、个窗体,没有显示出来,那么obj-ShowWindow(SW_SHOWMAXIMIZED); 通过这一句,用指针调用类的成员函数,在CFrameWnd 中,还封装了ShowWindow 这个 API 函数 ,用法和API 函数一样。在 return TRUE;这句之后该函数结束。程序进入了运行状态,在关闭程序的时候,会调用ExitInstance()这个函数,该函数仅仅输出一个消息框就结束了。那么这个简单的MFC 程序就讲到这里了。MFC 入门(二)消息映射原创 作者: zhoujiamurong (仅供 vchelp 网站使用,如需转载请联系 )上一篇http:/ 的朋友,请先看上一篇。我继
14、续来写MFC 的学习文章。我们上一节已经讲述了MFC 的两个基本类CWinApp 类和 CFrameWnd 类,一个应用程序类和框架类。我们在这一节利用已有的程序,来完成一个鼠标的响应事件。在MFC 里面,它提供了一种叫做消息映射的机制,来名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 16 页 - - - - - - - - - 完成事件的处理。首先,在 VC+ 中,将事件称为消息。我们要响应一个事件,我们就要写一个函数来响应这个事件。那么,比如,我们点击了一下窗体,那
15、么我们要响应这个点击事件,我们要给这个事件写一个函数来响应他。这样有很多的事件,也就有很多对应的函数。那么,我们怎么知道哪个事件和哪个函数相关联呢?在 SDK 的编程中,我们使用WndProc 函数来统一处理消息,然后使用switch-case 语句,来区别每个消息,在每个case里面来处理事件。使用一个常量(例如 WM_COMMAND )来区别到底是哪个消息。MFC 将 SDK 的这些 switch-case封装成了宏,那么什么是宏。可能很多人都学过,我在这里只提一下。#define A 100 void main() printf(%d,A); 再这个程序中,我们就把100 这个常量封装成
16、了A,我们就可以使用宏A 来代替 100。我们回到正题,在MFC 中提供了四个宏DECLARE_MESSAGE_MAP BEGIN_MESSAGE_MAP END_MESSAGE_MAP ON_COMMAND 因为这几个宏是嵌套宏定义,要展开很复杂,我个人研究了几天,有兴趣可以看一下我的博客(http:/ DECLARE_MESSAGE_MAP是 BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的申明,就是在类里面声明一些函数。BEGIN_MESSAGE_MAP END_MESSAGE_MAP这两个是函数的实现,那么在这个函数的实现是用ON_COMMAND这个宏来定义具体的消
17、息和消息对应的函数。那我们继续使用上一次我们做的程序 ,我们在其中添加消息映射#include class sample:public CFrameWnd 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 16 页 - - - - - - - - - public: sample() Create(NULL,M FC Window); MessageBox(My MFC Window,CFrame constructor,MB_OK); void OnLButtonDown
18、(UINT,CPoint)/添加的消息处理函数 :MessageBox(NULL,ddd,dd,MB_OK); DECLARE_MESSAGE_MAP()/消息映射的申明; BEGIN_MESSAGE_MAP(sample,CFrameWnd) /这个宏填写两个参数,一个子类,一个父类 ON_WM_LBUTTONDOWN()/左键按下的事件END_MESSAGE_MAP()/结束宏class App:public CWinApp public: BOOL InitInstance(); BOOL ExitInstance(); ; BOOL App:InitInstance() Message
19、Box(0,My MFC Window,InitInstance,MB_OK|M B_ICONASTERISK); sample *obj; obj=new sample; m_pMainWnd=obj; obj-ShowWindow(SW_SHOWMAXIMIZED); return TRUE; BOOL App:ExitInstance() MessageBox(0,My Window,ExitInstance,MB_OK|M B_ICONHAND); return TRUE; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
20、 名师精心整理 - - - - - - - 第 6 页,共 16 页 - - - - - - - - - App a; 那么,这些消息映射的宏和函数的名字是固定的,因为这些是常用的系统消息。有这样的名字的函数和宏会自己关联,我们将上述程序再运行一下,加深映象,这一节我们先讲MFC 入门 (三)资源上两节我们讲了一个简单的MFC 的程序,和消息映射宏的用法,我们这一节将讲述资源文件,在将资源文件之前,我们看一下VC+ 的文件简介,那我们看下面这一张图。(来自 侯大师)这张图清楚的描述了VC+ 的文件系统,他们是分为两条线的一个是源文件,一个是资源文件。先讲第一条线源文件,.c 或者 .cpp 文
21、件,在加入了头文件.H 文件后,就进入编译器工具。再讲第二条线资源文件,有最上面的三个工具,对话框工具编辑对话框文件.dlg ,图片编辑器编辑图片(.bmp) 、光标 (.cur)、图标 (.ico)文件,字体编辑器编辑字体文件(.FON )(但是字体我没有看到哪里可以用,请高人指点 )。所有的资源文件合成一个文件.RC 文件,即资源文件,我们可以想到,这资源文件和我们的源文件怎么关联呢?那么唯一相关联的是.H 文件,这个头文件就是我们等一下要用的resource.h这个文件。 .c 或者 .cpp 文件和头文件编译成.obj 文件,而 .rc 文件和头文件编译成.res文件, .obj 和库
22、文件和 .res 文件连结成可执行文件。大家可能都看烦了,下面来上机创建一个资源文件,即菜单,为我们上两节的程序加一个菜单。先打开我们的上两节的程序的工程,然后,新建在打开的对话框里,我们自动会在文件选项卡里,我们选择Resource Script 选项,在文件文本框中填写一个文件名,自己起一个名字。那么,我们就给我们的工程加了一个资源文件。在弹出的窗体,点击右键,在谈出的菜单中点击Insert 菜单 -Menu- 新建 .,在弹出得菜单编辑器,我们双击主菜单,弹出的属性框中,填写菜单标题如:我的菜单 .回车后,我们就建立了一个菜单资源文件。我们可以看到,这个资源编辑器是WYSIWYG(Wha
23、t you see is what you get所见及所得 )界面,我只简单介绍一下:资源编辑器创建的资源会自动的生成resource.h这个头文件, 我们刚才也讲了, 这个头文件是资源文件和源代码文件的一个桥梁,所以我们在源代码例一定要#include “resource.h”,我们在创建子菜单的时候会发现,有一个资源ID 号要你填写(自己起一个名字,不要重复),那么这个资源号就是我们在源代码里要引用的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 16 页 - -
24、 - - - - - - - 我们已经添加了菜单,我们运行程序,发现菜单并没有出现,因为我们的菜单并没有和我们的某一个窗体相关联。那么如何关联?我们回忆我们在写SDK 程序是我们是如何加菜单的。我们使用 CreateWindow 这个 API 函数来创建窗体,同时也关联菜单(当然,也可以在注册类里关联),我们知道 MFC 就是对 API 的封装后, CreateWindow 当然也被封装了,他被封装成了很多类的Create 方法,其中就有CFrameWnd。我们在Sample 类里继承了CFrameWnd,我们右键点击Sample 构造函数里的Create 方法,在弹出的菜单里点击Goto D
25、efine of Create,在弹出的菜单点确定。我们来到了Create方法的定义BOOL Create(LPCTSTR lpszClassName,/ 注册类, MFC 将注册类封装,我们填写NULL LPCTSTR lpszWindowName,/ 窗体名,窗体标题DWORD dwStyle = WS_OVERLAPPEDWINDOW,/窗体风格const RECT& rect = rectDefault,/ 窗体的矩形区域CWnd* pParentWnd = NULL, / 父窗体指针LPCTSTR lpszMenuName = NULL, / 窗体的菜单DWORD dwExStyle
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年MFC入门教程 2022 MFC 入门教程
限制150内