Visual C++ MFC 简明教程 2

peacehp 2010-04-29 07:09:45
建立项目和编译代码
为了在 Visual C++ 中编译代码,你必须要建立一个项目。为了这么小的程序来建立一个项目可能有点小题大作,但是,在任何实际的程序中,项目的概念是非常有用的。一个项目主要保存着下面三种不同类型的信息:
1. 它可以记住建立一个可执行程序所需要的所有源程序代码文件。在这个简单的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一个大型的应用程序中,为了便于管理和维护,你可以会有许多个不同的源文件。项目会维护这些不同文件的列表,并当你要建立下一个新的可执行程序时,在必要时编译它们。
2. 它会记住针对你的应用程序所使用的编译器和连接器选项。例如,它会记住把哪个库连接到了执行程序中,你是否预编译了头文件等等。
3. 它会记住你想要建立的项目类型: 一个控制台应用程序,或一个窗口应用程序等等。
如果你已经对项目文件有所了解,则会很容易明白作为机器产生的项目文件的作用。现在,我们来建立一个简单的项目,并用它来编译 HELLO.CPP。
为此,首先从“File”菜单中选择“New”选项。在“Projects”标签中,加单击“Win32 Application”。在“Location”域中输入一个合适的路径名或单击“Browse”按钮来选择一个。在“Project name”中输入“hello”作为项目名称。这时候你会看到“hello”也会出现在“Location”域中。单击“OK”按钮。Visual C++ 会建立一个新的称为HELLO的目录,并把所有的项目文件 HELLO.OPT、HELLO.NCB、HELLO.DSP 和 HELLO.DSW 都放到该目录中。如果你退出,以后再重新打开该项目,则可选择 HELLO.DSW。
现在,在屏幕的左边,出现了三个标签。InfoView 标签仍然在,又新出现了 ClassView 和 FileView 标签。ClassView 标签会把你程序中所有的类都列出来,FileView 标签给出了项目中文件的列表。
现在可以输入程序的代码了。在“File”菜单中选择“New”选项来建立一个编辑窗口。在出现的对话框中,选择“Files”标签和“Text File”。则会出现 Visual C++ 的智能编辑器,你可以用它来输入上面的程序代码。输入代码时,你会发现编辑器会自动把不同类型的文本变成不同的颜色,如注释、关键字字符串等的颜色都不同。如果你要改变其颜色或关闭颜色功能,可选择“Tools”菜单中“Options”选项,然后选择“Format”标签和“Source Windows”选项就可以修改。
输入完代码后,选择“File”菜单中的“Save”选项来保存。在 Visual C++ 新建立的目录中,把它存成 HELLO.CPP 文件。
现在选择在“Project”菜单中选择“Add To Project”选项,再选“Files...”。你会看到一个对话框供你选择要添加的文件。在本例子中,选择 HELLO.CPP 文件。
在屏幕的左边,单击 FileView 标签,并双击标有 HELLO 的图标。你会看到名为 HELLO.CPP 的文件。单击 ClassView 标签,并双击文件夹图标,你会看到程序中所有的类。任何时候你都可以使用 FileView 来删除项目的文件,你只要单击该文件,然后按键盘上的 delete 键。
后,此时你必须告诉项目要使用MFC库。如果你忽略了这一步,则项目在连接时会出错,而出错信息对你毫无帮助。选择“Project”菜单的“Settings”。在出现的对话框中选择“General”标签。在“Microsoft Foundation Classes”组合框中,选择“Use MFC in a Shared DLL”。然后关闭对话框。
我们已经建立了项目文件,并调整了设置,你现在可以准备编译 HELLO.CPP 程序了。在“Build”菜单中,你会发现有三个不同的编译选项:
1. Compile HELLO.CPP (只有当含有 HELLO.CPP 的窗口处于激活状态时才可)
2. Build HELLO.EXE
3. Rebuild All
第一个选项只是编译源文件并形成它们的目标文件。该选项不能完成连接任务,所以它只对快速编译一些源文件以检查错误有用。第二个选项编译自上次编译后所修改的所有源文件,并连接形成可执行文件。第三个选项要重新编译和连接所有的源文件。
我们可以选择“Build HELLO.EXE”来编译和连接代码。Visual C++ 会建立一个名为“Debug”的新子目录,并把 HELLO.EXE 放在该目录中。该子目录的文件都是可以再产生的,所以你可以任意删除它们。
如果你发现了编译错误,双击输出窗口中的错误信息。这时编辑器会把你带到出错的位置处。检查你的代码是否有问题,如果有,就修改之。如果你看到大量的连接错误,则可能你在建立项目对话框中所指定的项目类型不对。你可以把该项目所在的子目录删除,然后再重新按上面的步骤来建立。
为了执行该程序,你可选则“Build”菜单中的“Execute HELLO.EXE”选项。你就可以看到你的第一个MFC程序了 -- 出现一个带有“hello world”的窗口。该窗口本身带有:标题栏、尺寸缩放区、最大和最小按钮等等。在窗口上,有一个标有“hello world”。请注意,该程序是完整的。你可以移动窗口、缩放窗口、最小化等。你只使用了很少的代码就完成了一个完整的 Window 应用程序。这就是使用 MFC 的优点。所有的细节问题都有MFC来处理。

结论
在本讲中,你已经成功地编译和执行了你的第一个 MFC 程序。你将来会用类似的步骤来建立的应用程序。你可以为每个项目建立单独的目录,或建立一个单独的项目文件,然后再添加或删除不同的源文件。
在下一讲中,我们将仔细研究该程序,你会更完整的理解它的结构。

第二部分:一个简单的MFC程序
在本将中,我们将一段一段地来研究上一将中提到的 MFC 应用程序,以便能理解它的结构和概念框架。我们将先介绍 MFC,然后在介绍如何用 MFC 来建立应用程序。

MFC简介
MFC 是一个很大的、扩展了的 C++ 类层次结构,它能使开发 Windows 应用程序变得更加容易。MFC 是在整个 Windows 家族中都是兼容的,也就是说,无论是 Windows3.x、Windows95 还是 Windows NT,所使用的 MFC 是兼容的。每当新的 Windows 版本出现时,MFC 也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC 也回得到扩展,添加新的特性、变得更加容易建立应用程序。
与传统上使用 C 语言直接访问 Windows API相反,使用 MFC 和 C++ 的优点是 MFC 已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用 C 编写的 Windows 程序所必需的。因此用 MFC 编写的程序要比用C语言编写的程序小得多。另外,MFC 所编写的程序的性能也毫无损失。必要时,你也可以直接调用标准 C 函数,因为 MFC 不修改也不隐藏 Windows 程序的基本结构。
使用 MFC 的最大优点是它为你做了所有最难做的事。MFC 中包含了上成千上万行正确、优化和功能强大的 Windows 代码。你所调用的很多成员函数完成了你自己可能很难完成的工作。从这点上将,MFC 极大地加快了你的程序开发速度。
MFC 是很庞大的。例如,版本4.0中包含了大约200个不同的类。万幸的是,你在典型的程序中不需要使用所有的函数。事实上,你可能只需要使用其中的十多个 MFC 中的不同类就可以建立一个非常漂亮的程序。该层次结构大约可分为几种不同的类型的类:
 应用程序框架
 图形绘制的绘制对象
 文件服务
 异常处理
 结构 - List、Array 和 Map
 Internet 服务
 OLE 2
 数据库
 通用类
在本教程中,我们将集中讨论可视对象。下面的列表给出了部分类:
 CObject
 CCmdTarget
 CWinThread
 CWinApp
 CWnd
 CFrameWnd
 CDialog
 CView
 CStatic
 CButton
 CListBox
 CComboBox
 CEdit
 CscrollBar

在上面的列表中,有几点需要注意。第一,MFC 中的大部分类都是从基类 CObject 中继承下来的。该类包含有大部分MFC类所通用的数据成员和成员函数。第二,是该列表的简单性。CWinApp 类是在你建立应用程序是要用到的,并且任何程序中都只用一次。CWnd 类汇集了 Windows 中的所有通用特性、对话框和控制。CFrameWnd 类是从 CWnd 继承来的,并实现了标准的框架应用程序。CDialog 可分别处理无模式和有模式两种类型的对话框。CView 是用于让用户通过窗口来访问文档。最后,Windows 支持六种控制类型: 静态文本框、可编辑文本框、按钮、滚动条、列表框和组合框(一种扩展的列表框)。一旦你理解了这些,你也就能更好的理解 MFC 了。MFC 中的其它类实现了其它特性,如内存管理、文档控制等。
为了建立一个MFC应用程序,你既要会直接使用这些类,而通常你需要从这些类中继承新的类。在继承的类中,你可以建立新的成员函数,这能更适用你自己的需要。你在第一讲中的简单例子中已经看到了这种继承过程,下面会详细介绍。CHelloApp 和 CHelloWindow 都是从已有的 MFC 类中继承的。

设计一个程序
在讨论代码本身之前,我们需要花些工夫来简单介绍以下 MFC 中程序设计的过程。例如,假如你要编一个程序来向用户显示“Hello World”信息。这当然是很简单的,但仍需要一些考虑。
“hello world”应用程序首先需要在屏幕上建立一个窗口来显示“hello world”。然后需要实际把“hello world”放到窗口上。我们需要但个对象来完成这项任务:
1. 一个应用程序对象,用来初始化应用程序并把它挂到 Windows 上。该应用程序对象处理所有的低级事件。
2. 一个窗口对象来作为主窗口。
3. 一个静态文本对象,用来显示“hello world”。
你用 MFC 所建立的每个程序都会包含头两个对象。第三个对象是针对该应用程序的。每个应用程序都会定义它自己的一组用户界面对象,以显示应用程序的输出和收集应用的输入信息。
一旦你完成了界面的设计,并决定实现该界面所需要的控制,你就需要编写代码来在屏幕上建立这些控制。你还会编写代码来处理用户操作这些控制所产生的信息。在“hello world”应用程序中,只有一个控制。它用来输出“hello world”。复杂的程序可能在其主窗口和对话框中需要上百个控制。
应该注意,在应用程序中有两种不同的方法来建立用户控制。这里所介绍的是用 C++ 代码方式来建立控制。但是,在比较大的应用程序中,这种方法是不可行的。因此,在通常情况下要使用资源文件的图形编辑器来建立控制。这种方法要方便得多。

理解“hello world”的代码
下面列出了你在上一讲中已经输入、编译和运行的“hello world”程序的代码。添加行号是为了讨论方便。我们来一行行地研究它,你会更好的理解 MFC 建立应用程序的方式。
如果你还没有编译和运行该代码,应该按上一讲的方法去做。
1 //hello.cpp

2 #include <afxwin.h>

3 // Declare the application class
4 class CHelloApp : public CWinApp
5 {
6 public:
7 virtual BOOL InitInstance();
8 };

9 // Create an instance of the application class
10 CHelloApp HelloApp;

11 // Declare the main window class
12 class CHelloWindow : public CFrameWnd
13 {
14 CStatic* cs;
15 public:
16 CHelloWindow();
17 };

18 // The InitInstance function is called each
19 // time the application first executes.
20 BOOL CHelloApp::InitInstance()
21 {
22 m_pMainWnd = new CHelloWindow();
23 m_pMainWnd->ShowWindow(m_nCmdShow);
24 m_pMainWnd->UpdateWindow();
25 return TRUE;
26 }

27 // The constructor for the window class
28 CHelloWindow::CHelloWindow()
29 {
30 // Create the window itself
31 Create(NULL,
32 "Hello World!",
33 WS_OVERLAPPEDWINDOW,
34 CRect(0,0,200,200));
35 // Create a static label
36 cs = new CStatic();
37 cs->Create("hello world",
38 WS_CHILD|WS_VISIBLE|SS_CENTER,
39 CRect(50,80,150,150),
40 this);
41 }
你把上面的代码看一遍,以得到一整体印象。该程序由六小部分组成,每一部分都起到很重要的作用。
首先,该程序包含了头文件 afxwin.h (第 2 行)。该头文件包含有 MFC 中所使用的所有的类型、类、函数和变量。它也包含了其它头文件,如 Windows API 库等。
第 3 至 8 行从 MFC 说明的标准应用程序类 CWinApp 继承出了新的应用程序类 CHelloApp。该新类是为了要重载 CWinApp 中的 InitInstance 成员函数。InitInstance 是一个应用程序开始执行时要调用的可重载函数。
在第10行中,说明了应用程序作为全局变量的一个事例。该实例是很重要的,因为它要影响到程序的执行。当应用程序被装入内存并开始执行时,全局变量的建立会执行 CWinApp 类的缺省构造函数。该构造函数会自动调用在18至26行定义的 InitInstance 函数。
在第11至17中,CHelloWindow 类是从 MFC 中的 CFrameWnd 类继承来的。CHelloWindow 是作为应用程序在屏幕上的窗口。建立新的类以便实现构造函数、析构函数和数据成员。
第18至26行实现了 InitInstance 函数。该函数产生一个 CHelloWindow 类的事例,因此会执行第27行至41行中类的构造函数。它也会把新窗口放到屏幕上。
第27至41实现了窗口的构造函数。该构造函数实际是建立了窗口,然后在其中建立一个静态文本控制。
要注意的是,在该程序中没有 main 或 WinMain 函数,也没有事件循环。然而我们从上一讲在执行中知道它也处理了事件。窗口可以最大或最小化、移动窗口等等。所有这些操作都隐藏在主应用程序类 CWinApp 中,并且我们不必为它的事件处理而操心,它都是自动执行、在 MFC 中不可见的。
下一节中,将详细介绍程序的各部分。你可能不能马上全都理解得很好: 但你最好先读完它以获得第一印象。在下一讲中,会介绍一些特殊的例子,并偶把各片段组合在一起,有助于你能更好的理解。

程序对象
用 MFC 建立的每个应用程序都要包括一个单一从 CWinApp 类继承来的应用程序对象。该对象必须被说明成全局的(第10行),并且在你的程序中只能出现一次。
从 CWinApp 类继承的对象主要是处理应用程序的初始化,同时也处理应用程序主事件循环。CWinApp 类有几个数据成员和几个成员函数。在上面的程序中,我们只重载了一个 CWinApp 中的虚拟函数 InitInstance。
应用程序对象的目的是初始化和控制你的程序。因为 Windows 允许同一个应用程序的多个事例在同时执行,因此 MFC 把初始化过程分成两部分并使用两个函数 InitApplication 和 InitInstance 来处理它。此处,我们只使用了一个 InitInstance 函数,因为我们的程序很简单。当每次调用应用程序时都会调用一个新的事例。第3至8行的代码建立了一个称为 CHelloApp 的类,它是从 CWinApp 继承来的。它包含一个新的 InitInstance 函数,是从 CWinApp 中已存在的函数(不做任何事情)重载来的:
3 // Declare the application class
4 class CHelloApp : public CWinApp
5 {
6 public:
7 virtual BOOL InitInstance();
8 };
在重载的 InitInstance 函数内部,第18至26行,程序使用 CHelloApp 的数据成员 m_pMainWnd 来建立并显示窗口:
18 // The InitInstance function is called each
19 // time the application first executes.
20 BOOL CHelloApp::InitInstance()
21 {
22 m_pMainWnd = new CHelloWindow();
23 m_pMainWnd->ShowWindow(m_nCmdShow);
24 m_pMainWnd->UpdateWindow();
25 return TRUE;
26 }
InitInstance 函数返回 TRUE 表示初始化已成功的完成。如果返回了FALSE,则表明应用程序会立即终止。在下一节中我们将会看到窗口初始化的详细过程。
当应用程序对象在第10行建立时,它的数据成员(从 CWinApp 继承来的) 会自动初始化。例如,m_pszAppName、m_lpCmdLine 和 m_nCmdShow 都包含有适当的初始化值。你可参见 MFC 的帮助文件来获得更详细的信息。我们将使用这些变量中的一个。




...全文
427 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongxi8 2011-07-01
  • 打赏
  • 举报
回复
为什么只有4部分啊
sag2000 2010-04-30
  • 打赏
  • 举报
回复
看看........................
vcrun 2010-04-29
  • 打赏
  • 举报
回复
Eleven 2010-04-29
  • 打赏
  • 举报
回复
接分。。。。。。。。。
littlefangMFC 2010-04-29
  • 打赏
  • 举报
回复
JFJFJFJF
peacehp 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yincheng01 的回复:]
这个MFC简明教程哪有啊,我想要
[/Quote]


我已上传到下载资源了!!
你到VC++那去找吧!
要不我发到你邮箱?
peacehp 2010-04-29
  • 打赏
  • 举报
回复
想发个文档分享,但是文字太多,只能分次发,本人最近学VC++兴趣比较大,所以就发了!!!
jingzhongrong 2010-04-29
  • 打赏
  • 举报
回复
接分
尹成 2010-04-29
  • 打赏
  • 举报
回复
这个MFC简明教程哪有啊,我想要
tanwei1002 2010-04-29
  • 打赏
  • 举报
回复
接分 回复内容太短了!
aa3000 2010-04-29
  • 打赏
  • 举报
回复
啥?让人接分?

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧