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

经过编写串口助手工具学习MFC过程 编程

由于之前也作过几回MFC的编程,每次都是项目完成时,MFC基本操做清楚了,可是过好长时间再也不接触MFC的项目,再次作MFC的项目时,又要从头开始熟悉。此次经过作一个串口助手再次熟悉一下MFC,并作了一下记录,以便方便之后查阅。作的过程当中可能是遇到问题直接百度和谷歌搜索来的,因此不少都是不求甚解,知其然不知其因此然。另外作此工具只是为了熟悉了解,许多功能尚未完善!(开发工具VS2008) windows

(二)经过“打开串口”按钮了解基本操做 编辑器

wps2419.tmp

须要什么控件直接从这个对话框编辑器直接添加便可。 函数

一、添加一个按钮用于打开串口 工具

wps2458.tmp wps2459.tmp

二、设置按钮控件的属性 学习

调出属性对话框,设置ID 开发工具

wps245A.tmp

wps246B.tmp

Caption是静态选项,程序中能够动态设置按钮显示的文字,这里修更名字的好处是,方便编写代码是查看这个按钮是什么。 this

设置这个控件的ID名称,这样MFC就会对这个名称起一个对应的数字真正的ID,能够在工程中Resource.h 查看。 3d

工程中,右键.rc文件->选择”查看代码”,下图是部分截图,就会看对按钮的尺寸和位置和显示内容、ID名字。 指针

wps246C.tmp

三、添加按钮变量

再将这个按钮向对话框对应的类添加变量,在按钮上右键->选择添加变量->在变量名的文本框里填入变量名。以下图:

wps246D.tmp

添加后工程的变化,在对话框的头文件“serial testDlg.h : 头文件”,CserialtestDlg类中增长对象成员变量(头文件名和类名是创建工程时起的)

wps247D.tmp

“serial testDlg.cpp : 实现文件”中

wps247E.tmp

wps247F.tmp

像注释说明的那样,按钮变量m_ComBoComContrl和控件IDC_BUTTON_OPENCOM关联起来了,之后对此变量操做也就是对该按钮控件进行操做。

另一种操做按钮的方法是CWnd* GetDlgItem(ID)函数,返回窗口中指定参数ID的子元素的句柄,能够经过返回的句柄对相应的控件操做。而且这个操做能够在任何地方使用,按钮变量只能在对话框类中使用同,相应比获取句柄方式有局限性,也不够方便。(我的理解。)

CWnd* GetDlgItem(ID)的应用后面有涉及到。

四、添加按钮控件响应事件

方法一:在对话框里,双击按钮。

直接跳转到“serial testDlg.cpp : 实现文件”自动生成以下函数

//串口打开关闭按钮

void CserialtestDlg::OnBnClickedButtonOpencom()

{

}

大部分的控件经过双击都会生成相应的响应事件函数。

方法二:右击控件按钮->“添加事件处理函数”

wps2490.tmp

能够修改消息类型,不一样的控件里的消息类型不一样,此处选择点击消息,BN_CLICKED;

函数处理程序名称设置好,类列表中能够选择生成在哪一个类中,按默认的生成,即在对话框类中生成。

在“serial testDlg.cpp : 实现文件”生成的 消息增长此消息,包括消息类型、控件ID、响应事件的函数指针。

wps2491.tmp

经过以上信息,若是不使用向导增长变量和消息事件,也能够本身添加。

//串口打开关闭按钮

/*

这个函数主要实现功能是打开串口时,若是没有建立串口,先建立串口,根据串口原来的状态,实现串口打开或关闭。同时设置串口按钮的文字内容“打开或关闭串口”,设置串口显示的图片。

将串口参数设置的几个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)实现控件的使能和失能。函数执行效果。

wps24A1.tmp wps24A2.tmp

(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中定义,以下图所示。这两个变量就是这两个图片的句柄。

wps24C3.tmp

c、而后得到按钮句柄并调用SetBitmap便可。

((CButton *)GetDlgItem(IDC_BUTTON_OPENCOM))->SetBitmap(hBitmapComON);

此处再次使用GetDlgItem()函数来获取按钮控件的句柄,相应的改为变量也能实现相同功能。

m_ComboComContrl.SetBitmap(hBitmapComON);

此句与上句功能相同,一个得到控件句柄来操做,一个用控件变量来操做。

(4)按钮Bitmap属性对显示图片效果的影响

wps24C4.tmp wps24C5.tmp

wps24D5.tmp wps24D6.tmp

个人工程在unicode字符集下上面添加图片的方法,可行,可是在使用多字节字符集就不行了。为此我选择了使用Unicode字符集(宽字符)。

VC++6.0  默认是多字节字符集,VS2005之后默认是使用Unicode字符集。

使用unicode字符集编译出的软件 就像windows vista以后的软件,使用多字节字符集编译出的就像是XP时代的软件,但看到有人用VS2013|的多字节字符集编译的效果也是像vista以后的效果。

Unicode字符集和多字节字符集中的字符宽度不一样,前者是宽字符,一个字符两个字节,后者是一个字节。操做过程当中须要多注意。

wps24D7.tmp

相关文章
相关标签/搜索