通过编写串口助手工具学习MFC过程——(二)通过“打开串口”按钮了解基本操作
通过编写串口助手工具学习MFC过程
因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉。这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅。做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然。另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008)
(二)通过“打开串口”按钮了解基本操作
需要什么控件直接从这个对话框编辑器直接添加即可。
1、添加一个按钮用于打开串口
2、设置按钮控件的属性
调出属性对话框,设置ID
Caption是静态选项,程序中可以动态设置按钮显示的文字,这里修改名字的好处是,方便编写代码是查看这个按钮是什么。
设置这个控件的ID名称,这样MFC就会对这个名称起一个对应的数字真正的ID,可以在工程中Resource.h 查看。
工程中,右键.rc文件->选择”查看代码”,下图是部分截图,就会看对按钮的尺寸和位置和显示内容、ID名字。
3、添加按钮变量
再将这个按钮向对话框对应的类添加变量,在按钮上右键->选择添加变量->在变量名的文本框里填入变量名。如下图:
添加后工程的变化,在对话框的头文件“serial testDlg.h : 头文件”,CserialtestDlg类中增加对象成员变量(头文件名和类名是建立工程时起的)
“serial testDlg.cpp : 实现文件”中
像注释说明的那样,按钮变量m_ComBoComContrl和控件IDC_BUTTON_OPENCOM关联起来了,以后对此变量操作也就是对该按钮控件进行操作。
另外一种操作按钮的方法是CWnd* GetDlgItem(ID)函数,返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对相应的控件操作。并且这个操作可以在任何地方使用,按钮变量只能在对话框类中使用同,相应比获取句柄方式有局限性,也不够方便。(个人理解。)
CWnd* GetDlgItem(ID)的应用后面有涉及到。
4、添加按钮控件响应事件
方法一:在对话框里,双击按钮。
直接跳转到“serial testDlg.cpp : 实现文件”自动生成如下函数
//串口打开关闭按钮
void CserialtestDlg::OnBnClickedButtonOpencom()
{
}
大部分的控件通过双击都会生成相应的响应事件函数。
方法二:右击控件按钮->“添加事件处理函数”
可以修改消息类型,不同的控件里的消息类型不同,此处选择点击消息,BN_CLICKED;
函数处理程序名称设置好,类列表中可以选择生成在哪个类中,按默认的生成,即在对话框类中生成。
在“serial testDlg.cpp : 实现文件”生成的 消息增加此消息,包括消息类型、控件ID、响应事件的函数指针。
通过以上信息,如果不使用向导增加变量和消息事件,也可以自己添加。
//串口打开关闭按钮
/*
这个函数主要实现功能是打开串口时,如果没有创建串口,先创建串口,根据串口原来的状态,实现串口打开或关闭。同时设置串口按钮的文字内容“打开或关闭串口”,设置串口显示的图片。
将串口参数设置的几个ComboBox组合框实现使能和失能的控制*/
void CserialtestDlg::OnBnClickedButtonOpencom()
{
// TODO: 在此添加控件通知处理程序代码
//组织用于CComSerial类指针实例化时的数据,将对话框类的控件变量的地址获取给CComSerial
// 类,CComSerial类从这些控件获取相应数据,对串口参数进行设置
struct StruComCWnds stComCWnds;
stComCWnds.pComboBaudActual = this->pComboBaudActual;
stComCWnds.pComboSelSeri = &this->m_ComboSelSeri;
stComCWnds.pComboCheckBit = &this->m_ComboCheckBit;
stComCWnds.pComboDataBit = &this->m_ComboDataBit;
stComCWnds.pComboStopBit = &this->m_ComboStopBit;
if(NULL == pCComSer) //第一次点按钮时pCComSer为Null
{
pCComSer = new CComSerial(&stComCWnds);
if(NULL == pCComSer)
{
return;
}
}
//判断点击前串口是什么状态,原来连接状态,现在关闭;原来关闭,现在打开
if(pCComSer->GetConStatus())
{
//原来连接,现在要关闭
pCComSer->CloseComm(); //串口关闭操作
((CButton *)GetDlgItem(IDC_BUTTON_OPENCOM))->SetBitmap(hBitmapComOFF); //设置按钮图片
SetDlgItemText(IDC_BUTTON_OPENCOM, _T("打开串口")); //设置按钮显示文字内容
//串口参数设置的组合框使能,可以进行设置
m_ComboSelSeri.EnableWindow(TRUE);
m_ComboBaud.EnableWindow(TRUE);
m_ComboCheckBit.EnableWindow(TRUE);
m_ComboStopBit.EnableWindow(TRUE);
m_ComboDataBit.EnableWindow(TRUE);
m_ComboBaudEdit.EnableWindow(TRUE);
}
else
{
//原来未连接现在要连接
if(pCComSer->OpenComm()) //串口打开操作
{
//打开串口成功,设置按钮图片和显示文字内容
((CButton *)GetDlgItem(IDC_BUTTON_OPENCOM))->SetBitmap(hBitmapComON);
SetDlgItemText(IDC_BUTTON_OPENCOM, _T("关闭串口"));
//串口参数设置的组合框失能,打开串口后不可以再进行设置
m_ComboSelSeri.EnableWindow(FALSE);
m_ComboBaud.EnableWindow(FALSE);
m_ComboCheckBit.EnableWindow(FALSE);
m_ComboStopBit.EnableWindow(FALSE);
m_ComboDataBit.EnableWindow(FALSE);
m_ComboBaudEdit.EnableWindow(FALSE);
}
}
}
此处注意,在这里动态分配了内存,pCComSer = new CComSerial(&stComCWnds);
所以在销毁对话框时也要释放此内存,可在对话框类的析构函数里增加对动态内存分配的释放。因为这个类是MFC自动生成的,在WINDOWS的销毁工作里会自动调用系统自动生成类的析构函数,所以把释放功能增加到这个函数里。
CserialtestDlg::~CserialtestDlg()
{
//pCComSer->CloseComm();
if(pCComSer != NULL)
{
delete pCComSer;
pCComSer = NULL;
}
}
因为C++还在学习过程中,对类的设置不好。函数中实现了几个功能,下面介绍一下:
(1)控件的使能和失能
控件的EnableWindow(TRUE)和EnableWindow(FALSE)实现控件的使能和失能。函数执行效果。
(2)按钮显示文字
SetDlgItemText(IDC_BUTTON_OPENCOM, _T("关闭串口"));
从函数和名字中可以看出SetDlgItemText();设置控件的文本显示,第一个参数就是控件的ID号,第二个参数是文本信息。下面这几行代码也可以实现同样的功能。
CString str ;
str.Format(_T("串口打开"));
SetDlgItemText(IDC_BUTTON_OPENCOM,str);
百度这个函数:Windows API宏,在WinUser.h中根据是否已定义Unicode被分别定义为SetWindowTextW和SetWindowTextA,这两个函数改变指定窗口的标题栏的文本内容(如果窗口有标题栏)。如果指定窗口是一个控件,则改变控件的文本内容。特别需要引起重视的是,【SetWindowText函数不改变在其他应用程序中的控件的文本内容,如果需要可以用另外一个SendMessage函数发送一条WM_SETTEXT消息】
查看定义,都是三个定义的参数,没有发现有两个参数的重载,不知原因。
_T("关闭串口")作用将字符串转为当前环境的字符宽度。如本工程设置的是Unicode宽字符。
和此功能类似的函数GetWindowText(),从函数名字可以看出此功能是获取控件文本内容的。从文本编辑框edit控件中读取数据就是用的这个方法。介绍文本编辑框时再详细介绍。
CString str;
GetDlgItem(IDC_EDIT_DATASEND)->GetWindowText(str); //从发送框读数据
(3)按钮显示图片
往上查找说有三种方法,本例中用其中之一,
a、将图片导入到资源管理器中,ID设置为IDB_BITMAP_COMON和IDB_BITMAP_COMOFF。
如何导入,右键工程->添加->资源->选择”BITMAP”。注意BITMAP文件必须确实是转换成此格式的,不能只改后缀名,那样图片格式不对是不能实现功能的。
b、在显示图片前加载图片,下面两行代码。
//按钮开关
hBitmapComON = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_COMON)); // IDB_BITMAP_TEST为资源图片ID
hBitmapComOFF = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_COMOFF)); // IDB_BITMAP_TEST为资源图
hBitmapComON变量和 hBitmapComOFF变量在CserialtestDlg中定义,如下图所示。这两个变量就是这两个图片的句柄。
c、然后获得按钮句柄并调用SetBitmap即可。
((CButton *)GetDlgItem(IDC_BUTTON_OPENCOM))->SetBitmap(hBitmapComON);
此处再次使用GetDlgItem()函数来获取按钮控件的句柄,相应的改成变量也能实现相同功能。
m_ComboComContrl.SetBitmap(hBitmapComON);
此句与上句功能相同,一个获得控件句柄来操作,一个用控件变量来操作。
(4)按钮Bitmap属性对显示图片效果的影响
我的工程在unicode字符集下上面添加图片的方法,可行,但是在使用多字节字符集就不行了。为此我选择了使用Unicode字符集(宽字符)。
VC++6.0 默认是多字节字符集,VS2005以后默认是使用Unicode字符集。
使用unicode字符集编译出的软件 就像windows vista之后的软件,使用多字节字符集编译出的就像是XP时代的软件,但看到有人用VS2013|的多字节字符集编译的效果也是像vista之后的效果。
Unicode字符集和多字节字符集中的字符宽度不同,前者是宽字符,一个字符两个字节,后者是一个字节。操作过程中需要多注意。

通过编写串口助手工具学习MFC过程——(二)通过“打开串口”按钮了解基本操作的更多相关文章
- 通过编写串口助手工具学习MFC过程--(十一)弹出模态型对话框
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(十)UpdateData()用法和编辑框的赋值、取值
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(九)自动识别串口的方法
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(八)遇到的一些问题
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(六)添加Edit编辑框控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(五)添加CheckBox复选框
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(四)添加ComboBox组合框
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
随机推荐
- php将base64字符串转换为图片
昨天用一个js插件 [链接]: http://www.erdangjiade.com/js/910.html 实行了图片裁剪并预览,不过它生产的图片资源是一个base64字符串,不好保存后来在网上找到 ...
- 小程序获取Unionid
小程序获取用户Unionid,必须授权获取密文.但授权成功后不是永久的.除非关注了公众号或者App微信绑定了, 解决办法是通过code获取openid,然后用openid去数据库查对应的Unionid ...
- (转载)Kaggle_Titanic生存预测 -- 详细流程吐血梳理
Kaggle_Titanic生存预测 -- 详细流程吐血梳理 https://blog.csdn.net/Koala_Tree/article/details/78725881 Kaggle中Tita ...
- keystonejs富文本问题及思考过程
上一篇讲了keystonejs的环境搭建,helloworld跑起来之后,实际运用中会发现各种问题,今天就说下富文本编辑器的问题(针对后端不熟的同学). 不太熟悉网页嵌入富文本编辑器的同学可能和我一样 ...
- tp5 select
tp5 select出来的数据 和tp3.2select出来的数据 不一样, tp5 select出来的数据 含有很多我们不需要的东西,让我们小菜鸟看的很痛苦 解决办法 $date是查询出来的结 ...
- gvim安装中文文档
今天下载了个gvim一直无法安装中文中文文档,以为是版本原因,又下了几个版本,后来发现都不行. 最后发现是文档安装位置不对,需要放到vim/vim47目录下才行 以下是翻墙在官网下的gvim74和vi ...
- Python Module_subprocess_调用 Powershell
目录 目录 前言 Powershell call Python Python call Powershell Powershell发送邮件 最后 前言 使用Python内建的subprocess模块, ...
- vue启动流程
继上一篇vue环境的搭建(在D盘新建文件夹vue_cli,把(我已经上传到了文件下)资料下tpls解压完后的所有文件都复制到D盘vue_cli下) 目录如图: 1.webstorm设置为了提高webS ...
- unity shader 热扭曲 (屏幕后处理)
效果: c# using System; using System.Collections; using System.Collections.Generic; using UnityEngine ...
- 【bzoj4710】[Jsoi2011]分特产
JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到 ...