通过编写串口助手工具学习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()有些区别,具体可查寻相关资料。

通过编写串口助手工具学习MFC过程——(六)添加Edit编辑框控件的更多相关文章

  1. 通过编写串口助手工具学习MFC过程--(十一)弹出模态型对话框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  2. 通过编写串口助手工具学习MFC过程——(十)UpdateData()用法和编辑框的赋值、取值

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  3. 通过编写串口助手工具学习MFC过程——(九)自动识别串口的方法

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  4. 通过编写串口助手工具学习MFC过程——(八)遇到的一些问题

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  5. 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  6. 通过编写串口助手工具学习MFC过程——(五)添加CheckBox复选框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  7. 通过编写串口助手工具学习MFC过程——(四)添加ComboBox组合框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  8. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  9. 通过编写串口助手工具学习MFC过程——(二)通过“打开串口”按钮了解基本操作

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

随机推荐

  1. BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  2. 以Emacs Org mode为核心的任务管理方案

    前言 如今用于任务管理的方法与工具越来越多,如纸笔系统.日历与任务列表.Emacs Org mode系统,以及移动设备上的诸多应用.这些解决方案各具特色,在一定程度上能够形成互补作用.但是,它们彼此之 ...

  3. pycharm的个性化设置

    1. 调整背景颜色 file -- settings -- Editor -- Color Scheme 2. 调整字体.字号.行间距 file -- settings -- Editor -- Fo ...

  4. 点云数据中的三维信息提取pcl

    https://www.hanspub.org/journal/PaperInformation.aspx?paperID=24702 https://wenku.baidu.com/view/160 ...

  5. 更好的构建 Node 服务的工具

    更好的构建 Node 服务的工具 无论前端项目在打包后都发送给后台, 有时候自己想看看效果在运行 npm run build 后只是看到一个 build 文件夹,但是直接打开是无法浏览,因此需要开启一 ...

  6. Integer类源码浅析

    1.首先Integer提供了两类工具类,包括把一个int类型转成二进等, 其实执行转换算法只有一个方法: public static String toString(int i, int radix) ...

  7. instanceOf与isInstance()方法之间的区别

    instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false.Class类的isInstance(Obje ...

  8. MySQL课下作业

    目录 MySQL 实验内容 实验代码 实验截图 代码链接 MySQL 实验内容 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/63713 ...

  9. modern php笔记---php (性状)

    modern php笔记---php (性状) 一.总结 一句话总结: trait是和继承一个层次的东西 一个类use MyTrait;后,trait中的方法覆盖父类方法,当前类中的方法覆盖trait ...

  10. Python 写 ACM 题目的一些技巧

    目录 输入输出 input() 输入 split() 用于输入 strip() 输入清理 print() 输入 sort 排序 输入输出 input() 输入 Python3 中 input() 函数 ...