6.3 技术总结 在上一章和本章中,读者已经接触和使用了各种控件。这些控件虽然五花八门,但它们却具有一些共同的特点。本节的目的就是讨论这些共同点,以使读者能在概念上更好地理解控件。 6.3.1 所有的控件都是窗口 确切地说,所有的控件都是子窗口。控件窗口都具有WS_CHILD风格,它们总是依附于某一个父窗口。所有MFC的控件类都是基本窗口类CWnd的直接或间接派生类,这意味着可以调用CWnd类的某些成员函数来查询和设置控件。常用于控件的CWnd成员函数在表6.34列出,这些函数对所有的控件均适用。 表6.34 常用于控件的CWnd成员函数
例如,如果想把一个编辑框控件隐藏起来,可以用下面这行代码完成. m_MyEdit.ShowWindow(SW_HIDE); 6.3.2 控件的创建方法 控件的创建有自动和手工两种常用方法. 控件的自动创建是通过向对话框模板中添加控件实现的.到目前为止,读者所使用的控件都是用这种方法创建的.当调用对话框类的DoModal和Create显示对话框时,框架会根据对话框模板资源提供的控件信息自动地创建控件.这种方法的优点是方便直观,用户可以在对话框模板编辑器的控件面板中选择控件,可以在对话框模板中调整控件的位置和大小,还可以通过属性对话框设置控件的风格. 手工创建控件是一种比较专业的方法,包括下面两步:
清单6.3是一个手工创建控件的实例. 清单6.3 控件的手工创建 #define ID_EXTRA_EDIT 100
class CMyDialog : public CDialog { protected: CEdit m_edit; // Embedded edit object public: virtual BOOL OnInitDialog(); }; . . . . . . BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); CRect rect(85, 110, 180, 210);
m_edit.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | WS_BORDER, rect, this, ID_EXTRA_EDIT); m_edit.SetFocus(); return FALSE; } 不难看出,控件的手工创建是在程序中通过控件对象完成的,与对话框模板无关.在Create函数中,需要提供控件的风格,控件的尺寸和位置,控件的ID等信息.手工创建实际上是一种动态创建过程,程序可以在任何时侯根据需要来创建,不一定非要在OnInitDialog中进行. 控件并不是对话框所专有的,某些非对话框窗口也可以拥有控件.如果要在象工具条或状态栏这样的非对话框窗口中创建控件,就必需用手工创建方法.自动创建由于要依赖对话框模板,因此只适用于对话框. 6.3.3 访问控件的方法 控件是一种交互的工具,应用程序需要通过某种方法来访问控件以对其进行查询和设置.访问控件有四种方法:
6.3.4 控件及控件对象的删除 当关闭父窗口时,控件会被自动删除,因此在一般情况下不必操心删除问题.如果由于某种需要想手工删除控件,可以调用CWnd::DestroyWindow来完成. 对于控件对象的删除,有两种情况.若控件对象是以成员变量的形式创建的,那么该对象将会随着父窗口对象的删除而被删除,因此在程序中无需操心.若控件对象是用new操作符在堆中创建的,则必需在关闭父窗口时用delete操作符删除对象,这是因为所有MFC的控件类都是非自动清除的(参见5.4.2). 6.3.5 控件通知消息 传统控件和Win32 控件采用了不同的通知消息机制,请参见6.1.1和6.2.1。
|