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;
//速度加减