应用程序对象的目的是初始化和控制你的程序。因为Windows允许同一个应用程序的 多个事例在同时执行,因此MFC把初始化过程分成两部分并使用两个函数InitApplication ,此处 我们只使用了 个Ini 函数 因为我们的程序很 简单。当每次调用应用程序时都会调用 个新的事例。第3至8行的代码建立了 一个称为 CHelloApp的类,它是从CWinApp继承来的。它包含一个新的Initlnstance函数,是从 CWinApp中己存在的函数(不做任何事情)重载来的: 3/Declare the application class 4 class CHelloApp:public CWinApp 6 public: virtual BOOL InitInstance(). 83 函数内部,第18至26行,程序使用CHelloApp的数据成员 m_pMainWnd来建立并显示窗口 18 //The Initlnstance function is called each 19//time the application first executes. 20 BOOL CHelloApp::Initlnstance() 21 m_pMainWnd=new CHelloWindow() 23 m_pMainWnd->ShowWindow(m_nCmdShow): 24 m_pMainWnd->UpdateWindow(); 25 return TRUE; 261 InitInstance函数返回IRUE表示初始化已成功的完成。如果返回了FALSE,则表明 应用程序会立即终止 在下 中我们将会看到窗口初始化的详细过程 当应用程序对象在第10行建立时,它的数据成员(从CWinApp继承米的)会自动初始 化。例如,m_pszAppName、m_IpCmdLine和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 CHellowindowo: 171 它包括一个新的构造函数,同时还有一个指向程序中所使用的唯一用户界面控制的数据 成员。你多建立的每个应用程序在主窗口中都会有唯一的一组控制。因此,继承类将有一个 重载的构造函数以用来建立主窗口所需要的所有控制。典型情况下,该类会包含有一个析构 函数以便在窗口关闭时来删除他们。我们这里没有使用析构函数。在第四讲中,我们将会看
应用程序对象的目的是初始化和控制你的程序。因为 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成员变量来指向主窗口 为了建立该程序的主窗口, 函数(第18至26行)建立了一个CHelloWindow事例,并使用m_pMainWnd来指向一个新 的窗口。我们的CHelloWindow对象是在第22行建立的: 18//The InitInstance function is called each 9∥time the a 21{ 22 m pMainWnd new CHellowindowo: 23 m_pMainWnd->ShowWindow(m_nCmdShow). 24 m_pMainWnd->UpdateWindow(): 25 return TRUE 26, 只建立一个简单的框架窗口是不够的。还要确保窗口能正确地出现在屏幕上。首先,代 码必须要调用窗口的ShowWindow函数以使窗口出现在屏幕上(第23行)。其次,程序必须 要调用UpdateWindow函数来确保窗口中的每个控制和输出能正确地出现在屏幕上(第24 行)。 你可能奇怪,ShowWindo 和UpdateWindow函数是在哪儿定义的。例如,如果你要 查看以便了解它们,你可能要查看MFC的帮助文件中的CFrameWnd定义部分。但是 CFrameWnd中并不包含有这些成员函数。CFrameWnd是从CWnd类继承来的。你可以查 看M正C文档中的CWd,你会发现它包含有200多个不同的成员函数。显然,你不能在 几分钟内掌握这些函数,但是你可以掌握其中的几个,如So w和UpdateWin 现在让我们花几分钟 MFC帮助 件中的 为 你你可以单击帮助文件中的Search按钮,并输入“ShowWindow" 找到后,你会注意到 ShowWindow只有一个参数,你可以设置不同的参数值。我们把它设置成我们程序中 CHelloApp的数据成员变量m nCmdShow(第23行)。m nCmdShow变量是用来初始化应 用程序启动的窗口显示方式的。例如,用户可能在程序管理器中启动应用程序,并可过成 用程序属性对话框来告知程序管理器应用程序在启动时要保持最小化状态 变量将被设置成SW_SHOWMINIMIZED,并且应用程序会以图标的形式来 动,也就是议 程序启动后,是一个代表该程序的图标。n nCmdShow变量是一种外界与应用程序通讯的 方式。如果你愿意,你可以用不同的m_nCmdShow值来试验ShowWindow的效果。但要 重新编译程序才能看到效果。 第)行总初始化窗口。为用v函数分配内在。在这一占上,程序在执行时 调用CHelloWindow的构造函数 该构造函数在每次带类的事例被分配时都要调用。在窗口 构造函数的内部,窗口必须建立它自己。它是通过调用CFrameWnd的Create成员函数米 实现的(第31行): 27//The constructor for the window class 28 CHellowindow CHellowindowo 30//Create the window itsel 31 Create(NULL, 32 "Hello World!", WS OVERLAPPEDWINDOW
到继承窗口类也会说明一个消息处理函数来处理这些控制在响应用户事件所产生的消息。 典型地,一个应用程序将有一个主应用程序窗口。因此,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