MFC界面编程基础(11):静态文本框、命令按钮和编辑框

29 篇文章 36 订阅
上一篇:MFC界面编程基础(10):基于对话框的MFC应用程序下一篇:MFC界面编程基础(12):组框、单选按钮和复选框

静态文本框、命令按钮和编辑框是Windows应用程序中最基本的控件。静态文本框是CStatic类的对象,命令按钮是CButton类的对象,编辑框是CEdit类的对象。这三个类都是从CWnd类直接派生来的,具有CWnd类的全部功能。

静态文本框

静态文本框是最简单的控件。它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。
静态文本框的重要属性有:

  • ID :所有静态文本框的缺省 ID 都是 IDC_STATIC ,一般不需要重新设置。
  • 标题:需要显示的文本信息是在这里设置的。
  • 边框:可以对属性对话框中的Sunken,Static Edge属性进行设置。
 //静态文本控件:变量为 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类中实现的所有操作。

  • 实现一个逃跑按钮功能,当鼠标移动到按钮上时,按钮自动移动到窗口其他位置上。
    ①:在对话框窗口上,放置一个按钮
    ②:创建一个CButton类的派生类,在该类中捕获鼠标移动事件。
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);
}
  • 位图按钮实现
    在对话框的OnInitDialog函数最后添加如下代码:
// 获取位图资源句柄
HBITMAP hBitmap = LoadBitmap(AfxGetInstanceHandle(),
 MAKEINTRESOURCE(IDB_BITMAP1));
 
//按钮添加位图资源
m_btn.SetBitmap(hBitmap);

//将按钮设置成与位图同样大小
m_btn.MoveWindow(10, 10, 66, 77);


另外还需注意,在按钮上显示位图,需要将按钮的Bitmap属性设置为TRUE

启用按钮:EnableWindows(TRUE);
禁用按钮:EnableWindows(FALSE);

编辑框

1.属性设置

编辑框的属性主要在 Styles 选项卡中设置。重要属性有:

  • Multiline :定义该编辑框为多行文本框。
  • Number :限定输入的字符只能是数字字符。
  • Border :为控件创建边界。
  • Read-only :编辑框成为只读的,禁止用户编辑。

2.成员函数

编辑框常用的成员函数见表。
在这里插入图片描述
此外 编辑框还可以使用 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); 
  • 设置编辑框中的内容
    形式: void SetWindowText( LPCTSTR lpszString );
    说明: 将 lpszString 中的内容替换编辑框中原有内容,lpszString 是字符数组或字符指针 。
    示例: 设置编辑框中的内容为“ abcdefg ”
TCHAR ch[20] = "abcdefg"; 
m_e.SetWindowText(ch);

3.连接变量

编辑框在连接变量时,除了要指定变量名之外,还要确定变量类别。变量类别有两个可选择:

  • Control,意味着该变量作控件使用,对应的变量类型只能是CEdit,可以使用该控件类的成员函数;

  • Value,意味着该变量当作C/C++中普通的变量使用,对应的变量类型有CString、int、double等,可以使用这些数据类型的函数,但是不能使用控件的成员函数。
    若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新,如图所示。

  • 若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据

  • 若变量的值改变了,则应使用语句UpdateData(FALSE) 初始化对话框控件。
    在这里插入图片描述

注:当在编辑框内输入内容并点击回车就退出,只需要要右键属性->重写->Onok->注释掉里面的代码

【 例 1 】

编写一个如图所示的应用程序。若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。
在这里插入图片描述

新建一个基于对话框的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,要添加的消息类型,选择添加处理程序按钮,按钮对应的消息相应函数添加完毕。
    复制按钮的消息处理函数如下:
    在这里插入图片描述

用同样的方法为“结束”按钮添加 、编写如下的消息处理函数:在这里插入图片描述

【例2】

输入一元二次方程 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();
} 
…………………………………………………………

4.消息处理函数

在编辑框能处理的消息中是最重要的是 EN_CHANGE ,这是编辑框中的文本被修改后发出的消息。
【例】字符串转换程序
转换规则为: 大写字母转换成小写;
将小写字母转换成大写;
换行符和回车符不变;
其余字符转换为“*”
要求:每输入一个字符立即转换

在这里插入图片描述

  • 第1个编辑框连接变量m_e1 (Control )
    属性:
    ①:Multiline 多行,设置为True
    ②:Vertical scroll 垂直滚动条,设置为True
    ③:Auto VScroll(在多行控件中,当用户在最后一行按下ENTER键时自动向上滚动文本),设置为True
    ④:Want return(使多行编辑器接收回车键,表示换行。如果不指定,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭),设置为True。
  • 第2个编辑框连接变量m_e2 (Control )
    属性:
    ①:Multiline 多行,设置为True
    ②:Vertical scroll 垂直滚动条,设置为True
    ③:Auto VScroll(在多行控件中,当用户在最后一行按下ENTER键时自动向上滚动文本),设置为True
    ④:Read-only 设置为True
  • 对第1个编辑框添加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):组框、单选按钮和复选框
  • 2
    点赞
  • 1
    评论
  • 30
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值