通过编写串口助手工具学习MFC过程
因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉。这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅。做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然。另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008)
(六)添加Edit编辑框控件
属性说明:
Auto HScroll 设置True当编辑框输入的文字大于边框时自动水平方向增加。
Auto VScroll 设置True就可以实现每一行填满后自动换行了。
Vetrical Scroll属性设置为True,当输入或显示超过编辑框的大小后就会出现垂直滚动条。
Multiline 属性设置为True,多行使能,当编辑框输入的文字大于边框时可以向下换行。
ReadOnly 设置True只能显示和读取,不能做为输入编辑,可以使用SetWindowText显示。
添加控件、修改属性ID和增加变量部分略,参见按按钮部分。
1、Edit的基本功能:
SetWindowText()设置文本显示
GetWindowText()获取文本显示
这两个函数是API函数,多数控件均支持这两个函数。
2、实现特殊功能:自动换行,垂直滚动条自动下移
(1)将其Multiline属性设置为True,Auto HScroll属性设置False,Auto VScroll属性设置True,这样就可以实现每一行填满后自动换行了(Auto VScroll设置成Faile也可以实现 )。
(2)再将Vetrical Scroll属性设置为True,当输入或显示超过编辑框的大小后就会出现垂直滚动条。
(3)如果是输入,滚动条会自动移动跟随到当前输入行,但是如果是设置将很多内容一次性让编辑框显示,滚动条就会一直处于最上方,需要手动拉到最下面才能看见最后一行的内容,在很多时候这是我们不需要的,而是想要滚动条处于最下方,如下的代码将实现这一功能:
this->SetDlgItemTextW(IDC_ALLMSG_SHOW,allMsg);//将allMsg内容显示到ID为IDC_ALLMSG_SHOW的编辑框
m_showmsg.LineScroll(m_showmsg.GetLineCount());//m_showmsg为该编辑框的control变量名
(使用控件变量的一些成员函数设置滚动条的位置)
这个功能实现方法,以上内容 引用:http://blog.sina.com.cn/s/blog_5d2bad130100sysh.html
本例中实现显示的方法是SetWindowText。
m_EditRXData.SetWindowText(pCComSer->m_strRXData); //显示接收
m_EditRXData.LineScroll(m_EditRXData.GetLineCount());//EditRXData为该编辑框的control变量名(使用控件变量的一些成员函数设置滚动条的位置)
CEdit::LineScroll
void LineScroll(int nLine,int nChars = 0);
参数:
nLine |
指定纵向滚动的行数。 |
nChars |
指定水平滚动的字符数。如果编辑控件使用ES_RIGHT或ES_CENTER风格,此值无效。 |
说明:
调用此成员函数滚动多行编辑控件的文本。
此成员函数仅用于多行编辑控件。
编辑控件的纵向滚动不能超过该文本的最后一行,如果当前行号加上由nLines指定的行数超过编辑控件中的总行数,则它的值被调整而使得文本的最后一行滚动达到编辑控件窗口的顶端。
此函数可以水平滚动经过每行的最后一个字符。
3、实现特殊功能:限定Edit输入指定内容的代码
Update事件和 change事件都可以
void CserialtestDlg::OnEnUpdateEdit1()
{
// TODO: 如果该控件是RICHEDIT 控件,它将不
// 发送此通知,除非重写CDialog::OnInitDialog()
// 函数,以将EM_SETEVENTMASK 消息发送到该控件,
// 同时将ENM_UPDATE 标志“或”运算到lParam 掩码中。
// TODO: 在此添加控件通知处理程序代码
/*
CString strTemp=_T("");
edit1.GetWindowText(strTemp);
int len = strTemp.GetLength();
for (int i = 0; i < len; i ++)
{
if(strTemp.GetAt(i) <‘0‘ || strTemp.GetAt(i) > ‘9‘)
{
strTemp = strTemp.Left(i);
edit1.SetWindowText(strTemp);
edit1.SetSel(i,i,TRUE);
AfxMessageBox(_T("输入数字不对!"));
return;
}
}
*/
}
void CserialtestDlg::OnEnChangeEdit1()
{
// TODO: 如果该控件是RICHEDIT 控件,它将不
// 发送此通知,除非重写CDialog::OnInitDialog()
// 函数并调用CRichEditCtrl().SetEventMask(),
// 同时将ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString strTemp=_T("");
TCHAR TxTmp ;
edit1.GetWindowText(strTemp);
int len = strTemp.GetLength();
for (int i = 0; i < len; i ++)
{
TxTmp = strTemp.GetAt(i);
if((TxTmp>=_T(‘0‘) && TxTmp <= _T(‘9‘))|| (TxTmp>=_T(‘a‘) && TxTmp <= _T(‘f‘)) \
|| (TxTmp>=_T(‘A‘) && TxTmp <= _T(‘F‘)) || (TxTmp == _T(‘ ‘)))
{
;
}
else
{
//strTemp = strTemp.Left(i); // 从左取字串
strTemp.Delete(i,1); //现在还不太完善
m_EditTXData.SetWindowText(strTemp);
m_EditTXData.SetSel(i,i,TRUE);
AfxMessageBox(_T("请输入正确格式0-9 a-f A-F!"));
return;
}
}
}
这两个函数的实现方法完全一样,只是不同的事件类型,一个是update更新事件,一个是change改变事件,这两个事件均能实现,任选其一。
函数实现方法是从编辑框中获取文本内容,逐个字符检查是否是数字(此功能用于发送16进制数字时,禁止输入非数字的字符),检测到此字符后,将这个字符删除,并重新显示剩下的字符串,并设置编辑框中光标位置。
此函数中涉及了几个字符串CString类型的操作,这个是VC中的数据类型,相关操作请参考API,以后也会直接介绍。在VC操作中用这个类型操作字符串还是比较方便的,类似于JAVA的String类型。这里简单介绍一下这里用到的几个函数。
TCHAR TxTmp ;//TCHAR 与环境有关,Unicode字符集是Wchar,多字节字符集是char类型
CString strTemp=_T(""); //初始化 strTemp为空字符串。
int len = strTemp.GetLength(); //获取字符串的长度。不包含结尾的空字符。
TxTmp = strTemp.GetAt(i);
TCHAR GetAt( int nIndex ) const;
返回下标为nIndex的字符,与字符串的[]用法相同
strTemp = strTemp.Left(i); // 从左取字串 ,此句在此处的功能是,如在字符串的中间修改一个字符或插入一个字符不是数字的,从这个字符到后面的字符串都将删除,显然不够合理。
strTemp.Delete(i,1); //现在还不太完善
int Delete( int nIndex, int nCount = 1 )
删除字符,删除从下标nIndex开始的nCount个字符。
此句在此处的功能是从字符串中间删除一个字符,如果插入一个不是数字的字符,直接将此字符删除,但如果修改字符串中的一个字符使之成为非数字字符,直接将此字符删除,这样原来存在的字符也就删除了,虽然比上面的函数稍好一些,但也不是十分完美。
m_EditTXData.SetSel(i,i,TRUE); //将光标位置置于插入字符处
CEdit::SetSel
void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE);
void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = False);
参数:
dwSelection |
低位字指定起始位置,高位字为结束位置。如果低位为0,高位为-1,则编辑控件中的全部文本被选中;如果低位字为-1,则任何当前选定内容被去掉选定状态。 |
bNoScroll |
指示是否显示脱字符是滚动可见的。如果值为FALSE,则显示,TRUE不显示。 |
nStartChar |
指出当前选中部分的开始位置。如果nStartChar=0且nEndChar=-1,则编辑控件的文本被全选;如果nStartChar=-1,则任何当前选定内容被去掉选定状态。 |
nEndChar |
指出结束位置。 |
说明:
调用此成员函数在一个编辑控件中选择一定范围的字符。
AfxMessageBox(); MFC中的函数 ,弹出信息框用于显示。与WIN32 API的MessageBox()有些区别,具体可查寻相关资料。