📄 canvasframe.cpp
字号:
// canvasFrame.cpp : implementation file
//
#define DIRECTINPUT_VERSION 0x0700
#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
struct bullet //声明子弹结构
{
int x; //X坐标
int y; //Y坐标
BOOL exist; //是否存在
};
/////////////////////////////////////////////////////////////////////////////
// canvasFrame
IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
LPDIRECTINPUT7 pDI; //声明 DirectInput 对象指针
LPDIRECTINPUTDEVICE7 pDJS; //声明输入装置对象指针
HRESULT result; //声明 HRESULT 类型变量
DIDEVCAPS JSCap; //声明摇杆特性结构
DIJOYSTATE JState; //声明摇杆状态结构
int x,y,xlast,ylast;
bullet b[200]; //声明子弹数组
int bcount=0; //子弹数
int i;
canvasFrame::canvasFrame()
{
Create(NULL,"绘图窗口");
CClientDC dc(this);
int width = dc.GetDeviceCaps(HORZRES);
int height = dc.GetDeviceCaps(VERTRES);
GetWindowRect( &rect );
width = ( width - ( rect.right - rect.left ))/2 ;
height = (height - (rect.bottom - rect.top ))/2 ;
MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
GetClientRect(&rect);
ClientToScreen(&rect); //转换坐标
mdc = new CDC;
mdc1 = new CDC;
mdc->CreateCompatibleDC(&dc);
mdc1->CreateCompatibleDC(&dc);
bitmap = new CBitmap;
bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"ship.bmp",IMAGE_BITMAP,100,74,LR_LOADFROMFILE); //载入图文件
mdc->SelectObject(bitmap);
bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"bullet1.bmp",IMAGE_BITMAP,32,15,LR_LOADFROMFILE); //载入图文件
mdc1->SelectObject(bitmap);
x = ((rect.right-rect.left) - 100)/2;
y = ((rect.bottom-rect.top) - 100)/2;
::ShowCursor(false); //取消鼠标光标
ScreenToClient(&rect); //转换坐标
}
canvasFrame::~canvasFrame()
{
delete bitmap;
delete mdc;
delete mdc1;
pDJS->Release();
pDI->Release();
}
BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
//{{AFX_MSG_MAP(canvasFrame)
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers
BOOL CALLBACK Joysticks(LPCDIDEVICEINSTANCE lpddi,LPVOID pvRef)
{
result = pDI->CreateDeviceEx( lpddi->guidInstance,IID_IDirectInputDevice7,
(VOID**)&pDJS, NULL );
if(result != DI_OK)
return DIENUM_CONTINUE;
else
return DIENUM_STOP;
}
BOOL CALLBACK Objects(LPCDIDEVICEOBJECTINSTANCE lpddoi,LPVOID pvRef)
{
DIPROPRANGE dr;
dr.diph.dwSize = sizeof(DIPROPRANGE);
dr.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dr.diph.dwHow = DIPH_BYOFFSET;
dr.diph.dwObj = lpddoi->dwOfs; //取得轴的类型
switch( lpddoi->dwOfs )
{
case DIJOFS_X:
dr.lMin = -100;
dr.lMax = 100;
result = pDJS->SetProperty(DIPROP_RANGE,&dr.diph);
if(result != DI_OK)
MessageBox(NULL,"设定轴范围失败!","错误信息",MB_OK);
break;
case DIJOFS_Y:
dr.lMin = -50;
dr.lMax = 50;
result = pDJS->SetProperty(DIPROP_RANGE,&dr.diph);
if(result != DI_OK)
MessageBox(NULL,"设定轴范围失败!","错误信息",MB_OK);
break;
case DIJOFS_Z:
//设定 z 方向轴范围的程序代码(略)
break;
case DIJOFS_RX:
//设定 x 旋转轴范围的程序代码(略)
break;
case DIJOFS_RY:
//设定 y 旋转轴范围的程序代码(略)
break;
case DIJOFS_RZ:
//设定 z 旋转轴范围的程序代码(略)
break;
case DIJOFS_SLIDER(0):
//设定滑轴 1 范围的程序代码(略)
break;
case DIJOFS_SLIDER(1):
//设定滑轴 2 范围的程序代码(略)
break;
}
return DIENUM_CONTINUE;
}
int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
HINSTANCE hinst = AfxGetInstanceHandle();
result = DirectInputCreateEx(hinst, DIRECTINPUT_VERSION,IID_IDirectInput7, (LPVOID*)&pDI, NULL );
if(result != DI_OK)
MessageBox("建立 DirectInput 对象失败!");
result = pDI->EnumDevices(DIDEVTYPE_JOYSTICK, Joysticks,
NULL, DIEDFL_ATTACHEDONLY ); //列举摇杆装置
if(result != DI_OK)
MessageBox("列举摇杆失败!");
if(pDJS == NULL) //判断是否找到摇杆
MessageBox("无可使用的摇杆装置!");
result = pDJS->SetDataFormat(&c_dfDIJoystick);
if(result != DI_OK)
MessageBox("设定数据格式失败!");
result = pDJS->SetCooperativeLevel(m_hWnd, DISCL_EXCLUSIVE|DISCL_BACKGROUND );
if(result != DI_OK)
MessageBox("设定协调层级失败!");
JSCap.dwSize = sizeof(JSCap);
result = pDJS->GetCapabilities(&JSCap);
if(result != DI_OK)
MessageBox("取得摇杆特性失败!");
result = pDJS->EnumObjects(Objects, (VOID*)m_hWnd,DIDFT_AXIS);
if(result != DI_OK)
MessageBox("列举摇杆组件失败!");
result = pDJS->Acquire();
if(result != DI_OK)
MessageBox("取得摇杆装置失败!");
SetTimer(1,1,NULL);
return 0;
}
void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
if( nChar== VK_ESCAPE ) //判断是否按下 Esc 键
PostMessage(WM_CLOSE ); //传送WM_CLOSE信息
CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
}
void canvasFrame::OnTimer(UINT nIDEvent)
{
CFrameWnd::OnTimer(nIDEvent);
CClientDC dc(this);
result = pDJS->Poll(); //检测摇杆
if(result != DI_OK && result != DI_NOEFFECT)
MessageBox("检测摇杆失败!");
result = pDJS->GetDeviceState( sizeof(JState), &JState );
if (result != DI_OK)
MessageBox("取得摇杆状态失败!");
x += JState.lX; //设定飞机图示的 X 坐标
y += JState.lY; //设定飞机图示的 Y 坐标
if(x<rect.left) //是否已至左边界
x = rect.left;
if(x>rect.right-100) //是否已至右边界
x = rect.right-100;
if(y<rect.top) //是否已至上边界
y = rect.top;
if(y>rect.bottom-74) //是否已至下边界
y = rect.bottom-74;
dc.BitBlt(xlast,ylast,100,74,mdc,0,0,WHITENESS); //覆盖上次的贴图
xlast = x;
ylast = y;
if(JState.rgbButtons[0] & 0x80) //判断是否按下发射子弹钮
{
for(i=0;i<200;i++)
{
if(b[i].exist == false)
{
b[i].x = x;
b[i].y = y+30;
b[i].exist = true;
bcount++;
break;
}
}
}
if(JState.rgbButtons[1] & 0x80) //是否按下结束钮
PostMessage(WM_CLOSE ); //传送WM_CLOSE信息
if(bcount != 0)
for(i=0;i<200;i++)
{
dc.BitBlt(b[i].x,b[i].y,32,15,mdc1,0,0,SRCCOPY);
b[i].x -=17;
if(b[i].x<-30)
{
b[i].exist = false;
bcount--;
}
}
dc.BitBlt(x,y,100,74,mdc,0,0,SRCCOPY); //贴上飞机
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -