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

📄 visual c++ mfc 简明教程(4-2).txt

📁 MFC简明教程
💻 TXT
📖 第 1 页 / 共 2 页
字号:

    首先,该程序包含了头文件 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 的帮助文件来获得更详细的信息。我们将使用这些变量中的一个。

窗口对象
    MFC 定义了两个类型的窗口: 1) 框架窗口,它是一个全功能的窗口,可以改变大小、最小化、最大化等等; 2) 对话框窗口,它不能改变大小。框架窗口是典型的主应用程序窗口。

    在下面的代码中,从 CFrameWnd 中继承了一个新的类 CHelloWindow: 

11 // Declare the main window class
12 class CHelloWindow : public CFrameWnd
13 { 
14     CStatic* cs;
15     public:
16     CHelloWindow();
17 };
    它包括一个新的构造函数,同时还有一个指向程序中所使用的唯一用户界面控制的数据成员。你多建立的每个应用程序在主窗口中都会有唯一的一组控制。因此,继承类将有一个重载的构造函数以用来建立主窗口所需要的所有控制。典型情况下,该类会包含有一个析构函数以便在窗口关闭时来删除他们。我们这里没有使用析构函数。在第四讲中,我们将会看到继承窗口类也会说明一个消息处理函数来处理这些控制在响应用户事件所产生的消息。

    典型地,一个应用程序将有一个主应用程序窗口。因此,CHelloApp 应用程序类定义了一个名为 m_pMainWnd 成员变量来指向主窗口。为了建立该程序的主窗口,InitInstance 函数(第18至26行)建立了一个 CHelloWindow 事例,并使用 m_pMainWnd 来指向一个新的窗口。我们的 CHelloWindow 对象是在第22行建立的: 

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 }
    只建立一个简单的框架窗口是不够的。还要确保窗口能正确地出现在屏幕上。首先,代码必须要调用窗口的 ShowWindow 函数以使窗口出现在屏幕上(第23行)。其次,程序必须要调用 UpdateWindow 函数来确保窗口中的每个控制和输出能正确地出现在屏幕上(第24行)。

    你可能奇怪,ShowWindow 和 UpdateWindow 函数是在哪儿定义的。例如,如果你要查看以便了解它们,你可能要查看 MFC 的帮助文件中的 CFrameWnd 定义部分。但是 CFrameWnd 中并不包含有这些成员函数。CFrameWnd 是从 CWnd 类继承来的。你可以查看 MFC 文档中的 CWnd,你会发现它包含有200多个不同的成员函数。显然,你不能在几分钟内掌握这些函数,但是你可以掌握其中的几个,如 ShowWindow 和UpdateWindow。

    现在让我们花几分钟来看一下 MFC 帮助文件中的 CWnd::ShowWindow 函数。为此,你你可以单击帮助文件中的 Search 按钮,并输入“ShowWindow”。找到后,你会注意到,ShowWindow 只有一个参数,你可以设置不同的参数值。我们把它设置成我们程序中 CHelloApp 的数据成员变量 m_nCmdShow (第23行)。m_nCmdShow 变量是用来初始化应用程序启动的窗口显示方式的。例如,用户可能在程序管理器中启动应用程序,并可通过应用程序属性对话框来告知程序管理器应用程序在启动时要保持最小化状态。m_nCmdShow 变量将被设置成 SW_SHOWMINIMIZED,并且应用程序会以图标的形式来启动,也就是说,程序启动后,是一个代表该程序的图标。m_nCmdShow 变量是一种外界与应用程序通讯的方式。如果你愿意,你可以用不同的 m_nCmdShow 值来试验 ShowWindow 的效果。但要重新编译程序才能看到效果。

    第22行是初始化窗口。它为调用 new 函数分配内存。在这一点上,程序在执行时会调用CHelloWindow的构造函数。该构造函数在每次带类的事例被分配时都要调用。在窗口构造函数的内部,窗口必须建立它自己。它是通过调用 CFrameWnd 的 Create 成员函数来实现的(第31行): 

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));
    建立函数共传递了四个参数。通过查看 MFC 文档,你可以了解不同类型。NULL 参数表示使用缺省的类名。第二个参数为出现在窗口标题栏上的标题。第三个参数为窗口的类型属性。该程序使用了正常的、可覆盖类型的窗口。在下一讲中将详细介绍类型属性。第四个参数指出窗口应该放在屏幕上的位置和大小,左上角为(0,0), 初始化大小为 200×200个象素。如果使用了 rectDefault,则 Windows 会为你自动放置窗口及大小。

    因为我们的程序太简单了,所以它只在窗口中建立了一个静态文本控制。见第35至40行。下面将详细介绍。

静态文本控制
    程序在从 CFrameWnd 类中继承 CHelloWindow 类时(第11至17行)时,说明了一个成员类型 CStatic及其构造函数。

    正如在前面所见到的,CHelloWindow 构造函数主要做两件事情。第一是通过调用Create函数(第31行)来建立应用程序的窗口。然后分配和建立属于窗口的控制。在我们的程序中,只使用了一个控制。在 MFC 中建一个对象总要经过两步。第一是为类的事例分配内存,然后是调用构造函数来初始化变量。下一步,调用 Create 函数来实际建立屏幕上的对象。代码使用这两步分配、构造和建立了一个静态文本对象(第36至40行): 

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 }
    CStatic 构造函数是在为其分配内存时调用的,然后就调用了 Create 函数来建立 CStatic 控制的窗口。Create 函数所使用的参数与窗口建立函数所使用的参数是类似的(第31行)。第一个参数指定了控制中所要显示的文本内容。第二个参数指定了类型属性。类型属性在下一讲中将详细介绍。在次我们使用的是子窗口类型(既在别的窗口中显示的窗口),还有它是可见的,还有文本的显示位置是居中的。第三个参数决定了控制的大小和位置。第四参数表示该子窗口的父窗口。已经建立了一个静态控制,它将出现在应用程序窗口上,并显示指定的文本。

结论
    第一次浏览该代码,也可能不是很熟悉和有些让人烦恼。但是不要着急。从程序员的观点来看,整个程序的主要工作就是建立了 CStatic 控制(36至40行)。在下一讲中,我们详细向你介绍36至40行代码的含义,并可看到定制 CStatic 控制的几个选项。

 

⌨️ 快捷键说明

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