静态文本框、命令按钮和编辑框是Windows应用程序中最基本的控件。静态文本框是CStatic类的对象,命令按钮是CButton类的对象,编辑框是CEdit类的对象。这三个类都是从CWnd类直接派生来的,具有CWnd类的全部功能。
1、静态文本框
静态文本框(Static Text)是最简单的控件。它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。
静态文本框的重要属性有:
- ID :所有静态文本框的缺省 ID 都是 IDC_STATIC ,因为其最后为STATIC,所以需要重置,否则无法添加变量。
- 标题:需要显示的文本信息是在这里设置的。
- 边框:可以对属性对话框中的Sunken,Static Edge属性进行设置。
添加变量后,将会在对话框类的DoDataExchange()函数内实现变量和控件的关联。
常用成员函数有:
//设置静态文本内容
setWindowTextW(TEXT("测试"));
//获取文本内容
CString tmp;
GetWindowTextW(tmp);
静态文本框也可以显示图片,必须为位图(*.bmp):
//设置静态控件窗口风格为位图居中显示,第一个参数为非零值即可
m_label.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);
//通过路径获取bitmap句柄
#define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION)
//宽高应该按照控件的大小设置
CRect rect;
m_label.GetWindowRect(rect);
//静态控件设置bitmap
m_label.SetBitmap(HBMP(TEXT("./1.bmp"), rect.Width, rect.Height));
2、命令按钮
命令按钮(Button)是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。
常用成员函数:
//设置静态文本内容
setWindowTextW(TEXT("测试"));
//获取文本内容
CString tmp;
GetWindowTextW(tmp);
//设置按钮是否使能
EnableWindow(FALSE);
另外CDialog::OnOK()及CDialog::OnCancel()均能退出当前对话框。
在对话框的OnInitDialog函数最后添加如下代码,可以实现位图按钮的功能:
// 获取位图资源句柄
HBITMAP hBitmap = LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1));
//按钮添加位图资源
m_btn.SetBitmap(hBitmap);
//将按钮设置成与位图同样大小
m_btn.MoveWindow(10, 10, 66, 77);
另外还需注意,在按钮上显示位图,需要将按钮的Bitmap属性设置为TRUE
3、编辑框
编辑框(Edit Control)的属性主要在 Styles 选项卡中设置。重要属性有:
- Multiline :定义该编辑框为多行文本框。
- Number :限定输入的字符只能是数字字符。
- Border :为控件创建边界。
- Read-only :编辑框成为只读的,禁止用户编辑
- Password:是否为密码框
- Want return:是否接收回车键,为false的话,按回车键将会退出程序
- 【Vertical scroll】和【Auto Vscroll】 属性设置为True,编辑框将出现垂直滚动条。
- Auto VScroll(在多行控件中,当用户在最后一行按下ENTER键时自动向上滚动文本),设置为True
编辑框常用的成员函数见表:
成员函数 | 功能 | 应用实例 |
SetSel(n, m) | 选定编辑框中从第n个字符到底m个字符的内容。SetSel(0, -1)的作用是选定所有的内容。 | m_e.SetSel(0, -1) |
Copy() | 将编辑框中当前选定的内容复制到剪贴板 | m_e.Copy() |
Cut() | 将编辑框中当前选定的内容剪切到剪贴板 | m_e.Cut() |
Clear() | 删除编辑框中当前选定的内容 | m_e.Clear() |
Paste() | 把剪贴板中的内容粘贴到编辑框中光标所在的位置 | m_e.Paste() |
GetLine(n, ch) | 将多行编辑框中的第n行的内容复制到ch中。ch为一般的字符数组。 | TCHAR ch[80]; m_e.GetLine(0, ch); |
ReplaceSel(ch) | 将ch中的内容替换编辑框中选定的内容 | TCHAR ch[80] = “abcd”; m_e.ReplaceSel(ch); |
Undo() | 撤销编辑框的最后一次操作 | m_e.Undo(); |
此外 编辑框还可以使用 CWnd 类的成员函数。 CWnd 类的重要成员函数有:
//将编辑框 m_e 中的内容复制到 CString 类对象 ch 中。
CString ch;
m_e.GetWindowTextW (ch);
将编辑框 m_e 中的内容最多复制80个字符到字符数组 ch 中。
TCHAR ch[80];
m_e.GetWindowTextW (ch, 80);
//设置编辑框中的内容为“ abcdefg ”
TCHAR ch[20] = "abcdefg";
m_e.SetWindowText(ch);
编辑框在连接变量时,除了要指定变量名之外,还要确定变量类别。变量类别有两个可选择:
- Control,意味着该变量作控件使用,对应的变量类型只能是CEdit,可以使用该控件类的成员函数;
- Value,意味着该变量当作C/C++中普通的变量使用,对应的变量类型有CString、int、double等,可以使用这些数据类型的函数,但是不能使用控件的成员函数。
若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新,如图所示。
- 若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据
- 若变量的值改变了,则应使用语句UpdateData(FALSE) 初始化对话框控件。
知识点补充:
在MFC对话框应用程序中,启动应用程序,默认状态下当我们按下键盘的回车键之后,程序就自动关闭了.如果不想让程序关闭,那么应该怎么办?如果按下ESC键之后想让程序关闭,那么又该怎么办?
当在对话框中按下回车键时,会选择对话框中默认的按钮消息响应函数来处理这一事件,而基类(CDialogEx)的IDOK按钮的默认响应函数(OnOk)的功能就是关闭对话框。因此,我们一但在对话框测试程序中按下回车键,这个对话框就关闭了。
为了屏蔽掉默认的回车键关闭对话框这一功能,应该在对话框子类中重写OK按钮的消息响应函数OnOk。
void CMy04_DlgEditDlg::OnOK()
{
//去掉此行, 子类中不能调用基类的OnOK函数
//CDialogEx::OnOK();
}
或者重写该类的虚函数PreTranslateMessage()也可以实现:
BOOL CMy04_DlgEditDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
//屏蔽Enter键,使之立即返回TURE
if (pMsg->wParam == VK_RETURN)
{
return TRUE;
}
//屏蔽ESC键,使之立即退出
if (pMsg->wParam == VK_ESCAPE)
{
PostQuitMessage(0);
return TRUE;
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}