多个事例在同时执行,因此MC把初始化过程分成两部分并使用两个函数 InitApplication 和 InitInstance来处理它。此处,我们只使用了一个 InitInstance函数,因为我们的程序很 简单。当每次调用应用程序时都会调用一个新的事例。第3至8行的代码建立了一个称为 CHelloApp的类,它是从 CWinApp继承来的。它包含一个新的 InitInstance函数,是从 CWinApp中已存在的函数(不做任何事情)重载来的 3// Declare the application class 4 class CHelloApp: public CWinApp 5{ 6 public virtual BOOL Initlnstance( 8}; 在重载的 InitInstance函数内部,第18至26行,程序使用 CHelloApp的数据成员 m pAin Wnd来建立并显示窗口 18//The InitInstance function is called each 19//time the application first executes 20 BOOL CHelloApp: InitInstanceo 21{ 22 m pMainWnd =new CHello Window 23 m pMain Wnd->Show Window(m nCmdShow) 24 m pLain Wnd->Update window( 25 return TRUE 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 CHello window: public CFrame Wnd 13{ 14 CStatic* cs abl 16 CHello Window (; 它包括一个新的构造函数,同时还有一个指向程序中所使用的唯一用户界面控制的数据 成员。你多建立的每个应用程序在主窗口中都会有唯一的一组控制。因此,继承类将有一个 重载的构造函数以用来建立主窗口所需要的所有控制。典型情况下,该类会包含有一个析构 函数以便在窗口关闭时来删除他们。我们这里没有使用析构函数。在第四讲中,我们将会看 到继承窗口类也会说明一个消息处理函数来处理这些控制在响应用户事件所产生的消息
多个事例在同时执行,因此 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 mAin Wnd成员变量来指向主窗口。为了建立该程序的主窗口, InitInstance 函数(第18至26行建立了一个 CHellowindow事例,并使用 m pLain Wnd来指向一个新 的窗口。我们的 CHello window对象是在第22行建立的 8//The InitInstance function is called each 19 //time the application first executes 20 BOOL CHelloApp: InitInstanceo 21{ 22 m pMainWnd =new CHello Window 23 m pMain Wnd->Show Window(m nCmdShow) n p Main Wnd->Upc 25 return TRUE 只建立一个简单的框架窗口是不够的。还要确保窗口能正确地出现在屏幕上。首先,代 码必须要调用窗口的 Show window函数以使窗口出现在屏幕上第23行)。其次,程序必须 要调用 Update Window函数来确保窗口中的每个控制和输出能正确地出现在屏幕上(第24 行)。 你可能奇怪, Showwindow和 Update Window函数是在哪儿定义的。例如,如果你要 查看以便了解它们,你可能要查看MFC的帮助文件中的 CFrameWnd定义部分。但是 CFrameWnd中并不包含有这些成员函数。 CFrameWnd是从CWnd类继承来的。你可以查 看MC文档中的CWnd,你会发现它包含有200多个不同的成员函数。显然,你不能在 几分钟内掌握这些函数,但是你可以掌握其中的几个,如 Show window和 Update Window 现在让我们花几分钟来看一下MFC帮助文件中的CWnd: Show Window函数。为此 你你可以单击帮助文件中的 Search按钮,并输入“ Show window”。找到后,你会注意到, Show window只有一个参数,你可以设置不同的参数值。我们把它设置成我们程序中 CHelloApp的数据成员变量 m nCmdShow(第23行)。 m nCmdShow变量是用来初始化应 用程序启动的窗口显示方式的。例如,用户可能在程序管理器中启动应用程序,并可通过应 用程序属性对话框来告知程序管理器应用程序在启动时要保持最小化状态。 m ncmdShow 变量将被设置成 SW SHOWMINIMIZED,并且应用程序会以图标的形式来启动,也就是说 程序启动后,是一个代表该程序的图标。 m nCmdShow变量是一种外界与应用程序通讯的 方式。如果你愿意,你可以用不同的 m ncmdShow值来试验 Show Window的效果。但要 重新编译程序才能看到效果 第22行是初始化窗口。它为调用new函数分配内存。在这一点上,程序在执行时会 调用 CHello window的构造函数。该构造函数在每次带类的事例被分配时都要调用。在窗口 构造函数的内部,窗口必须建立它自己。它是通过调用 FRame Wnd的 Create成员函数来 实现的(第31行) 27 // The constructor for the window class 28 CHello Window: CHello window o / Create the window itself 31 Create(NULL, Hello World 33 WS OVERLAPPEDWINDOW CRect0,0,200,200)
典型地,一个应用程序将有一个主应用程序窗口。因此,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));