C++ Builder串口控件如何添加

C++ Builder串口控件如何添加,第1张

用的控件是:trayicon

具体用法如下:

borland

c++

builder

5.0

中编写tray程序是件很简单的事。在安装

borland

c++

builder

5.0

时选择full(完全)安装,安装完成后,在samples组件页中有一个trayicon组件,它封装编写tary所需的window

api函数,使用该组件编写tary程序不用加一句程序代码,真是易如反掌。

首先,我们先看一下trayicon组件常用的属性:

属性说明

animate设为true时,顺序更改icons属性设置图标

animateinterva设置更改图标的时间(单位:毫秒)

hide设为true时,最小化时隐藏在任务栏上的标题栏

hint设置鼠标移动到tary图标上出现的提示信息

iconindex设置图标索引值

icons设置图标源(通常设置一个imagelist组件)

popupmenu设置要d出的菜单(通常设置一个popupmenu组件)

popupmenuon设置触发d出菜单的鼠标 *** 作

restoreon设置恢复最小化到正常状态的鼠标 *** 作

visible设为true时,在任务栏最右边显示图标

鼠标 *** 作说明:

值说明

imclick鼠标单击

imdoubleclick鼠标双击

imleftclickup单击鼠标左键,放开

imleftdoubleclick双击鼠标左键

immousedown按下鼠标键

immouseup按下鼠标键,放开

imnone不设置鼠标 *** 作

imrightclickup单击鼠标右键,放开

imrightdoubleclick双击鼠标右键

下面让我们来编一个简单的tary程序:

1、新建工程,添加一个trayicon组件、一个popupmenu组件和一个imagelist组件。它们的name属性

都用默认的名字:trayicon1、popupmenu1、imagelist1。

2、设置trayicon1的属性,如下:

属性值

linux

animate

true

animateinterva

1000

hide

true

hint

tary演示程序

iconindex

0

icons

imagelist1

name

trayicon1

popupmenu

popupmenu1

popupmenuon

imrightclickup

restoreon

imdoubleclick

visible

true

3、双击popupmenu1,d出菜单设计器,随意地加入几个菜单项。

4、双击imagelist1,加入支持的图片(*.ico、*.bmp)。

到此,不用编写一句程序代码,一个简单的tary程序就做好了。按f9编译运行,将鼠标移动到tary上面就会出现“tary演示程序”的提示信息;在tary上单击鼠标右键d出菜单popmenu1;按下程序窗口的最小化按钮,程序最小化后隐藏任务栏上的标题栏;双击tary将会恢复程序最小化;而且,tary图标以1000毫秒(1秒)的速度变换。够简单了吧?!

taryicon组件的演示源程序在

borland

c++

builder

5.0

安装目录下的\cbuilder5\examples\apps\trayicon。若你不想使用taryicon组件编写tary,只想使用api函数,可以参考安装目录\cbuilder5\examples\controls\traydemo下的源程序

注意以下几点:

1、这个控件的托盘图标要使用到timagelist控件,请设置其icons属性和对应的timagelist关联就可以

了,如果图标要变化,timagelist中要有多个图标,用trayicon控件的iconindex的值的改变来改变托

盘图标。

2、最小化和隐窗体应该用:

trayiconme->minimize()来实现

还原窗体用:trayiconme->restore()。

3、至于菜单的d出就在窗体上加一个popupmenu控件就可以了,popupmenu的设定和一般的设定没有什

么不同。然后把trayicon控件的popupmenu属性和popupmenu控件关联起来就可以了。当然,别忘了

设定一个popupmenuon属性,决定这个菜单的鼠标触发方式。

4、当鼠标指向托盘时,显出的字是trayicon的hint属性来设定的

首先创建一个VC6.0基于对话框的程序,然后在资源视图中,Project --- >Add To Project --->compoents and controls...,如下图所示

在d出的窗口选择“Registered ActiveX Controls”,双击进入该文件夹,如下图所示

在列表中找到“Microsoft Communications Control, version 6.0”,点击“Insert”按钮,如下图所示

接下来就会在资源视图中看到一个电话图标,如下图所示

右键该电话图标,选择“ClassWizard...”,如下图所示

在Member Variables下为该控件添加一个控件变量,如下图所示

在Message Maps下为该控件添加OnComm消息,如下图所示

在OnInitDialog()函数中,加入窗口控件初始化函数,如下图所示

在OnComm() 函数中,加入串口消息处理函数,处理串口接收的数据,如下图所示

1、新建MFC对话框工程如下

2、给编辑框控件添加变量,其中Edit Box添加Value变量,Button添加Control变量,ID和变量分别为:

IDC_BTNOPEN()                                  CButton m_cBtnOpen

IDC_BTNSEND()                                  CButton m_cBtnSend

IDC_EDIT_RXDATA()                          CString m_sRXDATA

IDC_EDIT_TXDATA()                           CString m_sTXDATA

3、右击插入Active X控件:

右击电话图标选择“Class Wirzard”,添加变量m_comm1,添加Function:

双击两个Button按钮;

代码中显示如下:

[cpp] view plain copy print?

void CMSCommTestDlg::OnBnClickedBtnopen()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnBnClickedBtnsend()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnOncommMscomm1()

{

// TODO: Add your message handler code here

}

void CMSCommTestDlg::OnBnClickedBtnopen()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnBnClickedBtnsend()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnOncommMscomm1()

{

// TODO: Add your message handler code here

}

5、将上面代码补全如下:

[cpp] view plain copy print?

void CMSCommTestDlg::OnClickedBtnopen()

{

// TODO: Add your control notification handler code here

//如果端口已经开启,那么先关闭

if (m_comm1.get_PortOpen())

{

m_comm1.put_PortOpen(FALSE)

}

m_comm1.put_CommPort(3)                //选择com3,可以根据具体情况更改

m_comm1.put_InBufferSize(1024)         //设置输入缓冲区的大小,Bytes

m_comm1.put_OutBufferSize(1024)        //设置输出缓冲区的大小,Bytes

m_comm1.put_Settings(_T("9600,n,8,1")) //波特率9600,无校验,8个数据位,停止位1

m_comm1.put_InputMode(1)               //1:表示以二进制方式检索数据

m_comm1.put_RThreshold(1)              //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_comm1.put_InputLen(0)                //设置当前接收区长度是0

if (!m_comm1.get_PortOpen())

{

m_comm1.put_PortOpen(TRUE)

}

else

{

AfxMessageBox(_T("Can not open serial port!"))

}

m_comm1.get_Input()                    //先预读缓冲区以清除残留数据

UpdateData(FALSE)

}

void CMSCommTestDlg::OnClickedBtnsend()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE)

m_comm1.put_Output(COleVariant(m_sTXDATA))//发送数据

}

void CMSCommTestDlg::OnOncommMscomm1()

{

// TODO: Add your message handler code here

VARIANT variant_inp

COleSafeArray safearray_inp

LONG len, k

BYTE rxdata[2048]

CString strtemp

if (m_comm1.get_CommEvent() == 2)       //事件值为2表示缓冲区内有字符

{

variant_inp = m_comm1.get_Input()  //读缓冲区

safearray_inp = variant_inp        //VARIANT型变量转换为ColeSafeArray型变量

len = safearray_inp.GetDim()       //得到有效数据长度

for (k = 0 k < len k++)

{

safearray_inp.GetElement(&k, rxdata + k)//转换为BYTE型数组

}

for (k = 0 k < len k++)            //将数组转换为CString型变量

{

BYTE bt = *(char*)(rxdata + k) //字符型

strtemp.Format(_T("%c"), bt)   //将字符送入临时变量strtemp存放

m_sRXDATA += strtemp           //接收到的数据放到编辑框对应的变量中

}

}

SetDlgItemText(IDC_EDIT_RXDATA, m_sRXDATA)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11653554.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存