2.在MFC下创建一个窗口对象MFC下创建一个窗口对象分两步,首先创建MFC窗口对象,然后创建对应的Windows窗口。在内存使用上,MFC窗口对象可以在栈或者堆(使用new创建)中创建。具体表述如下:创建MFC窗口对象。通过定义一个CWnd或其派生类的实例变量或者动态创建一个MFC窗口的实例,前者在栈空间创建一个MFC窗口对象,后者在堆空间创建一个MFC窗口对象。调用相应的窗口创建函数,创建Windows窗口对象。例如:在前面提到的AppWizard产生的源码中,有CMainFrame(派生于CMDIFrame(SDI)或者CMDIFrameWnd(MDI))类。它有两个成员变量定义如下:CToolBar m_wndToolBar;CStatusBar m_wndStatusBar;当创建CMainFrame类对象时,上面两个MFC Object也被构造。CMainFrame还有一个成员函数OnCreate(LPCREATESTRUCT lpCreateStruct),它的实现包含如下一段代码,调用CToolBar和CStatusBar的成员函数Create来创建上述两个MFC对象对应的工具栏HWND窗口和状态栏HWND窗口:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){…if (!m_wndToolBar.Create(this) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failed to create toolbar\n");return -1; // fail to create}if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status bar\n");return -1; // fail to create}…}关于工具栏、状态栏将在后续有关章节作详细讨论。在MFC中,还提供了一种动态创建技术。动态创建的过程实际上也如上所述分两步,只不过MFC使用这个技术是由框架自动地完成整个过程的。通常框架窗口、文档框架窗口、视使用了动态创建。介于MFC的结构,CFrameWnd和CView及其派生类的实例即使不使用动态创建,也要用new在堆中分配。理由见窗口的销毁(2.2.5节)。至于动态创建技术,将在下一章具体讨论。在Windows窗口的创建过程中,将发送一些消息,如:在创建了窗口的非客户区(Nonclient area)之后,发送消息WM_NCCREATE;在创建了窗口的客户区(client area)之后,发送消息WM_CREATE;窗口的窗口过程在窗口显示之前收到这两个消息。如果是子窗口,在发送了上述两个消息之后,还给父窗口发送WM_PARENATNOTIFY消息。其他类或风格的窗口可能发送更多的消息,具体参见SDK开发文档。3.MFC窗口的使用MFC提供了大量的窗口类,其功能和用途各异。程序员应该选择哪些类来使用,以及怎么使用他们呢?直接使用MFC提供的窗口类或者先从MFC窗口类派生一个新的C++类然后使用它,这些在通常情况下都不需要程序员提供窗口注册的代码。是否需要派生新的C++类,视MFC已有的窗口类是否能满足使用要求而定。派生的C++类继承了基类的特性并改变或扩展了它的功能,例如增加或者改变对消息、事件的特殊处理等。主要使用或继承以下一些MFC窗口类(其层次关系图见图1-1):框架类CFrameWnd,CMdiFrameWnd;文档框架CMdiChildWnd;视图CView和CView派生的有特殊功能的视图如:列表CListView,编辑CEditView,树形列表CTreeView,支持RTF的CRichEditView,基于对话框的视CFormView等等。对话框CDialog。通常,都要从这些类派生应用程序的框架窗口和视窗口或者对话框。工具条CToolBar状态条CStatusBar其他各类控制窗口,如列表框CList,编辑框CEdit,组合框CComboBox,按钮Cbutton等。通常,直接使用这些类。
4.在MFC下窗口的销毁窗口对象使用完毕,应该销毁。在MFC下,一个窗口对象的销毁包括HWND窗口对象的销毁和MFC窗口对象的销毁。一般情况下,MFC编程框架自动地处理了这些。