VC(MFC)编写串口调试助手

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1页共37页VC(MFC)编写串口调试助手1.序确定基本功能:1.自动寻找串口,并自动添加到下拉框中共选择;2.有波特率、数据位、停止位、校验位的选择设置;3.串口打开控制按钮;4.发送、清除按钮;5.接收是自动实现的;6.有定时自动发送功能;7.有传送文件功能;8.有状态栏显示,指示串口状态,设置参数和发送接收显示。下面就一步步实现,本人纯业余,只是记录下来这个学习过程,请勿拍砖。开发平台VisualC++6.0英文版,电脑是i7-2670Q四核8G内存1G独显的笔记本,装的win764位旗舰版,因此VC6兼容不是太好,有些小毛病,不过不影响编写。2.创建MFC项目File-New-Projects选择MFCAppWizard(exe),项目名称commassist第2页共37页选择OK选中Dialogbased,点击Next。第3页共37页默认选项,点击Next,继续默认选项,点击Next,如果选中Asastaticallylinkedlibrary,生产的EXE可直接在第4页共37页没装VC的机器上运行。可以在项目中进行更改。选择第二个CCommassistDlg,点击Finish第5页共37页点击OK。项目创建完毕,进入项目。删除界面上确定和取消按钮以及静态文字。第6页共37页3.创建界面保存后便可以开始创建界面了。参考界面仿照设计的界面,具体添加按钮或编辑框等的布局步骤就不用细说了。4.图标修改在资源视图中选择Icon右键InsertIcon加入打开和关闭的Icon图标或自行绘制,如下图第7页共37页IDR_MAINFRAME原为MFC提供的图标,这里我直接改成自己的,生成EXE后将会显示这个图标。下面将帮助页面图标也改为自绘图标。在打开按钮旁边加入自绘的打开和关闭图标:先加入工具条中的Picture,然后选中右键看属性,并如图将Image选为默认的IDI_ICON_CLOSE。如下图第8页共37页5.基本设置下面对各个按钮及编辑框设置进行描述右键串口对应的ComboBox,ID设置为IDC_COMLIST,Type设置为DropList,Sort不选择(我系统是WIN764位,不选中反而自动排序,至于XP得试试看了,以下的选择相同)。右键波特率对应的ComboBox,ID设置为IDC_BAUD,Type及Sort同上。右键数据位对应的ComboBox,ID设置为IDC_BDATA,Type及Sort同上。右键停止位对应的ComboBox,ID设置为IDC_BSTOP,Type及Sort同上。右键校验位对应的ComboBox,ID设置为IDC_CAL,Type及Sort同上。每个下拉框要点击右边的小箭头,然后将其拉长,不然显示不出内容。接收EDIT框ID设置为IDC_EDIT_RX。发送EDIT框ID设置为IDC_EDIT_TX。自动发送时间间隔的EDIT框ID设置为IDC_EDIT_TIMER。选择文件后面的EDIT框ID设置为IDC_EDIT_FILEPATH。接收区的十六进制显示的CheckBox复选框ID设置为IDC_CHECK_HEXRX。发送区的十六进制发送的CheckBox复选框ID设置为IDC_CHECK_HEXTX。按钮“打开串口”ID设置为IDC_COMCONTROL。按钮“清空显示区”ID设置为IDC_BTN_CLRRX。按钮“手动发送”ID设置为IDC_BTN_HANDSEND。按钮“清空发送区”ID设置为IDC_BTN_CLRTX。按钮“自动发送”ID设置为IDC_BTN_AUTOSEND。按钮“选择文件”ID设置为IDC_BTN_SELCTFILE。按钮“发送文件”ID设置为IDC_BTN_SENDFILE。6.开始写代码6.1.基本思路:因为串口通信部分代码我可能用在以后的单片机上位机上,因此考虑单独形成CPP和H文件,定义为comm.cpp和comm.h。在comm.cpp中编写串口创建、打开、关闭以及串口监听线程(用于自动接收)的代码,同时加入进制转换或显示的函数,这些在comm.h文件中申明,在主对话框中包含comm.h即可。想修改按钮样式,在网上搜了一圈,结果不轻松,最后确定创建新类来实现。第9页共37页6.2.创建自定义按钮类:View-ClassWizard选择AddClass-New,名字MyButton,基类选择CButton。在头文件MyButton.h中加入以下变量和函数定义:private:intm_Style;//按钮形状(0-正常,1-当前,2-按下,3-锁定)boolb_InRect;//鼠标进入标志CStringm_strText;//按钮文字COLORREFm_ForeColor;//文本颜色COLORREFm_MouseInColor;//鼠标进入时文本颜色COLORREFm_BackColor;//背景颜色COLORREFm_LockForeColor;//锁定按钮的文字颜色CRectm_ButRect;//按钮尺寸CFont*p_Font;//字体voidDrawButton(CDC*pDC);//画正常按钮//接口函数public:MyButton();voidSetText(CStringstr);//设置文字voidSetForeColor(COLORREFcolor);//设置文本颜色voidSetBkColor(COLORREFcolor);//设置背景颜色voidSetTextFont(intFontHight,LPCTSTRFontName);//设置字体在MyButton.cpp的构造函数中初始化变量:m_Style=1;//m_Style=0;//按钮形状风格b_InRect=false;//鼠标进入标志m_strText=_T();//按钮文字(使用默认文字)m_ForeColor=RGB(0,0,0);//文字颜色(黑色)m_MouseInColor=RGB(0,0,255);//鼠标进入时文字颜色(蓝色)m_BackColor=RGB(230,230,230);//m_BackColor=RGB(243,243,243);//背景色(灰白色)m_LockForeColor=GetSysColor(COLOR_GRAYTEXT);//锁定按钮的文字颜色p_Font=NULL;//字体指针用ClassWizard添加下列消息函数:PreSubclassWindow();DrawItem();onMouseMove();OnLButtonDown();OnLButtonUp();在各函数内加入代码:第10页共37页voidMyButton::PreSubclassWindow(){//TODO:Addyourspecializedcodehereand/orcallthebaseclassModifyStyle(0,BS_OWNERDRAW);//设置按钮属性为自画式//PreSubclassWindow()在按钮创建前自动执行,所以我们可以在其中做一些初始工作。//这里只做了一项工作,就是为按钮设置属性为“自绘”式,这样,用户在添加按钮后,就不需设置“Ownerdraw”属性了。CButton::PreSubclassWindow();}voidMyButton::DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){//TODO:AddyourcodetodrawthespecifieditemCDC*pDC=CDC::FromHandle(lpDrawItemStruct-hDC);m_ButRect=lpDrawItemStruct-rcItem;//获取按钮尺寸if(m_strText.IsEmpty())GetWindowText(m_strText);//获取按钮文本intnSavedDC=pDC-SaveDC();VERIFY(pDC);DrawButton(pDC);//绘制按钮pDC-RestoreDC(nSavedDC);}//DrawItem()函数是一个关键函数,按钮的绘制工作就在这里进行,它的作用相当于对话框中的OnPaint()函数和视图中的OnDraw()函数。//这里我做了三项工作:获取按钮尺寸、获取按钮文本、绘制按钮。其中绘制工作在自定义函数DrawButton()中完成。以下就是绘制过程:voidMyButton::DrawButton(CDC*pDC){//调整状态if(m_Style==3)m_Style=0;if(GetStyle()&WS_DISABLED)m_Style=3;//禁止状态//根据状态调整边框颜色和文字颜色COLORREFbColor,fColor;//bColor为边框颜色,fColor为文字颜色switch(m_Style){case0:bColor=RGB(192,192,192);fColor=m_ForeColor;break;//正常按钮case1:bColor=RGB(255,255,255);fColor=m_ForeColor;break;//鼠标进入时按钮case2:bColor=RGB(192,192,192);fColor=m_MouseInColor;break;//按下的按钮case3:bColor=m_BackColor;fColor=m_LockForeColor;break;//锁定的按钮第11页共37页}//绘制按钮背景CBrushBrush;Brush.CreateSolidBrush(m_BackColor);//背景刷pDC-SelectObject(&Brush);CPenPen;Pen.CreatePen(PS_SOLID,3,bColor);pDC-SelectObject(&Pen);pDC-RoundRect(&m_ButRect,CPoint(10,10));//画圆角矩形//绘制按钮按下时的边框if(m_Style!=2){CRectRect;Rect.SetRect(m_ButRect.left+1,m_ButRect.top+1,m_ButRect.right,m_ButRect.bottom);pDC-DrawEdge(&Rect,BDR_RAISEDINNER,BF_RECT);//画边框}//绘制按钮文字pDC-SetTextColor(fColor);//画文字pDC-SetBkMode(TRANSPARENT);pDC-DrawText(m_strText,&m_ButRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_END_ELLIPSIS);//绘制拥有焦点按钮的虚线框if(GetFocus()==this){CRectRect;Rect.SetRect(m_ButRect.left+3,m_ButRect.top+2,m_ButRect.right-3,m_ButRect.bottom-2);pDC-DrawFocusRect(&Rect);//画拥有焦点的虚线框}}//变量m_Style表征当前按钮状态,它的取值为:0-正常,1-当前,2-按下,3-锁定。不同状态下按钮的边框颜色和文字颜色有所不同。//m_Style的值在鼠标响应函数中进行修改。//绘制工作主要利用CDC类的绘图函数完成,主要注意在m_Style不同取值下表现出来的差别。voidMyButton::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_Style=2;Invalidate();//重绘按钮CButton::OnLButtonDown(nFlags,point);}第12页共37页//OnLButtonDown()函数是单击鼠标左键时的消息函数。这里只是重新绘制

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功