近日,项目上需要一个上位机软件来监控串口,同时进行一些信息处理和显示。笔者之前接触过VS的开发,于是边搜索边做,最终完成了项目需求。
下面对开发过程中遇到的问题和关键步骤进行总结。
在整个项目开发过程中参考了如下博文:
http://wenku.baidu.com/link?url=SXkEsiMcpfqhM3IdT5ZZ97aNTmwfO_74dvJoNSWoCp2FIyudzpd1uBSgh2ccFJS6v0bfUaBNeTk--W9W3b9YWt7FloiHeLD6iGHHFewuA8u
1. 串口中断控制
m_mscom.put_CommPort((m_comb1.GetCurSel()+1)); //选择串口
m_mscom.put_InputMode(1); //设置输入方式为二进制方式
m_mscom.put_Settings(str1); //波特率为(波特率组Á合框)无校验,8数据位,1个停止位
m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024
m_mscom.put_RThreshold(1); //缓冲区一个字符引发事件
m_mscom.put_RTSEnable(1); //设置RT允许
m_mscom.put_PortOpen(true); //打开串口
如上,在我的项目中要求是接收6个字符引发中断,故将代码中数字改为6,即:
m_mscom.put_RThreshold(6); //缓冲区6个字符引发事件
2. 更改初始焦点
在项目开发过程中发现项目运行后,只要按回车键,就会退出。
这个是因为虽然删除了最开始的那个OK确定按键,但是默认初始焦点还是在它上面,故回车键会引发它的事件处理函数,即退出程序。
这里我的处理方法是,在MFC控件界面,ctrl+D,然后界面会变成如下所示:
然后,依次点击你想要的焦点顺序。这样再次运行之后,默认的焦点在1上,按tab键可以切换焦点位置。
3. 控件背景色
项目中需要更改控件背景色,执行步骤如下:
首先,在控件界面,右键-->类向导
然后,依次选择,消息-->WM_CTLCOLOR-->添加处理程序
然后在增加的代码里写下如下语句:HBRUSH C嵌入式物联网系统上位机软件Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
pDC->SetBkMode(TRANSPARENT);
HBRUSH B = CreateSolidBrush(RGB(255,0,0));
// TODO: 在此更改 DC 的任何特性
switch (pWnd->GetDlgCtrlID())
{
case IDC_EDIT_Sta1: B = CreateSolidBrush(RGB(255,255,0));
……
default: return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
}
return (HBRUSH) B;
//return hbr;
}
如上,在case语句中便可根据控件的ID来进行颜色的处理。
我这里只更改了控件的背景色,若进行文字色,字体等百度OnctlColor函数即可。
这个函数在系统绘制控件的时候会执行,并更改控件的颜色。假如想要在函数中动态控制控件颜色,则在你需要更改颜色的地方增加如下代码:
CRect rect(25,15,35,40);
InvalidateRect(rect,FALSE);
其作用是更新一个矩形区域内的控件,更新时会调用OnctlColor函数,如此便实现了动态更新控件颜色。另外选择InvalidateRect来进行更新操作的原因是可以避免
更新全部控件时的界面闪烁现象。
4. edit文本框右键菜单的屏蔽
在开发时发现,就算对文本框进行了只读(属性里选择)控制,但是运行时候鼠标选中文本框右键,会弹出一个菜单,里面有复制等一些操作。这个右键菜单是我所不想要的,
于是进行一下步骤类屏蔽这个右键菜单。
在控件界面,右键-->类向导,然后点击添加类右边的选择项,选择MFC类:
然后在添加类界面,基类选择CEdit,其余的随便写:
这样就继承CEdit类创建了一个新类,然后我们需要重载右键点击事件。
还是在类向导中,选择刚刚创建的类,然后消息-->WM_RBUTTONUP-->添加处理程序
在重载的OnRButtonUp这个事件处理函数中我们进行如下操作:
void CEDitEx::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//CEdit::OnRButtonUp(nFlags, point);
}
即将红色部分注释掉。到这就完成了函数的重载工作,接下来将重载过的新类应用到控件中。
选择想要添加变量的文本框,右键-->添加变量
点击确定之后,我们找到这个变量的定义的部分(类向导-->成员变量-->编辑代码),如下所示:
private:
CEdit C_Control;
然后我们用刚才新建的类类定义它:
private:
CEDitEX C_Control;
在此运行,发现文本框右键菜单被屏蔽了。
4. 背景色消失
在更改Edit文本框背景色之后,鼠标不断从文本框双方掠过的时候会发生背景色消失的bug。调试之后发现鼠标掠过文本框上方的时候,文本框会变量,即触发了某些事件从而
使文本框变亮,而变亮的操作可能与我们改变背景色的操作有冲突。
这里我的处理办法是将文本框的Disabled属性调为True,这样可以使鼠标掠过的时候不触发事件。
5. 定时器的使用
控件界面-->右键-->类向导-->消息-->WM_TIMER-->添加处理程序
如此便会添加一个定时器到时处理函数,然后
void C嵌入式物联网系统上位机软件Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rect(25,15,35,40);
switch(nIDEvent)
{
case 1:if(sta[1]==2){sta[1]=1;m_Edit_Sta1 = "断开连接";UpdateData(false);}break;
case 2:if(sta[2]==2){sta[2]=1;m_Edit_Sta2 = "断开连接";UpdateData(false);}break;
……
default :;
}
InvalidateRect(rect,FALSE);
CDialogEx::OnTimer(nIDEvent);
}
在case语句中可以添加对定时器到时的操作。
在需要开始计时的地方添加:
SetTimer(1,15000,NULL);
如上所示,便添加了一个标号为1,时长为15秒的计时器,15秒之后便会触发OnTimer函数。
6. 更改文本框的值
这个在上面的链接中有介绍到具体操作,就是往文本框添加一个Value类型的变量,而后更改此变量的值,调用UpdateData(false);即可。