logo资料库

基于vc的mfc手柄遥控上位机Joy_Send步骤.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
1 新建基于对话框的 mfc 工程 2 将 DIJoystick.cpp 和 DIJoystick.h 添加到工程 3 工具 选项选择 目录 include 和 lib 目录 4 在 Dialog 中使用 组框 和复选框 (???列举现在会使用过的插件)。 弄完后是这样子的 5 添加组框和静态文本 6 添加 com 串口 这个课参考手把手教你上位机串口
7:添加成员变量 8 在如 Joy_Send1Dlg.cpp 中#include "DIJoystick.h"和#include "VidiconCapture.h" 在// CAboutDlg dialog used for App About 后加入 CDIJoystick myJoystick1;//定义了一个类对象(这个是在 Dlg。Cpp 中定义) CVidiconCapture m_vc; 这个是在 Dlg。H 中定义的 并且具体应用如 usb_device 或者串口 必须在 BOOL CJoy_Send1Dlg::OnInitDialog()添加初 始化 还有手柄的初始化 CWnd *jb=this; myJoystick1.SetHWND(jb->m_hWnd);
// Reset Combo Control LPCDIDEVICEINSTANCE lpddi=NULL; // Ensure you have First Joystick ID to start search for additional Devices! lpddi=myJoystick1.GetFirstJoystickID(); if(!lpddi) { // No joysticks have been found! MessageBox("找 不 到 游戏 手 柄 ! 请 插 上 手柄 重 启 程 序 !"," 检 测 不 到游 戏 手 柄 ",MB_ICONHAND|MB_OK); //OnCancel(); } GUID myguid; if((lpddi)&&((int)lpddi!=-1)) { memcpy(&myguid,&(lpddi->guidInstance),sizeof(GUID)); myJoystick1.SetPreferredDevice(&myguid); } SetTimer(1,50,NULL); 或者张滨师兄 //================游戏机手柄初始化==================== //设置游戏机手柄的的窗口句柄 CWnd *jb=this; myJoystick1.SetHWND(jb->m_hWnd); LPCDIDEVICEINSTANCE lpddi=NULL; GUID myguid; // 获取手柄的 Id,并?????? lpddi=myJoystick1.GetFirstJoystickID(); memcpy(&myguid,&(lpddi->guidInstance),sizeof(GUID)); myJoystick1.SetPreferredDevice(&myguid); if(!lpddi) { MessageBox("I have not been able to find a joystick on your system.","No Joystick Detected",MB_ICONHAND|MB_OK); OnCancel(); } //设置采样间隔 SetTimer(1,100,NULL); 在就是添加 void CUsb_vedioDlg::OnTimer(UINT nIDEvent)
{ // // // // // // // // // // // TODO: Add your message handler code here and/or call default myJoystick1.PollDevice(); int i,j; //检测是否有面按下,注意面 1-4 分别对应变量 m_S[1]-m_S[4] for (i=1;i<=4;i++) { if (myJoystick1.IsJoystickFire(i-1)) { if (m_s[i]==false) m_s[i]=true; else m_s[i]=false; } } if (myJoystick1.IsJoystickFire(0)) { if (m_s1==false) else m_s1=true; m_s1=false; } if (myJoystick1.IsJoystickFire(1)) { if (m_s2==false) m_s2=true; else m_s2=false; } if (myJoystick1.IsJoystickFire(2)) { if (m_s3==false) m_s3=true; else m_s3=false; } if (myJoystick1.IsJoystickFire(3)) { if (m_s4==false) m_s4=true; else m_s4=false; }
//判断是否按下了 左键 if(myJoystick1.IsJoystickLeft()) m_left=true; else m_left=false; //判断是否按下 右键 if(myJoystick1.IsJoystickRight()) m_right=true; else m_right=false; //判断是否按下 上键 if(myJoystick1.IsJoystickUp()) m_forward=true; else m_forward=false; //判断是否按下 下键 if(myJoystick1.IsJoystickDown()) m_back=true; else m_back=false; //判断是否按下 张开键 if (myJoystick1.IsJoystickFire(5)) m_up=true; else m_up=false; //判断是否按下 闭合键 if (myJoystick1.IsJoystickFire(7)) m_unfold=true; else m_unfold=false; //判断是否按下 加速键 if (myJoystick1.IsJoystickFire(4)) m_down=true; else m_down=false; //判断是否按下 减速键 if (myJoystick1.IsJoystickFire(6))m_up=true; else m_up=false; //速度加减 UpdateData(FALSE); CDialog::OnTimer(nIDEvent); // // } 注意要修改成员变量 m_等等 出现报错 OnTimer member function not declared in 'CJoy_Send1Dlg' 没定义 查看 建立类向导 Messages 找到 WM_Time ADD function 就可以了 即不能直接复制 ontime 函数 实验结果:结果是成功的,注意到初始化采用的初始化和以前 的是有一些不一样的,而且右边是选择电机,即这方面也有一些 不同,体现在初始化函数和 ontime 函数里面,如果在实现发送, 执行函数等等,就参考 Robot1Dlg 了。 扩展,如暑假是的那个 robot 上位机
添加摄像头 加入 VidiconCapture.cpp 和 VidiconCapture.h 设置好 include 和 lib 的路径 D:\DIRECTX9.0000\SAMPLES\C++\DIRECTSHOW\BASECLASSES 没添加上述的话就出现找不到 mtype //这个必须要 要不然报错 在 dlg。H 文件中添加#include "VidiconCapture.h" 在 class CJoy_Send1Dlg : public CDialog { // Construction public: CJoy_Send1Dlg(CWnd* pParent = NULL); // standard constructor 这个是添加的 CVidiconCapture m_vc; 添加初始化函数 在 BOOL CJoy_Send1Dlg::OnInitDialog()添加 //视频初始化 m_vc.Init(); CWnd* pWnd=GetDlgItem(IDC_VEDIO); HWND hwnd=pWnd->GetSafeHwnd(); CRect re; ::GetWindowRect(hwnd,&re); m_vc.SetPlayWindow(hwnd,CRect(0,0,re.right-re.left,re.bottom-re.top)); m_vc.Run(); 成员变量 public 类型:CvidiconCapture 名字: m_vc; (这个和上述的重复 了 此 时 出 现 fatal error C1083: Cannot open include file: 'mtype.h': No such file or directory(原因上述也有了) 还有一个值得注意的就是 dinput.lib 和 dxguid.lib,这个是手柄的 lib,设置好 lib 路径也可以 ,即不用拷贝到当前工程下也行,但是应该拷贝到当前工程下就不 用添加好路径的 。。 上述完成后,,但是现在还是出现了问题 VidiconCapture.obj error _PIN_CATEGORY_CAPTURE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; _IID_ISampleGrabber VidiconCapture.obj : _CLSID_SampleGrabber Debug/Joy_Send1.exe : fatal error LNK1120: 17 unresolved externals 执行 link.exe 时出错. unresolved LNK2001: external LNK2001: unresolved external symbol : error symbol 这应该是缺少了一个步骤导致的结果。有待找出 百度 unresolved external symbol _PIN_CATEGORY_CAPTURE
原因::http://www.cnblogs.com/me115/archive/2010/11/12/1875747.html 然后就应该是缺少一些 lib project-->settings-->Link-->Object/Library modules 中加入库 strmbasd.lib 和 winmm.lib,在 编译,插上手柄和摄像头即可。 注明:有时候目录的次序也有可能引起错误!!! D:\MSSDK\INCLUDE 放在第一个!!!! 总结 步骤: 新建 mfc 工程,将四个(Joystick 对应两个,usb_device 对应两个)添加到工程,设置好工程 project-->settings-->Link-->Object/Library modules 中加入库 strmbasd.lib 和 winmm.lib 和设置好目录(注意顺序可以引起错误) 弄好界面后,为每个 joy 的那个添加好成员变量,Joy_Send1Dlg.cpp 中#include "DIJoystick.h" 和#include "VidiconCapture.h" Dlg。H 中添加#include "VidiconCapture.h" CDIJoystick myJoystick1;//定义了一个类对象(这个是在 Dlg。Cpp 中定义) CVidiconCapture m_vc; 这个是在 Dlg。H 中定义的 然后再 init 里面添加初始化函数 然后查看 建立类向导 Messages 找到 WM_Time ADD function 就可以了 填写 ontimer 函数就可以了!! 手柄使用指南 if (myJoystick1.IsJoystickFire(0)) { if (m_1==false) m_1=true; else m_1=false; } if (myJoystick1.IsJoystickFire(1)) { if (m_2==false) m_2=true; else m_2=false; } if (myJoystick1.IsJoystickFire(2)) {
} if (myJoystick1.IsJoystickFire(3)) { if (m_3==false) m_3=true; else m_3=false; if (m_4==false) m_4=true; else m_4=false; } if (myJoystick1.IsJoystickFire(8)) { if (m_Select==false) m_Select=true; else m_Select=false; } //判断是否按下了 左键 if(myJoystick1.IsJoystickLeft()) m_Left=true; else m_Left=false; //判断是否按下 右键 if(myJoystick1.IsJoystickRight()) m_Right=true; else m_Right=false; //判断是否按下 上键 if(myJoystick1.IsJoystickUp()) m_Up=true; else m_Up=false; //判断是否按下 下键 if(myJoystick1.IsJoystickDown()) m_Down=true; else m_Down=false; //判断是否按下 张开键 if (myJoystick1.IsJoystickFire(5)) m_R1=true; else m_R1=false; //判断是否按下 闭合键 if (myJoystick1.IsJoystickFire(7)) m_R2=true; else m_R2=false; //判断是否按下 加速键 if (myJoystick1.IsJoystickFire(4)) m_L1=true; else m_L1=false; //判断是否按下 减速键 if (myJoystick1.IsJoystickFire(6))m_L2=true; else m_L2=false; //速度加减
分享到:
收藏