CBN_EDITCHANGE和EN_CHANGE的区别
CEdit类提供了Windows编辑控件中的功能。编辑控件是一个子窗口矩形,用户可以向其中输入文本;
CComboBox类封装了Windows组合框。组合框由一个列表框和一个静态控件(或编辑控件)组成。
在这两个类中都有EditChange的控件事件,分别是编辑框的EN_CHANGE事件和CBN_EDITCHANGE事件,这两个事件有所区别,下面逐一介绍。
EN_CHANGE
这个消息指示用户对编辑框控件进行了一些操作,这个操作会引发编辑框中内容发生变化。在Edit控件中这个操作可以是外部的,比如用户输入文字;也可以是内部的,比如使用SetWindowText函数。这些行为都会使编辑框控件向父窗口发出EN_CHANGE消息,我们可以父窗口类中响应这些控件事件。
Edit实例1
我们创建一个这样的对话框,如下图所示;在对话框上有一个组框,由一个编辑框控件和三个RADIO按钮控件组成,根据编辑框输入的后缀名不同,RADIO控件所代表的格式就被选中。
具体代码如下:
BEGIN_MESSAGE_MAP(CExtensionShowDlg, CDialog)
//父窗口响应控件事件
ON_EN_CHANGE(IDC_EDIT_FILE_NAME, &CExtensionShowDlg::OnUpdateFileFormat)
END_MESSAGE_MAP()
/****************************************************************
*函数名称:
*功 能:对话框初始状态设置
*作 者:Jin
*日 期:2017年3月18日
****************************************************************/
BOOL CExtensionShowDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//修改编辑框内容,发送EN_CHANGE控件事件,来自内部的
m_editFileName.SetWindowText("ExtensionShow.txt");
// TODO: 在此添加额外的初始化
return TRUE;
}
/****************************************************************
*函数名称:
*功 能: 响应EN_CHANGE控件事件
*作 者:Jin
*日 期:2017年3月18日
****************************************************************/
void CExtensionShowDlg::OnUpdateFileFormat()
{
CString strFileName = _T("");
m_editFileName.GetWindowText(strFileName);
CString strFileExt = PathFindExtension(strFileName);
//根据文件名格式的变化,相应的选中Button控件按钮
if (0 == strFileExt.CompareNoCase(".doc"))
{
CheckDlgButton(IDC_RADIO_DOC,TRUE);
CheckDlgButton(IDC_RADIO_TXT,FALSE);
CheckDlgButton(IDC_RADIO_CPP,FALSE);
}
else if (0 == strFileExt.CompareNoCase(".cpp"))
{
CheckDlgButton(IDC_RADIO_DOC,FALSE);
CheckDlgButton(IDC_RADIO_TXT,FALSE);
CheckDlgButton(IDC_RADIO_CPP,TRUE);
}
else
{
CheckDlgButton(IDC_RADIO_DOC,FALSE);
CheckDlgButton(IDC_RADIO_TXT,TRUE);
CheckDlgButton(IDC_RADIO_CPP,FALSE);
}
}
运行结果:
CBN_EDITCHANGE
CBN_EDITCHANGE事件和EN_CHANGE事件都是指明编辑框中的文本发生了变化,控件向父窗口发送的对应的控件事件。而combobox控件的editchange只会响应外部用户的输入,对内部修改编辑框内容,不会向父窗口发送change事件。
如果我们将上述的编辑框控件修改为combobox控件,用户外部编辑可以引发CBN_EDITCHANGE事件,从而改变Radio Button控件的状态;若代码中还是使用SetWindowText方式来修改编辑框的内容,在combobox控件中间不会生效。想达到同样的效果,则需要模拟发送CBN_EDITCHANGE消息才行。可以参考这个文章:模拟鼠标点击