⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfc.htm

📁 一本关于WINDOWS核心编程的书籍
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  MFC 是很庞大的。例如,版本4.0中包含了大约200个不同的类。万幸的是,你在典型的程序中不需要使用所有的函数。事实上,你可能只需要使用其中的十多个 MFC 中的不同类就可以建立一个非常漂亮的程序。该层次结构大约可分为几种不同的类型的类:<br>
  应用程序框架 <br>
  图形绘制的绘制对象 <br>
  文件服务 <br>
  异常处理 <br>
  结构 - List、Array 和 Map <br>
  Internet 服务 <br>
  OLE 2 <br>
  数据库 <br>
  通用类 <br>
  在本教程中,我们将集中讨论可视对象。下面的列表给出了部分类:<br>
  CObject <br>
  CCmdTarget <br>
  CWinThread <br>
  CWinApp <br>
  CWnd <br>
  CFrameWnd <br>
  CDialog <br>
  CView <br>
  CStatic <br>
  CButton <br>
  CListBox <br>
  CComboBox <br>
  CEdit <br>
  CscrollBar <br>
  在上面的列表中,有几点需要注意。第一,MFC 中的大部分类都是从基类 CObject 中继承下来的。该类包含有大部分MFC类所通用的数据成员和成员函数。第二,是该列表的简单性。CWinApp 类是在你建立应用程序是要用到的,并且任何程序中都只用一次。CWnd 类汇集了 Windows 中的所有通用特性、对话框和控制。CFrameWnd 类是从 CWnd 继承来的,并实现了标准的框架应用程序。CDialog 可分别处理无模式和有模式两种类型的对话框。CView 是用于让用户通过窗口来访问文档。最后,Windows 支持六种控制类型: 静态文本框、可编辑文本框、按钮、滚动条、列表框和组合框(一种扩展的列表框)。一旦你理解了这些,你也就能更好的理解 MFC 了。MFC 中的其它类实现了其它特性,如内存管理、文档控制等。<br>
  为了建立一个MFC应用程序,你既要会直接使用这些类,而通常你需要从这些类中继承新的类。在继承的类中,你可以建立新的成员函数,这能更适用你自己的需要。你在第一讲中的简单例子中已经看到了这种继承过程,下面会详细介绍。CHelloApp 和 CHelloWindow 都是从已有的 MFC 类中继承的。<br>
  设计一个程序<br>
  在讨论代码本身之前,我们需要花些工夫来简单介绍以下 MFC 中程序设计的过程。例如,假如你要编一个程序来向用户显示“Hello World”信息。这当然是很简单的,但仍需要一些考虑。<br>
  <br>
  “hello world”应用程序首先需要在屏幕上建立一个窗口来显示“hello world”。然后需要实际把“hello world”放到窗口上。我们需要但个对象来完成这项任务:<br>
  一个应用程序对象,用来初始化应用程序并把它挂到 Windows 上。该应用程序对象处理所有的低级事件。 <br>
  一个窗口对象来作为主窗口。 <br>
  一个静态文本对象,用来显示“hello world”。 <br>
  你用 MFC 所建立的每个程序都会包含头两个对象。第三个对象是针对该应用程序的。每个应用程序都会定义它自己的一组用户界面对象,以显示应用程序的输出和收集应用的输入信息。<br>
  一旦你完成了界面的设计,并决定实现该界面所需要的控制,你就需要编写代码来在屏幕上建立这些控制。你还会编写代码来处理用户操作这些控制所产生的信息。在“hello world”应用程序中,只有一个控制。它用来输出“hello world”。复杂的程序可能在其主窗口和对话框中需要上百个控制。<br>
  应该注意,在应用程序中有两种不同的方法来建立用户控制。这里所介绍的是用 C++ 代码方式来建立控制。但是,在比较大的应用程序中,这种方法是不可行的。因此,在通常情况下要使用资源文件的图形编辑器来建立控制。这种方法要方便得多。<br>
  理解“hello world”的代码<br>
  下面列出了你在上一讲中已经输入、编译和运行的“hello world”程序的代码。添加行号是为了讨论方便。我们来一行行地研究它,你会更好的理解 MFC 建立应用程序的方式。<br>
  如果你还没有编译和运行该代码,应该按上一讲的方法去做。<br>
  1 //hello.cpp<br>
  2 #include <afxwin.h><br>
  3 // Declare the application class<br>
  4 class CHelloApp : public CWinApp<br>
  5 {<br>
  6 public:<br>
  7 virtual BOOL InitInstance();<br>
  8 };<br>
  9 // Create an instance of the application class<br>
  10 CHelloApp HelloApp;<br>
  11 // Declare the main window class<br>
  12 class CHelloWindow : public CFrameWnd<br>
  13 { <br>
  14 CStatic* cs;<br>
  15 public:<br>
  16 CHelloWindow();<br>
  17 };<br>
  18 // The InitInstance function is called each<br>
  19 // time the application first executes.<br>
  20 BOOL CHelloApp::InitInstance()<br>
  21 {<br>
  22 m_pMainWnd = new CHelloWindow();<br>
  23 m_pMainWnd->ShowWindow(m_nCmdShow);<br>
  24 m_pMainWnd->UpdateWindow();<br>
  25 return TRUE;<br>
  26 }<br>
  27 // The constructor for the window class<br>
  28 CHelloWindow::CHelloWindow()<br>
  29 { <br>
  30 // Create the window itself<br>
  31 Create(NULL, <br>
  32 "Hello World!", <br>
  33 WS_OVERLAPPEDWINDOW,<br>
  34 CRect(0,0,200,200)); <br>
  35 // Create a static label<br>
  36 cs = new CStatic();<br>
  37 cs->Create("hello world",<br>
  38 WS_CHILD|WS_VISIBLE|SS_CENTER,<br>
  39 CRect(50,80,150,150),<br>
  40 this);<br>
  41 }<br>
  你把上面的代码看一遍,以得到一整体印象。该程序由六小部分组成,每一部分都起到很重要的作用。<br>
  首先,该程序包含了头文件 afxwin.h (第 2 行)。该头文件包含有 MFC 中所使用的所有的类型、类、函数和变量。它也包含了其它头文件,如 Windows API 库等。<br>
  第 3 至 8 行从 MFC 说明的标准应用程序类 CWinApp 继承出了新的应用程序类 CHelloApp。该新类是为了要重载 CWinApp 中的 InitInstance 成员函数。InitInstance 是一个应用程序开始执行时要调用的可重载函数。<br>
  在第10行中,说明了应用程序作为全局变量的一个事例。该实例是很重要的,因为它要影响到程序的执行。当应用程序被装入内存并开始执行时,全局变量的建立会执行 CWinApp 类的缺省构造函数。该构造函数会自动调用在18至26行定义的 InitInstance 函数。<br>
  在第11至17中,CHelloWindow 类是从 MFC 中的 CFrameWnd 类继承来的。CHelloWindow 是作为应用程序在屏幕上的窗口。建立新的类以便实现构造函数、析构函数和数据成员。<br>
  第18至26行实现了 InitInstance 函数。该函数产生一个 CHelloWindow 类的事例,因此会执行第27行至41行中类的构造函数。它也会把新窗口放到屏幕上。<br>
  第27至41实现了窗口的构造函数。该构造函数实际是建立了窗口,然后在其中建立一个静态文本控制。<br>
  要注意的是,在该程序中没有 main 或 WinMain 函数,也没有事件循环。然而我们从上一讲在执行中知道它也处理了事件。窗口可以最大或最小化、移动窗口等等。所有这些操作都隐藏在主应用程序类 CWinApp 中,并且我们不必为它的事件处理而操心,它都是自动执行、在 MFC 中不可见的。<br>
  下一节中,将详细介绍程序的各部分。你可能不能马上全都理解得很好: 但你最好先读完它以获得第一印象。在下一讲中,会介绍一些特殊的例子,并偶把各片段组合在一起,有助于你能更好的理解。<br>
  程序对象<br>
  用 MFC 建立的每个应用程序都要包括一个单一从 CWinApp 类继承来的应用程序对象。该对象必须被说明成全局的(第10行),并且在你的程序中只能出现一次。<br>
  从 CWinApp 类继承的对象主要是处理应用程序的初始化,同时也处理应用程序主事件循环。CWinApp 类有几个数据成员和几个成员函数。在上面的程序中,我们只重载了一个 CWinApp 中的虚拟函数 InitInstance。<br>
  应用程序对象的目的是初始化和控制你的程序。因为 Windows 允许同一个应用程序的多个事例在同时执行,因此 MFC 把初始化过程分成两部分并使用两个函数 InitApplication 和 InitInstance 来处理它。此处,我们只使用了一个 InitInstance 函数,因为我们的程序很简单。当每次调用应用程序时都会调用一个新的事例。第3至8行的代码建立了一个称为 CHelloApp 的类,它是从 CWinApp 继承来的。它包含一个新的 InitInstance 函数,是从 CWinApp 中已存在的函数(不做任何事情)重载来的:<br>
  3 // Declare the application class<br>
  4 class CHelloApp : public CWinApp<br>
  5 {<br>
  6 public:<br>
  7 virtual BOOL InitInstance();<br>
  8 };<br>
  在重载的 InitInstance 函数内部,第18至26行,程序使用 CHelloApp 的数据成员 m_pMainWnd 来建立并显示窗口:<br>
  18 // The InitInstance function is called each<br>
  19 // time the application first executes.<br>
  20 BOOL CHelloApp::InitInstance()<br>
  21 {<br>
  22 m_pMainWnd = new CHelloWindow();<br>
  23 m_pMainWnd->ShowWindow(m_nCmdShow);<br>
  24 m_pMainWnd->UpdateWindow();<br>
  25 return TRUE;<br>
  26 }<br>
  InitInstance 函数返回 TRUE 表示初始化已成功的完成。如果返回了FALSE,则表明应用程序会立即终止。在下一节中我们将会看到窗口初始化的详细过程。<br>
  当应用程序对象在第10行建立时,它的数据成员(从 CWinApp 继承来的) 会自动初始化。例如,m_pszAppName、m_lpCmdLine 和 m_nCmdShow 都包含有适当的初始化值。你可参见 MFC 的帮助文件来获得更详细的信息。我们将使用这些变量中的一个。<br>
  窗口对象<br>
  MFC 定义了两个类型的窗口: 1) 框架窗口,它是一个全功能的窗口,可以改变大小、最小化、最大化等等; 2) 对话框窗口,它不能改变大小。框架窗口是典型的主应用程序窗口。<br>
  在下面的代码中,从 CFrameWnd 中继承了一个新的类 CHelloWindow:<br>
  11 // Declare the main window class<br>
  12 class CHelloWindow : public CFrameWnd<br>
  13 { <br>
  14 CStatic* cs;<br>
  15 public:<br>
  16 CHelloWindow();<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -