静态控件一般用来显示静态的文本、图标、位图或图元文件,它不能用来接受用户的输入,也很少用来显示输出,而在更多的情况下用作那些没有固定的标题文本属性的控件(如文本编辑控件、列表框等)的标签,或者用来进行控件的分组,或者用来显示一些提示性文本。
MFC类CStatic封装了标准的Windows静态控件。下面的示例程序StaticDemo演示了静态控件的使用。
1. 使用AppWizard创建一个基于对话框的MFC应用程序,设置其工程名为StaticDemo。
2. 绘制主对话框中的控件标签为“静态控件”的静态控件ID为IDC_STATIC。需要注意是的,由资源管理器添加的静态控件在默认情况下其ID均为IDC_STATIC,因此,如果需要在程序中区分和操纵各个不同的静态控件,一般情况下我们都需要更改新添加的静态控件的ID值。这里我们将静态控件的ID值设置为IDC_STATICDEMO。
以下属性和样式没有在本章前面的内容中涉及,它们可以适用于静态控件。可以通过静态控件的Properties属性对话框的Styles选项卡进行这些属性或样式的设置。
Align text: | 决定静态文本控件中文本的横向对齐方式。可供选择的值为Left (向左对齐)、Center (居中对齐)和Right (向右对齐)。默认值:Left |
Center Vertically: | 在静态文本控件中将文本进行垂直居中。类型:布尔值 默认值:假 |
No prefix: | 不将控件文本中的“&”符解释为助记字符。在默认情况下,“&”符号在显示时会被去掉,取而代之的是紧接“&”符之后的字符被以加下划线的格式进行显示。我们早在前面说过,通过双写“&”符可以在控件文本中显示出实际的“&”符,但是,对于一些特殊的场合,如使用静态文本控件来显示文件名的时候,将No prefix属性设置为“真”要更方便。 |
No wrap: | 以左对齐的方式来显示文本,并且不进行文本的自动回行。超出控件右边界的文本将被裁去。需要注意的是,这时即使使用转义字符序列"\n"也不可以强制控件文本进行换行。类型:布尔值 默认值:假 |
Simple: | 禁止设置Text Align属性和No Wrap样式。在该属性为真的情况下,静态文本控件中的文本不会被自动回行,也不会被剪裁。类型:布尔值 默认值:假 |
Notify: | 决定控件在被单击时是否通知父窗口。类型:布尔值 默认值:假 |
Sunken: | 使用静态文本控件看上去有下凹的感觉。类型:布尔值 默认值:假 |
Border: | 为文本控件创建边框。类型:布尔值 默认值:假 |
4. 静态控件一般不用于输入,但是如果它的Notify属性设置为真,则当用户单击静态控件时,静态控件将向父窗口发送通知消息。但是,我们不可以使用前面所讲述的方法(即使用ClassWizard或从上下文菜单中选择Events命令)来为静态控件添加消息处理函数。而要以手动的方式来实现这一点。
下面我们结合示例StaticDemo来说明如何为静态控件添加单击事件的命令处理程序。在进行下面的步骤之前,请确认静态控件IDC_STATICDEMO的Notify属性值为真。
在类CStaticDemoDlg的定义处(CStaticDemoDlg.h)添加下面的命令处理函数声明:
afx_msg void OnStaticDemo();
最好把成员函数OnStaticDemo的声明与其它命令处理函数的声明放在一起,但不要放到//{{AFX_MSG和//}}AFX_MSG之间。
然后,打开类CStaticDemoDlg的实现文件StaticDemoDlg.cpp,在宏
BEGIN_MESSAGE_MAP(CStaticDemoDlg, CDialog)
和宏
BEGIN_MESSAGE_MAP
之间添加如下的消息映射入口:
ON_BN_CLICKED(IDC_STATICDEMO, OnStaticDemo)
同样,不要把手动添加的消息映射入口项放到注释//{{AFX_MSG_MAP和//}}AFX_MSG_MAP之间。
手动添加成员函数OnStaticDemo或OnDoubleclickedStaticDemo的实现代码:
编译上面的示例程序,单击“静态控件”,命令处理函数OnStaticDemo将被调用,从而弹出相应的消息框。