上一篇:MFC界面编程基础(10):基于对话框的MFC应用程序 | 下一篇:MFC界面编程基础(12):组框、单选按钮和复选框 |
---|
静态文本框、命令按钮和编辑框是Windows应用程序中最基本的控件。静态文本框是CStatic类的对象,命令按钮是CButton类的对象,编辑框是CEdit类的对象。这三个类都是从CWnd类直接派生来的,具有CWnd类的全部功能。
静态文本框是最简单的控件。它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。
静态文本框的重要属性有:
//静态文本控件:变量为 m.label
//设置静态控件窗口风格为位图居中显示
//第一个参数非零值,第二个参数显示为位图+居中显示
m_label.ModifyStyle(0xf,SS_BITMAP| SS_CENTERIMAGE);
//通过路径获取bitmap句柄
//LoadImage是一种函数,功能是装载图标,光标,或位图.
#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()))
命令按钮是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。
命令按钮的主要属性是标题属性,标题属性用来设置在命令按钮上显示的文本。
命令按钮一般不需要连接变量。
命令按钮处理的最多的消息是:BN_CLICKED 。
思考问题:如果从CButton类派生新类CMyButton,如何与按钮控件关联?
只需要给按钮控件添加一个CMyButton类型的变量,按钮控件就可以使用CMyButton类中实现的所有操作。
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//获取按钮的大小
CRect btnRect;
this->GetWindowRect(&btnRect);
//按钮的宽度
int btnWidth = btnRect.Width();
int btnHeight = btnRect.Height();
//获取父窗口的大小
CRect rect;
GetParent()->GetWindowRect(&rect);
int width = rect.Width();
int height = rect.Height();
//计算新坐标
CPoint pt = point;
//如果计算出的左边跟鼠标当前位置左边相等重新计算
while (pt == point)
{
//产生随机X坐标
pt.x = rand() % (width - btnWidth);
//产生随机y坐标
pt.y = rand() % (height - btnHeight);
}
//将按钮移动到新的位置
MoveWindow(pt.x, pt.y, btnWidth, btnHeight);
CButton::OnMouseMove(nFlags, point);
}
// 获取位图资源句柄
HBITMAP hBitmap = LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1));
//按钮添加位图资源
m_btn.SetBitmap(hBitmap);
//将按钮设置成与位图同样大小
m_btn.MoveWindow(10, 10, 66, 77);
另外还需注意,在按钮上显示位图,需要将按钮的Bitmap属性设置为TRUE
启用按钮:EnableWindows(TRUE);
禁用按钮:EnableWindows(FALSE);
编辑框的属性主要在 Styles 选项卡中设置。重要属性有:
编辑框常用的成员函数见表。
此外 编辑框还可以使用 CWnd 类的成员函数。 CWnd 类的重要成员函数有:.
①:void GetWindowTextW ( CString& ) const;
说明:将编辑框中的内容复制到 CString 类对象 rString 中。
示例:将编辑框 m_e 中的内容复制到 CString 类对象 ch 中。
CString ch;
m_e.GetWindowTextW (ch);
②:int GetWindowTextW ( LPTSTR lpszStringBuf, int nMaxCount ) const;
说明:将编辑框中的内容复制到lpszStringBuf中,最多复制nMaxCount 个字符。lpszStringBuf 是字符数组或字符指针。
示例:将编辑框 m_e 中的内容复制到字符数组 ch 中。
TCHAR ch[80];
m_e.GetWindowTextW (ch, 80);
TCHAR ch[20] = "abcdefg";
m_e.SetWindowText(ch);
编辑框在连接变量时,除了要指定变量名之外,还要确定变量类别。变量类别有两个可选择:
Control,意味着该变量作控件使用,对应的变量类型只能是CEdit,可以使用该控件类的成员函数;
Value,意味着该变量当作C/C++中普通的变量使用,对应的变量类型有CString、int、double等,可以使用这些数据类型的函数,但是不能使用控件的成员函数。
若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新,如图所示。
若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据
注:当在编辑框内输入内容并点击回车就退出,只需要要右键属性->重写->Onok->注释掉里面的代码
编写一个如图所示的应用程序。若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。
新建一个基于对话框的MFC应用程序
放置控件
①:删除原有的控件。
②:放置所需的控件:两个编辑框和两个命令按钮。
方法是:先单击控件工具栏上的控件图标选择所需的控件,然后在对话框设计界面上按住鼠标左键拖拉出所需要的大小后释放。
设置控件属性
选择编辑框控件,在属性面板中对该控件属性进行设置。上面编辑框的属性设置为:
①:【Multiline】设置为True,编辑框中可以输入多行文本。
②:【Vertical scroll】和【Auto Vscroll】 属性设置为True,编辑框将出现垂直滚动条。
③:【Want return】设置为True,控件接收回车键。
下面编辑框属性设置与上面编辑框基本一样,只是可以不设定【Want return】为True。从图中可以看到编辑框的 ID 为 IDC_EDIT1 ,这是该控件的标识。任何一个控件都有一个 ID ,某些函数需要通过 ID 对控件进行操作。
连接变量
为控件连接变量就是为控件起一个名称。每一个控件都是一个对象,调用 MFC 类库中的函数都是通过对象来实现的。为 IDC_EDIT1 连接变量 m_e1 的步骤为:
①:在 IDC_EDIT1 编辑框的右键菜单中选“添加变量”,弹出 “添加成员变量向导”对话框。
②:在“ 添加成员变量向导 ”中,给“ IDC_EDIT1 ”,添加成员变量。
用同样的方法再为 IDC_EDIT2 连接一个变量 m_e2 。
添加并且编写消息处理函数。
本例要求单击“复制”按钮后上面编辑框中的内容复制到下面的编辑框中。也就是说,在程序运行时,在“复制”按钮上发生单击事件后, Windows 向对话框发出了一个 BN_CLICKED 消息, CTESTDlg 类应有一个处理该消息的函数。添加和编写这个消息处理函数的过程是:
①:直接双击“复制”按钮,程序中会自动添加相对应的响应函数。或者在按钮上单击鼠标右键,在右键菜单中单击【类向导】
弹出类向导对话框
选择按钮对应的ID,要添加的消息类型,选择添加处理程序按钮,按钮对应的消息相应函数添加完毕。
复制按钮的消息处理函数如下:
输入一元二次方程 y=ax2 +bx+c 的系数 a 、 b 、 c ,计算并输出两个根 x1 、x2 ,如图所示。
对话框上有5个静态文本框、5个编辑框和2个命令按钮。编辑框按表连接变量,其余控件不需要连接变量。
为了要计算 b2 -4ac 的平方根,需要使用 sqrt() 函数,因此在 TESTDlg.cpp 文件的开始添加了文件包含命令:
#include "math.h" // "计算"按钮的函数 这条要放在最后
…………………………………………………………
void CTESTDlg::OnCalc()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
double a=m_a;
double b=m_b;
double c=m_c;
m_x1=(-b+sqrt(b*b-4*a*c))/(2*a);
m_x2=(-b-sqrt(b*b-4*a*c))/(2*a);
UpdateData(FALSE);
}
// “结束”按钮的函数
…………………………………………………………
void CTESTDlg::OnOk()
{
// TODO: Add your control notification handler code here
//退出当前对话框
CDialog::OnOK(); //OnOK();
//CDialog::OnCancel();
}
…………………………………………………………
在编辑框能处理的消息中是最重要的是 EN_CHANGE ,这是编辑框中的文本被修改后发出的消息。
【例】字符串转换程序
转换规则为: 大写字母转换成小写;
将小写字母转换成大写;
换行符和回车符不变;
其余字符转换为“*”
要求:每输入一个字符立即转换
弹出事件处理程序向导对话框
相应的函数处理如下:
void CTESTDlg::OnChangeEdit1()
{
// TODO: Add your control notification handler code here
TCHAR s[80];
m_e1.GetWindowTextW(s, 80);
for (int i = 0; s[i] != '\0'; i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')
{
//大写转换成小写
s[i] = s[i] + 'a' - 'A';
}
else if (s[i] >= 'a' && s[i] <= 'z')
{
//小写转换成大写
s[i] = s[i] + 'A' - 'a';
}
else if (s[i] == '\n' || s[i] == '\r')
{
//回车符合换行符不变
s[i] = s[i];
}
else
{
//其余字符全部变成*号
s[i] = '*';
}
}
//将转换完成的字符串显示到m_e2中
m_e2.SetWindowTextW(s);
}
上一篇:MFC界面编程基础(10):基于对话框的MFC应用程序 | 下一篇:MFC界面编程基础(12):组框、单选按钮和复选框 |
---|