|
1.5 主窗体设计(5)
(28)在主对话框中添加成员变量,记录Com端口信息及云台控制码。代码如下:
unsigned char (*m_pData) [MAXNUM]; //存储云台控制码 int m_Len; //云台协议使用的字节数 int m_ActoinCount; //云台控制动作数 int m_Port; //Com端口
| (29)从CButton类派生一个子类CStageButton,目的是在按下按钮时不停地控制云台,在释放按钮时停止对云台的控制。CStageButton类声明代码如下:
//按钮控制类型:上、下、左、右、自动、焦聚减、焦聚增、对焦减、 对焦增、光圈减、光圈增、雨刷减、雨刷增 enum ControlType {ctUp,ctDown,ctLeft,ctRight,ctAuto,ctReFoci, ctInFoci,ctReLen,ctInLen,ctReAperture,ctInAperture, ctReBrush,ctInBrush}; class CStageButton : public CButton { public: CStageButton(); //构造函数 public: ControlType m_Type; //控制按钮 public: virtual ~CStageButton(); //析构函数 protected: //{{AFX_MSG(CStageButton) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //鼠标左键按下 afx_msg void OnLButtonUp(UINT nFlags, CPoint point); //鼠标左键抬起 //}}AFX_MSG DECLARE_MESSAGE_MAP() };
| (30)在CStageButton类的实现代码中,设置当鼠标按下时触发的云台控制代码和鼠标抬起时停止对云台的控制。代码如下:
//当按下鼠标按钮时,根据按钮的类型标识调用不同的方法 void CStageButton::OnLButtonDown(UINT nFlags, CPoint point) { switch(m_Type) { case ctUp: { ((CCaptureDlg*)GetParent())->OnUp(); //控制云台向上 break; } case ctDown: { ((CCaptureDlg*)GetParent())->OnDown(); //控制云台向下 break; } case ctLeft: { ((CCaptureDlg*)GetParent())->OnLeft(); //控制云台向左 break; } case ctRight: { ((CCaptureDlg*)GetParent())->OnRight(); //控制云台向右 break; } case ctInFoci: { ((CCaptureDlg*)GetParent())->OnInFoci(); //设置聚焦减 break; } case ctReFoci: { ((CCaptureDlg*)GetParent())->OnReFoci(); //设置聚焦增 break; } case ctInLen: { ((CCaptureDlg*)GetParent())->OnInLen(); //设置对焦减 break; } case ctReLen: { ((CCaptureDlg*)GetParent())->OnReLen(); //设置对焦增 break; } case ctInAperture: { ((CCaptureDlg*)GetParent())->OnInAperture(); //设置光圈减 break; } case ctReAperture: { ((CCaptureDlg*)GetParent())->OnReAperture(); //设置光圈增 break; } case ctInBrush: { ((CCaptureDlg*)GetParent())->OnInBrush(); //设置画笔减 break; } case ctReBrush: { ((CCaptureDlg*)GetParent())->OnReBrush(); //设置画笔增 break; } default: { break; } } CButton::OnLButtonDown(nFlags, point); } //当释放鼠标按钮时停止对云台的控制 void CStageButton::OnLButtonUp(UINT nFlags, CPoint point) { ((CCaptureDlg*)GetParent())->OnReset(); CButton::OnLButtonUp(nFlags, point); }
| (31)为云台控制的按钮关联CStageButton类变量,并在对话框初始化时从INI文件中读取云台参数信息,并设置Com端口。代码如下:
m_ButtonUp.m_Type = ctUp; //向上 m_ButtonDown.m_Type = ctDown; //向下 m_ButtonLeft.m_Type = ctLeft; //向左 m_ButtonRight.m_Type = ctRight; //向右 m_InFoci.m_Type = ctInFoci; //聚焦减 m_ReFoci.m_Type = ctReFoci; //聚焦增 m_InLen.m_Type = ctInLen; //对焦减 m_ReLen.m_Type = ctReLen; //对焦增 m_InAperture.m_Type = ctInAperture; //光圈减 m_ReAperture.m_Type = ctReAperture; //光圈增 m_InBrush.m_Type = ctInBrush; //画笔减 m_ReBrush.m_Type = ctReBrush; //画笔增 m_Len = GetPrivateProfileInt("使用字节数","字节数",8,"./stage.ini"); //获得云台协议使用的字节数 m_ActoinCount = GetPrivateProfileInt("控制项","控制数",13,"./stage.ini"); //获得云台的控制动作数 m_pData = new unsigned char[m_ActoinCount][MAXNUM]; m_Port = GetPrivateProfileInt("端口设置","端口号",1,"./stage.ini"); //获得端口号 GetPrivateProfileString("端口设置","环境设置","9600,n,8,1", m_Setting.GetBuffer(0),MAX_PATH,"./stage.ini"); //获得环境设置 int data; char buff[20] = {0}; char var[20] = {0}; for (int i = 0 ; i<m_ActoinCount ; i++) { for (int j = 0 ; j <m_Len; j++) { char section[20] = "字节"; itoa(i+1,var,10); itoa(j+1,buff,10); strcat(section,buff); data = GetPrivateProfileInt(var,section,0,"./stage.ini"); // 获得各个按钮的字节数 m_pData[i][j] = data; } } m_Com.SetSettings(m_Setting); //设置端口信息,并打开端口 m_Com.SetOutBufferSize(512); //设置输出缓冲区大小 m_Com.SetCommPort(m_Port); //设置端口号 m_Com.SetSThreshold(0); //设置传输缓冲区允许的最小字符 m_Com.SetPortOpen(TRUE);
| (32)自定义MoveCapture函数,用于向串口发送信息控制云台。代码如下:
void CCaptureDlg::MoveCapture(UINT num) { VARIANT vt; //定义VARIANT结构变量 SAFEARRAY* pSafe; //定义SAFEARRAY结构指针 SAFEARRAYBOUND band; //定义SAFEARRAYBOUND结构变量 band.cElements = m_Len; band.lLbound = 0; pSafe = SafeArrayCreate(VT_UI1,1,&band); for(long i=0;i<m_Len;i++) { SafeArrayPutElement(pSafe,&i,(void*)&m_pData[num][i]); } vt.vt = VT_ARRAY |VT_UI1; vt.parray = pSafe; m_Com.SetOutput((COleVariant)vt); //向串口发送数据 } | (33)为各个按钮添加进行云台控制的方法。代码如下:
void CCaptureDlg::OnUp() //向上移动 { MoveCapture(0); } void CCaptureDlg::OnReset() //停止移动 { MoveCapture(12); } void CCaptureDlg::OnDown() //向下移动 { MoveCapture(1); } void CCaptureDlg::OnLeft() //向左移动 { MoveCapture(2); } void CCaptureDlg::OnRight() //向右移动 { MoveCapture(3); } void CCaptureDlg::OnInFoci() //增加聚焦 { MoveCapture(5); } void CCaptureDlg::OnReFoci() //减小聚焦 { MoveCapture(4); } void CCaptureDlg::OnInLen() //对焦增 { MoveCapture(7); } void CCaptureDlg::OnReLen() //对焦减 { MoveCapture(6); } void CCaptureDlg::OnReAperture() //光圈减 { MoveCapture(8); } void CCaptureDlg::OnInAperture() //光圈增 { MoveCapture(9); } void CCaptureDlg::OnReBrush() //画笔减 { MoveCapture(10); } void CCaptureDlg::OnInBrush() //画笔增 { MoveCapture(11); } | 【责任编辑: 夏书 TEL:(010)68476606】
|