win32 MFC教程.docx
- 文档编号:5731203
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:32
- 大小:261.87KB
win32 MFC教程.docx
《win32 MFC教程.docx》由会员分享,可在线阅读,更多相关《win32 MFC教程.docx(32页珍藏版)》请在冰豆网上搜索。
win32MFC教程
01章用向导创建文档窗口
MFC教程是小雅最怕写的内容,除了水平问题之外,还有一点就是,MFC将许多程序封装起来,使众多程序员在编程时,即使编出了程序,也不知究竟为什么这样就可以了。
这一现象使小雅想到当今的Java程序员,许多人在开发外包项目时,因为整个FrameWork已经建成,自己只是担当其中一部分功能,出了BUG之后,找原因非常困难。
在SDK教程中,小雅将各种功能进行详细解说,而MFC教程中,只是用例子来讲解MFC的原理,学会原理之后,就会感到MFC比SDK编程省了许多事。
小雅在SDK教程中,为了讲明API功能,用的方法都是C语言的方法,而MFC用的全是C++的内容,因此,学习MFC必须对C++有较深的了解,不会C语言、C++语言而能够学会MFC的人只能是吹牛。
小雅的“C语言教程”和“C++语言教程”都是按照标准C/C++来写的,在Unix、Linux、Windows都适用,这是很重要的基础。
SDK教程主要是让初学者明白WindowsAPI的功能,以及程序的实现方法,基本上是“C语言+API”,而MFC基本上是“C+++API”。
SDK编程和MFC是可以相互转化,相互调用的,因为MFC封装了绝大部分API,但不是所有的API函数。
注意:
SDK并不是只能用C语言来写,用C++一样编程,小雅在作教程时为了把内容说清楚,同时兼顾不会C++的人员才使用C语言。
对于初学者,小雅建议在C/C++的基础上用MFC来编程,一是省去了很多编程,二是用上了C++的面向对象编程的思想。
当今要找一个C++的项目来一边做一边学是很困难的。
小雅自己也一直想找一个C++的工作而未能如愿。
通过学习MFC再反过来加强一下学的不是很深的C++,不是很好的一个方法吗?
不过,MFC和SDK与C/C++不同点在消息事件处理方面,初学者要学会这一内容。
关于“VC.NET”有“托管”和“非托管”二种编程方式,小雅的SDK教程和MFC教程全部是“非托管”编程,也就是传统编程。
微软自己说“托管”方式是为传统编程人员的过渡,既然是过渡的产物,小雅也就不去浪费时间精力去写这种教程了,如果想用“托管”编程,还不如直接用C#或VB.NET。
一、创建一个单文档窗口
MFC编程很大程度上要借助于集成环境中的各种工具,下面我们也通过工具来生成一个基本的窗口程序,再通过这个程序来了解MFC的各主要的类、基本类,学会图标、菜单、资源视图、类视图、解决方案资源管理器、对象浏览器的使用。
创建一个单文档窗口的步骤是:
∙用菜单的“文件”→“新建”→“项目”打开“新建项目”对话框。
∙在“新建项目”对话框中分别选择设置①类型为“VisualC++项目”、②“MFC”、③模板为“MFC应用程序”、④名称为“Test”⑤位置为“C:
\MFC”。
其中④和⑤可自由设定。
最后按“确定”按钮进入“MFC应用程序向导”对话框。
∙在“MFC应用程序向导”对话框中,①选择菜单“应用程序类型”、②选择“单文档”选项。
最后按“完成”按钮结束。
二、生成后的文件的作用
生成的文件的作用可以在ReadMe.txt便可知道。
当然,后面章节中小雅将对每一部分详细剖析。
================================================================================
MICROSOFT基础类库:
Test项目概述
===============================================================================
应用程序向导已为您创建了此Test应用程序。
此应用程序不仅介绍了使用Microsoft基
础类的基本知识,而且是编写应用程序的起点。
此文件包含组成Test应用程序的每个文件的内容摘要。
Test.vcproj
这是使用“应用程序向导”生成的VC++项目的主项目文件。
它包含有关生成文件的VisualC++版本的信息,以及有关用“应用程序向导”所选择
的平台、配置和项目功能的信息。
Test.h
这是应用程序的主头文件。
它包含其他项目特定的头文件(包括Resource.h),并声
明CTestApp应用程序类。
Test.cpp
这是包含应用程序类CTestApp的主应用程序源文件。
Test.rc
这是程序使用的所有MicrosoftWindows资源的列表。
它包含存储在RES子目录中的图
标、位图和光标。
可直接在MicrosoftVisualC++中编辑此文件。
项目资源包含在
2052中。
res\Test.ico
这是一个图标文件,用作应用程序的图标。
此图标包含在主资源文件Test.rc中。
res\Test.rc2
此文件包含不由MicrosoftVisualC++编辑的资源。
应将所有不能由资源编辑器编辑的
资源放在此文件中。
/////////////////////////////////////////////////////////////////////////////
对于主框架窗口:
项目将包含标准的MFC界面。
MainFrm.h,MainFrm.cpp
这些文件包含框架类CMainFrame,该类派生自CFrameWnd并控制所有的SDI框架功能。
res\Toolbar.bmp
此位图文件用于创建工具栏的平铺图像。
初始工具栏和状态栏在CMainFrame类中构造。
使用资源编辑器编辑此工具栏位图,并更新Test.rc中的IDR_MAINFRAMETOOLBAR数组
以添加工具栏按钮。
/////////////////////////////////////////////////////////////////////////////
应用程序向导将创建一种文档类型和一个视图:
TestDoc.h、TestDoc.cpp-文档
这些文件包含CTestDoc类。
编辑这些文件以添加特殊的文档数据并实现文件的保存和
加载(通过CTestDoc:
:
Serialize)。
TestView.h、TestView.cpp-文档视图
这些文件包含CTestView类。
CTestView对象用于查看CTestDoc对象。
/////////////////////////////////////////////////////////////////////////////
其他功能:
ActiveX控件
应用程序支持使用ActiveX控件。
打印支持和打印预览支持
应用程序向导已生成了一些代码,通过从MFC库调用CView类中的成员函数来处理打印、
打印设置和打印预览命令。
/////////////////////////////////////////////////////////////////////////////
其他标准文件:
StdAfx.h、StdAfx.cpp
这些文件用于生成名为Test.pch的预编译头文件(PCH)和名为StdAfx.obj的预编译类型
文件。
Resource.h
这是标准头文件,它定义新资源ID。
MicrosoftVisualC++将读取并更新此文件。
/////////////////////////////////////////////////////////////////////////////
其他说明:
应用程序向导使用“TODO:
”来指示应添加或自定义的源代码部分。
如果应用程序在共享DLL中使用MFC,且应用程序使用的语言不是操作系统的当前语言,则需
要从MicrosoftVisualC++光盘上Win\System目录下将相应的本地化资源MFC70XXX.DLL
复制到计算机的system或system32目录下,并将其重命名为MFCLOC.DLL。
(“XXX”代表
语言缩写。
例如,MFC70DEU.DLL包含翻译成德语的资源。
)如果不这样做,应用程序的某
些UI元素将保留为操作系统的语言。
/////////////////////////////////////////////////////////////////////////////
02章用向导创建对话框窗口
一、应用程序的窗口种类
Windows应用程序的窗口类型主要有二种即文档类型(Document)和对话框类型(Dialog),通常说的表单类型(Form)是介于这2种类型之间,主要是对话框类型。
VB.NET、C#等主要就是这种表单类型的窗口,实现起来相当简单。
文档类型的应用程序的界面,大部分区域用于文字或画图等读写操作,常见的有Word、Excel、写字板等。
文档类型的窗口又分单文档和多文档2种类型。
所谓多文档类型就是在一个窗口框架内有多个子窗口,常见的有Word、Excel、当前编写VC++的IDE等。
单文档类型当然就不可能有多个子窗口了,常见的有附件中的写字板、画图等。
文档类型的窗口的编程相对对话框来说要复杂得多,是我们学习的主要对象。
对话框类型的界面中使用了很多控件,输入输出主要是针对控件,常见的有计算器、音量控制等。
编程相对比较简单,另外公共对话框也是这种类型,不过不需要任何编程,因为这些是操作系统的东西,只调用就可以了。
对话框类型是日常我们编程用的最多的,也就是表单类型。
另外,对话框类型也可以象文档类型一样进行文字、画图等处理,而文档类型窗口中同样也可以使用控件。
对于文档窗口一般可以改变大小,并且有滚动条,背景多数为白色。
而对话框窗口的大小一般是固定的,背景一般是淡灰色,没有滚动条,通常有OK、Cancel等按钮。
要注意,对话框窗口有模态和非模态2种类型。
所谓模态对话框就是当前对话框不关闭,就不能切换到调用该对话框的父窗口;而所谓非模态窗口就是不关闭当前对话框,也同样可以切换到调用该对话框的父窗口。
绝大多数对话框都是模态方式,非模态方式比较少,例如VC.net集成环境中按Ctrl+F弹出的“查找”对话框就是非模态方式。
二、创建一个基于对话框的窗口
在上一章生成单文档应用程序的最后一步中,选择“基于对话框”后再按“完成”按钮。
三、阅读原程序的方法
下面,我们要学会用用四种工具来查看或修改生成好的程序。
①解决方案资源管理器(以前称为项目管理器);②类视图;③资源视图;④属性。
“解决方案资源管理器”中显示项目中的所有文件,如果要删除一个既存的程序,或添加一个新程序或头文件等,都是利用这个工具来完成。
“资源视图”中包含菜单、鼠标光标、对话框、图标、工具条、字符串常量表、版本信息表、快捷键、HTML等,在“解决方案资源管理器”中鼠标双击后缀为rc的文件便可打开“资源视图”。
添加、修改、删除“资源”都是在“资源视图”中操作。
这些“资源”文件其实都是文本文件,内容基本上是资源的定义(图标等除外),完全可以直接手动编写,但手动编写既容易出错,也不方便。
另外,对话框的设计还需要和“属性”工具一起使用,这些都是微软VisualStudio集成工具的基本使用常识,MFC教程中不再详细叙述。
“类视图”是学习MFC最重要的工具,小雅认为初学者要学会或者说习惯这个工具的使用。
一个很简单的程序,经过MFC生成之后,便是一个“庞大”的程序,初学者如果一行一行地去读,往往头晕目眩,越看越烦。
而通过“类视图”从整体上来分析,能很好地把握整个的设计思路,通过“类视图”能很准确地定位到你想编程的“位置”。
例如,添加类成员变量或成员函数,消息处理等,利用工具,多个地方的程序将被同进更新。
通过“类视图”还可以很方便地看到父类的全部信息,从而了解当前的类还有哪些功能可以使用。
同时可以看到想相关类的全部信息。
这比Java的集成环境(如:
Websphere等)不知要方便多少倍。
“属性”使用该窗口查看和更改位于编辑器和设计器中的选定对象的设计时属性及事件。
也可以使用“属性”窗口编辑和查看文件、项目及解决方案属性。
“属性”窗口显示编辑字段的不同类型,这取决于特定属性的需要。
这些编辑字段包括编辑框、下拉列表以及到自定义编辑器对话框的链接。
属性以灰色显示且是只读的。
元素
图形
说明
对象名
列出当前选定的一个或多个对象。
只有活动编辑器或设计器中的对象可见。
当选择多个对象时,只出现所有选定对象的通用属性。
按分类顺序
按类别列出选定对象的所有属性及属性值。
可以折叠类别以减少可见属性数。
展开或折叠类别时,可以在类别名左边看到加号(+)或减号(-)。
类别按字母顺序列出。
按字母顺序
按字母顺序对选定对象的所有设计时属性和事件排序。
若要编辑可用的属性,请在它右边的单元格中单击并输入更改内容。
属性
显示对象的属性。
很多对象的事件也可以使用“属性”窗口来查看。
事件
显示对象的事件。
仅当窗体或控件设计器在一个VisualC#项目或C++项目托管扩展的上下文中处于活动状态时,此“属性”窗口工具栏控件才可用。
VC消息
列出所有Windows消息。
为选定类的消息添加或删除指定处理函数。
此“属性”窗口工具栏控件仅当“类视图”在VisualC++项目的上下文中为活动窗口时才可用。
VC重写
为选定类列出所有虚函数并允许添加或删除重写函数。
此“属性”窗口工具栏控件仅当“类视图”在VisualC++项目的上下文中为活动窗口时才可用。
属性页
显示选定项的“属性页”对话框。
“属性页”显示“属性”窗口中的可用属性的子集、同集或超集。
使用该按钮可查看和编辑与项目的活动配置相关的属性。
“说明”窗格
N/A
显示属性的属性类型和简短说明。
可以使用快捷菜单上的“说明”命令关闭和打开属性的说明。
03章初始大小、标题和图标的改变
一、直接修改现有图标
在上一章生成的基础上,打开资源视图,选择唯一的图标“IDR_MAINFRAME”双击,然后将图标“擦除”,画一个自己喜欢的图形并保存。
“Ctrl+F5”重新编译生成运行,你将会和小雅一样惊奇地发现,运行出来的程序的图标并没有改变。
小雅是个喜欢钻牛角尖的人,将源程序前前后后地研究了很长时间,未得其解,只好不耻下问。
身边的人问了、论坛上也发贴了,仍未找到答案。
不免有几句牢骚,中国许多人在招聘时个个都说自己能力很强,问他会不会VC++,他会举出很多做过VC++的项目,进了单位之后,让他编一个很简单的程序,费了九牛二虎之力生成一堆废代码。
如果给他一个sample的话,倒能发挥发挥。
这种现象决不是小雅有意要攻击哪个人,在国内如此,在国外更是如此。
而许多编程人员,明明技术很差,却个个自以为了不起,一点没有想学的念头。
不仅如此,许多人都象穷疯了一样,都想通过一两次生意、或一两年奋斗来“暴发”一下。
这种好大喜功的心理在中国很普遍,国家领导也将经济增长的数目作为政绩,而不注重实实在在的技术、生产能力,靠出卖廉价劳动带来的经济增长,这有什么好吹的。
那么原因出在哪儿呢,原因出在MFC生成的图标上,我们自己新建一个图标,无论怎样画大小也只有1K左右,而MFC生成的图标竟有22K之多。
小雅将MFC生成的图标一个象素一个象素地在新建的图标上画了一遍,大小也只有1K左右,新画的图标在Windows的资源管理器里面,无论大图标还是小图标,画错了的地方都能立即显示出来,而MFC生成的图标,无论怎样修改,在Windows的资源管理器里面,无论大图标还是小图标都没有任何改变。
小雅知识有限,对图象方面了解不多,记得看过一篇文章,介绍如何通过调色板控制BMP,使其颜色不能被修改。
图标也应该有类似的功能,小雅既然不会,就介绍一下更换图标的笨方法。
这个笨办法对第1章和第2章生成的程序都适用。
1.在资源视图中“Icon”下选择“IDR_MAINFRAME”图标,然后用“Delete”键删除。
2.在Windows的资源管理器里面,打开当前项目下的“res”子目录,删除相应的图标文件。
3.在资源视图中“~.rc”下,用右键菜单的“插入资源(A)...”,然后在对话框中选择“Icon”新建一个图标。
4.在属性工具中,将新建的图标的ID改为“IDR_MAINFRAME”(默认为“IDI_ICON1”)。
5.在属性工具中,将新建的图标的Filename改为上面删除的文件名。
注意应保存在“res”子目录下。
如果你事先已经有一个自己的图标,那最简单了,在VC++中什么也不需要修改,直接在资源管理器里面将那个22K的图标文件删除,然后用你自己的图标换成被删除的文件名。
二、改变窗口的标题和初始大小
在资源视图中打开“StringTable”,IDR_MAINFRAME的值为“test2\n\ntest2\n\n\ntest2.Document”,将之改为:
“yaer\n小雅\ntest2\n\n\ntest2.Document”,窗口的标题就改完了。
初始大小的更改,对于第2章生成的基于对话框的程序来说很简单,只要在资源视图中选择主窗口后打开,直接用鼠标改变大小就可以了。
对于第1章生成的文档类程序不忙于修改,先用类视图来看一下MFC生成的单文档程序和对话框程序的类有什么相同和不同。
单文档
对话框
CAboutDlg
“关于”对话框类。
无须修改。
CAboutDlg
“关于”对话框类。
无须修改。
CTest2App
主应用程序类,调用框架类、文档类、视图类。
无须修改。
CTest3App
主应用程序类,调用主对话框类。
无须修改。
CMainFrame
主框架类,即主窗口。
很少需要修改。
Ctest3Dlg
主对话框类。
CTest2Doc
文档类,即存放数据主要在这儿编写代码。
CTest2view
视图类,即用于屏幕显示的类,文字显示和画图主要在这儿编写代码。
修改窗口的初始大小在CMainFrame类的PreCreateWindow()成员函数中,通过修改CREATESTRUCTcs来修改窗口类或样式。
typedefstructtagCREATESTRUCTW{
LPVOIDlpCreateParams;//指向创建窗口用的数据的指针
HANDLEhInstance;//窗口的实例句柄
HMENUhMenu;//窗口的菜单句柄
HWNDhwndParent;//窗口句柄
intcy;//窗口的高度
intcx;//窗口的宽度
inty;//窗口的左上角的y座标
intx;//窗口的左上角的x座标
LONGstyle;//窗口的类型
LPCSTRlpszName;//指向窗口的名称的指针
LPCSTRlpszClass;//指向窗口类的名称的指针
DWORDdwExStyle;//窗口的扩展类型
}CREATESTRUCTW,*PCREATESTRUCTW,*LPCREATESTRUCTW;
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
在此处通过修改CREATESTRUCTcs来修改窗口类或样式
cs.cx=220;
cs.cy=150;
returnTRUE;
}
三、框架类、文档类、视图类的关系
框架类主要处理窗口的类型、边框、位置、大小以及子窗口(对于多文档来说)等内容,工具条、状态条也是这个类的成员变量。
如果要添加成员变量时,初始化要在CMainFrame()构造函数中添加代码;OnCreate()成员函数是消息WM_CREATE的处理函数,这里面根据需要修改代码(一般不需要);PreCreateWindow()成员函数是创建主窗口前的设置,调整窗口位置、大小、类型等都是在这儿修改代码。
文档类主要用来处理数据。
例如画一个图,图的各节点座标、颜色、线条的粗细等都有文档类来处理,文件的保存和打开等当然也是文档类来处理。
视图类主要处理数据的显示,例如:
文字在窗口中显示、键盘鼠标操作等都是由视图类来处理。
视图类不断地从文档类取数据,不断地对文档类传送数据。
当文档类数据较多时,视图类显示的数据只是文档类的一部分。
四、主应用程序类做什么
主应用程序类是程序的入口,其它各个类都是在这儿集成的。
这个类除构造函数之外,唯一要注意的就是初始化函数。
这个类一般不修改。
单文档
对话框
Ctest2App()
构造函数
Ctest2App()
构造函数
InitInstance()
初始化成员函数
InitInstance()
初始化成员函数
OnAppAbout()
由菜单发出的消息处理函数
单文档
对话框
BOOLCtest2App:
:
InitInstance()
{
InitCommonControls();
CWinApp:
:
InitInstance();
if(!
AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
returnFALSE;
}
AfxEnableControlContainer();
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
//加载标准INI文件选项(包括MRU)
LoadStdProfileSettings(4);
//上面内容不用太关注,以下是重点
//注册应用程序的文档模板。
文档模板
//将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(Ctest2Doc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(Ctest2View));
if(!
pDocTemplate)
returnFALSE;
AddDocTemplate(pDocTemplate);
//分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//调度在命令行中指定的命令。
如果
//用/RegServer、/Register、/Unregserver
//或/Unregister启动应用程序,则返回FALSE。
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
//唯一的一个窗口已初始化,因此显示它并对其进行更新
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- win32 MFC教程 MFC 教程