基于MFC的Flash和单片机的通讯_第1页
基于MFC的Flash和单片机的通讯_第2页
基于MFC的Flash和单片机的通讯_第3页
基于MFC的Flash和单片机的通讯_第4页
基于MFC的Flash和单片机的通讯_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于基于 MFC 的的 Flash 和单片机的通讯和单片机的通讯 第一部分第一部分 Flash 和和 MFC 通讯通讯 第一步第一步 建立基于对话框的 MFC 程序 打开 Visual Studio 2010 新建项目 选择 MFC 应用程序 并将其命名为 MFCFlash 在接下来的选型设置中 选择应用程序类型为 基于对话框 其他可按默认设置 项目建成后 程序默 认添加了 MFCFlash 和 MFCFlashDlg 的头文件和实现文件 截图如下 第二步第二步 添加 Shockwave Flash Object 类 VC 6 0 中 可以使用 ClassWizard 添加 ActiveX 控件 而 VS2005 以后的版本没有 如果要添加 ActiveX 对应的类 可以 项目 添加类 ActiveX 控件中的 MFC 类 打开 从 ActiveX 控件添加类 向导 对话框 选择从 文件 添加类 找到 Flash 控件的安装位置 即可添加 Shockwave Flash 控件 接口 选择 IShockwaveFlash 以生成 CShockwaveFlash 类 类的名称可以修改 插入后 VC 会自动把这个 类加入工程里面 第三步第三步 添加 Shockwave Flash Object 控件 在资源视图里找到 Dialog 并选择其中的 IDD MFCFLASH DIALOG 在其上点右键 选择 插入 ActiveX 控件 从弹出的列表中选择 Shockwave Flash Object 使用 BUTTON EDIT 等其它 Windows 控件一样 我们可以使用这个类的成员函数来操纵这个对象 来进行 Flash 动画的控制以及和自己的程序进行交互等操作了 在 Flash 控件上点右键 然后选择 添加 变量 设定 变量名 为 m FlashPlayer 可再次在 Flash 控件上点右键 然后选择 属性 将其 ID 改为 IDC SHOCKWAVEFLASH 第四步第四步 使用成员函数 LoadMovie 和 Play 来导入并播放动画 在 MFCFlashDlg cpp 文件中 找到 CMFCFlashDlg OnInitDialog 函数 在 return TRUE 之前添加代 码 CString str T E VS Flash media test swf m FlashPlayer LoadMovie 0 str m FlashPlayer Play 其中 m FlashPlayer LoadMovie 0 str 用来将动画导入程序中 str 为要播放的 flash 路径 要用绝对路径 注意路径用双斜杠 隔开 m FlashPlayer Play 开始播放动画 三 实现三 实现 MFC 与与 Flash 的通信的通信 1 Flash 通过通过 FSCommand 消息调用消息调用 MFC 第一步 第一步 添加消息处理函数 在 Flash 控件上点右键 然后选择 添加事件处理程序 在类列表选择 CMFCFlashDlg 消息类型选 择 FSCommand 则函数处理程序名称自动为 FSCommandShockwaveflash 它的形式大概是这样子 的 void CMFCFlashDlg OnFSCommandShockwaveflash LPCTSTR command LPCTSTR args 函数有两个 参数 就是 flash 的 Action Script 中 FSCommand 语句中的两个参数 其实并不一定两个参数都用到 flash 脚 本中可以就使用一个参数 这样这边的函数就只要对第一个参数进行处理就行了 第二步 第二步 编写消息处理代码 在刚添加的 FSCommand 消息处理函数中 对两个参数进行处理 其实就是做字符串比较的操作 根据是 什么字符串来判断用户进行了什么操作 大概就是这样子的 void CPlayFlashDlg OnFSCommandShockwaveflash1 LPCTSTR command LPCTSTR args TODO Add your control notification handler code here if 0 strcmp command bt if 0 strcmp args enter MessageBox 欢迎进入系统 else if 0 strcmp command quit MessageBox 您选择了退出 CDialog OnCancel 这只是最简单的处理形式 当然你可以在 flash 中发送复杂的字符串 在这边就要进行更多的处理了 2 MFC 通过通过 CallFunction 函数调用函数调用 Flash 第一步 第一步 Flash 中 ExternalInterface addCallback 用处理 在 FLASH 中 要用 ExternalInterface addCallback 把能被外部调用的函数注册一下 例如 ExternalInterface addCallback setAlt setAlt function setAlt para String 3150 alt text para alt 为 swf 文件中的一个动态文本 第二步 第二步 MFC 中使用 CallFunction 函数传入参数 想让 MFC 主动往 flash 传内容并且让 flash 响应 用控件的 CallFunction 方法 在 MFC 中 调用 CallFunction 方法 传入一个比较复杂的字符串 描述了要调用的函数的名称 参数等等 以 XML 的形式呈现 详情参考 FLASH 帮助的 外部 API 的 XML 格式 一文 此处 CallFunction 传递的参数为 XML 格式 如下 CString temp T 3500FT m FlashPlayer CallFunction temp 第二部分第二部分 单片机与单片机与MFC的通讯的通讯 1 安装好VS2010 网上很多人说使用VC6 0的mscomm32 ocx控件 下载并注册 注册过 程看上去还很复杂 我是使用VS2010自带的控件 因此没有这些过程 只需要安装好 VS2010就行了 在 Flash 控件上继续添加如下对话框控件 打开串口 按钮 添加方法为从右侧 工具箱 拖放一个 Button 到对话框 并在右侧 属性 卡中修改 Caption 为 打开串口 修改 ID 为 IDC BUTTON OPEN 关闭串口 按钮 添加方法为从右侧 工具箱 拖放一个 Button 到对话框 并在右侧 属性 卡中修改 Caption 为 关闭串口 修改 ID 为 IDC BUTTON CLOSE 发送 按钮 添加方法为从右侧 工具箱 拖放一个 Button 到对话框 并在 右侧 属性 卡中修改 Caption 为 发送 修改 ID 为 IDC BUTTON SEND 发送编辑框 接受编辑框 2 添加串口通信控件 在对话框上 右键 对话框右下角 默认在左上角 的电话图标就是串口控件 3 给控件添加变量 在控件 电话图标 上 右键 命名为 m mscomm 点击完成 工程中会自动添加 mscomm h 和 mscomm cpp 两 个文件 4 给两个编辑框添加成员变量 5 添加三个按钮的事件 直接 双击 三个按钮 在 CommTestDlg cpp 文件中会增加如下几个函数 voidCCommTestDlg OnBnClickedButtonSend TODO 在此添加控件通知处理程序代码 voidCCommTestDlg OnBnClickedButtonOpen TODO 在此添加控件通知处理程序代码 voidCCommTestDlg OnBnClickedButtonClose TODO 在此添加控件通知处理程序代码 消息映射已经自动关联 6 添加串口控件的事件处理程序 点击 添加编辑 即可 在 CommTestDlg cpp 文件中会增加函数 voidCCommTestDlg OnCommMscomm1 TODO 在此添加控件通知处理程序代码 数据接收将在此函数中进行 7 打开串口及串口设置 void CCommTestDlg OnBnClickedButtonOpen TODO 在此添加控件通知处理程序代码 if m mscomm get PortOpen 如果串口是打开的 则行关闭串口 m mscomm put PortOpen FALSE m mscomm put CommPort 1 选择 COM1 m mscomm put InBufferSize 1024 接收缓冲区 m mscomm put OutBufferSize 1024 发送缓冲区 m mscomm put InputLen 0 设置当前接收区数据长度为 0 表示全部读取 m mscomm put InputMode 1 以二进制方式读写数据 m mscomm put RThreshold 1 接收缓冲区有 1 个及 1 个以上字符时 将引发接收数据的 OnComm 事件 m mscomm put Settings T 9600 n 8 1 波特率 9600 无检验位 8 个数据位 1 个停止位 if m mscomm get PortOpen 如果串口没有打开则打开 m mscomm put PortOpen TRUE 打开串口 AfxMessageBox T 串口 1 打开成功 else m mscomm put OutBufferCount 0 AfxMessageBox T 串口 1 打开失败 8 添加关闭串口按钮的消息响应函数 void CCommTestDlg OnBnClickedButtonClose TODO 在此添加控件通知处理程序代码 m mscomm put PortOpen FALSE 关闭串口 AfxMessageBox T 串口 1 已关闭 9 添加发送按钮消息响应函数 void CCommTestDlg OnBnClickedButtonSend TODO 在此添加控件通知处理程序代码 UpdateData true 读取编辑框内容 m mscomm put Output COleVariant m EditSend 发送数据 m EditSend Empty 发送后清空输入框 UpdateData false 更新编辑框内容 10 接收数据 void CCommTestDlg OnCommMscomm1 TODO 在此处添加消息处理程序代码 static unsigned int cnt 0 VARIANT variant inp COleSafeArray safearray inp long len k unsigned int data 1024 0 byte rxdata 1024 设置 BYTE 数组 CString strtemp if m mscomm get CommEvent 2 值为 2 表示接收缓冲区内有字符 cnt variant inp m mscomm get Input 读缓冲区消息 safearray inp variant inp 变量转换 len safearray inp GetOneDimSize 得到有效的数据长度 for k 0 k len k safearray inp GetElement for k 0 kLoadIcon IDR MAINFRAME void CMFCFlashDlg DoDataExchange CDataExchange pDX CDialogEx DoDataExchange pDX DDX Control pDX IDC SHOCKWAVEFLASH1 m FlashPlayer DDX Control pDX IDC MSCOMM1 m mscomm DDX Text pDX IDC EDIT1 m EditSend DDX Text pDX IDC EDIT2 m EditReceive BEGIN MESSAGE MAP CMFCFlashDlg CDialogEx ON WM SYSCOMMAND ON WM PAINT ON WM QUERYDRAGICON ON BN CLICKED IDC BUTTON OPEN 将 关于 菜单项添加到系统菜单中 IDM ABOUTBOX 必须在系统命令范围内 ASSERT IDM ABOUTBOX ASSERT IDM ABOUTBOX AppendMenu MF SEPARATOR pSysMenu AppendMenu MF STRING IDM ABOUTBOX strAboutMenu 设置此对话框的图标 当应用程序主窗口不是对话框时 框架将自动 执行此操作 SetIcon m hIcon TRUE 设置大图标 SetIcon m hIcon FALSE 设置小图标 if m mscomm get PortOpen 如果串口是打开的 则行关闭串口 m mscomm put PortOpen FALSE m mscomm put CommPort 2 选择COM1 m mscomm put InBufferSize 1024 接收缓冲区 m mscomm put OutBufferSize 1024 发送缓冲区 m mscomm put InputLen 0 设置当前接收区数据长度为0 表示全部读取 m mscomm put InputMode 1 以二进制方式读写数据 m mscomm put RThreshold 1 接收缓冲区有1个及1个以上字符时 将引发接收数据的OnComm 事件 m mscomm put Settings T 9600 n 8 1 波特率9600无检验位 8个数据位 1个停止位 if m mscomm get PortOpen 如果串口没有打开则打开 m mscomm put PortOpen TRUE 打开串口 AfxMessageBox T 串口7打开成功 else m mscomm put OutBufferCount 0 AfxMessageBox T 串口7打开失败 TODO 在此添加额外的初始化代码 CString str T C Flash flashtest1 swf m FlashPlayer LoadMovie 0 str m FlashPlayer Play m FlashPlayer CallFunction strXML return TRUE 除非将焦点设置到控件 否则返回 TRUE void CMFCFlashDlg OnSysCommand UINT nID LPARAM lParam if nID dlgAbout DoModal else CDialogEx OnSysCommand nID lParam 如果向对话框添加最小化按钮 则需要下面的代码 来绘制该图标 对于使用文档 视图模型的 MFC 应用程序 这将由框架自动完成 void CMFCFlashDlg OnPaint if IsIconic CPaintDC dc this 用于绘制的设备上下文 SendMessage WM ICONERASEBKGND reinterpret cast dc GetSafeHdc 0 使图标在工作区矩形中居中 int cxIcon GetSystemMetrics SM CXICON int cyIcon GetSystemMetrics SM CYICON CRect rect GetClientRect int x rect Width cxIcon 1 2 int y rect Height cyIcon 1 2 绘制图标 dc DrawIcon x y m hIcon else CDialogEx OnPaint 当用户拖动最小化窗口时系统调用此函数取得光标 显示 HCURSOR CMFCFlashDlg OnQueryDragIcon return static cast m hIcon void CMFCFlashDlg OnBnClickedButtonOpen TODO 在此添加控件通知处理程序代码 if m mscomm get PortOpen 如果串口是打开的 则行关闭串口 m mscomm put PortOpen FALSE m mscomm put CommPort 2 选择COM1 m mscomm put InBufferSize 1024 接收缓冲区 m mscomm put OutBufferSize 1024 发送缓冲区 m mscomm put InputLen 0 设置当前接收区数据长度为0 表示全部读取 m mscomm put InputMode 1 以二进制方式读写数据 m mscomm put RThreshold 1 接收缓冲区有1个及1个以上字符时 将引发接收数据的OnComm 事件 m mscomm put Settings T 9600 n 8 1 波特率9600无检验位 8个数据位 1个停止位 if m mscomm get PortOpen 如果串口没有打开则打开 m mscomm put PortOpen TRUE 打开串口 AfxMessageBox T 串口7打开成功 else m mscomm put OutBufferCount 0 AfxMessageBox T 串口7打开失败 void CMFCFlashDlg OnBnClickedButtonClose TODO 在此添加控件通知处理程序代码 m mscomm put PortOpen FALSE 关闭串口 AfxMessageBox T 串口7已关闭 void CMFCFlashDlg OnBnClickedButtonSend TODO 在此添加控件通知处理程序代码 UpdateData true 读取编辑框内容 m mscomm put Output COleVariant m EditSend 发送数据 m EditSend Empty 发送后清空输入框 UpdateData false 更新编辑框内容 BEGIN EVENTSINK MAP CMFCFlashDlg CDialogEx ON EVENT CMFCFlashDlg IDC MSCOMM1 1 CMFCFlashDlg OnCommMscomm1 VTS NONE ON EVENT CMFCFlashDlg IDC SHOCKWAVEFLASH1 150 CMFCFlashDlg FSCommandShockwaveflash1 VTS BSTR VTS BSTR END EVENTSINK MAP void CMFCFlashDlg OnCommMscomm1 TODO 在此处添加消息处理程序代码 int x atoi m FlashPlayer GetVariable root DL y int y atoi m FlashPlayer GetVariable root DL x CString DL x CString DL y static unsigned int cnt 0 VARIANT variant inp COleSafeArray safearray inp long len k unsigned int data 1024 0 byte rxdata 1024 设置 BYTE 数组 CString strtemp if m mscomm get CommEvent 2 值为 2 表示接收缓冲区内有字符 cnt variant inp m mscomm get Input 读缓冲区消息 safearray inp variant inp 变量转换 len safearray inp GetOneDimSize 得到有效的数据长度 for k 0 k len k safearray inp GetElement for k 0 k len k 将数组转换为 CString 型变量 BYTE bt char rxdata k 字符型 strtemp Format c bt 将字符送入临时变量strtemp存放 m EditReceive strtemp 加入接收编辑框对应字符串 if strcmp strtemp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论