// @time: 2012.3.26
// @author: jadeshu
// des: DirectX键盘控制程序
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <atlstr.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h> #define ReleaseD3D(x) if (x!=NULL){x->Release();x=NULL;}
#pragma comment(lib,"winmm.lib") #pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dinput8.lib")
#pragma comment(lib, "dxguid.lib") //全局变量
TCHAR g_szWindowName[]=_T("DirectX键盘控制程序");
BOOL bActive = TRUE;
char g_pKeyStateBuffer[256]={0};
//定义设备接口
IDirect3DDevice9 * g_pd3dDevice=NULL; LPDIRECTINPUT8 g_pDirectInput=NULL; //DirectInput接口
LPDIRECTINPUTDEVICE8 g_pKeyboardDevice=NULL; //键盘输入接口
LPD3DXMESH g_pMeshTeapot=NULL; //茶壶网格对象 //回调函数声明
LRESULT CALLBACK WinProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
//初始化Direct3D函数声明
HRESULT Init3D(HWND hwnd,HINSTANCE hinstance);
//渲染声明
VOID Render();
//清除对象声明
VOID Cleanup(); //读取设备的输入数据
BOOL ReadDevice(IDirectInputDevice8 *pDIDevice,void *pBuffer,long ISize); //主函数
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//定义窗口类结构
TCHAR szAppName[]=TEXT("ClassN");
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
ZeroMemory(&msg,sizeof(msg));
wc.cbClsExtra=0;
wc.cbSize=sizeof(WNDCLASSEX);
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(hInstance,IDC_ARROW);
wc.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
wc.hIconSm=NULL;
wc.hInstance=hInstance;
wc.lpfnWndProc=WinProc;
wc.lpszClassName=szAppName;
wc.lpszMenuName=NULL;
wc.style=CS_HREDRAW|CS_VREDRAW;
//注册窗口
RegisterClassEx(&wc);
//创建窗口
hwnd=CreateWindow(szAppName,g_szWindowName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,0);
//加载3D初始化
if (FAILED(Init3D(hwnd,hInstance)))
{
return FALSE;
}
//显示和更新窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd); //消息循环
while (WM_QUIT!=msg.message)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//转换消息
TranslateMessage(&msg);
//投递消息
DispatchMessage(&msg);
}
else if(bActive)
{
//渲染
Render();
}
else
{
if(!WaitMessage())
return -1;
}
}
//删除注册窗口
UnregisterClass(szAppName,hInstance);
return msg.wParam; } //回调函数
LRESULT CALLBACK WinProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_PAINT:
Render(); //渲染
ValidateRect(hwnd,NULL); //更新窗口
return 0;
case WM_ACTIVATEAPP:
bActive = (BOOL)wParam;
break;
case WM_DESTROY:
Cleanup(); //清除对象
PostQuitMessage(0); //退出消息循环
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam); //返回默认消息
} //Direct3D初始化
HRESULT Init3D(HWND hwnd,HINSTANCE hinstance)
{
IDirect3D9 *pD3D=NULL; //定义对象接口
pD3D=Direct3DCreate9(D3D_SDK_VERSION); //创建对象接口
if (NULL==pD3D)
{
return E_FAIL;
}
D3DCAPS9 caps; //获取硬件设备信息
int vp=0;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if (caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
} //创建Direct3D设备接口
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.BackBufferCount=1;
d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
d3dpp.BackBufferHeight=640;
d3dpp.BackBufferWidth=480;
d3dpp.EnableAutoDepthStencil=FALSE;
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.hDeviceWindow=hwnd;
d3dpp.MultiSampleQuality=0;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed=TRUE; if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
{
return E_FAIL;
}
D3DXCreateTeapot(g_pd3dDevice,&g_pMeshTeapot,0); //创建茶壶集合体 //创建DirectInput设备
DirectInput8Create(hinstance,0x0800,IID_IDirectInput8,(void **)&g_pDirectInput,NULL);
//创建键盘设备
g_pDirectInput->CreateDevice(GUID_SysKeyboard,&g_pKeyboardDevice,NULL);
//设置数据格式和协作级别
g_pKeyboardDevice->SetDataFormat(&c_dfDIKeyboard);
g_pKeyboardDevice->SetCooperativeLevel(hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE);
//获取设备
g_pKeyboardDevice->Acquire(); ////世界变换矩阵
//D3DXMATRIX matWorld,Rx,Ry,Rz;
//D3DXMatrixIdentity(&matWorld);
//D3DXMatrixRotationX(&Rx,/*::timeGetTime()/1000*/1.0f);
//D3DXMatrixRotationY(&Ry,/*::timeGetTime()/1000*//*1.0f*/::timeGetTime()/1000.0f);
//D3DXMatrixRotationZ(&Rz,/*::timeGetTime()/1000.0f*//*::timeGetTime()/1000*/1.0f);
//matWorld=Rx*Ry*Rz*matWorld;
//g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld); //取景变换矩阵
D3DXMATRIX matView;
D3DXVECTOR3 vEye(0.0f,0.0f,-10.0f);
D3DXVECTOR3 vAt(0.0f,0.0f,0.0f);
D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&matView,&vEye,&vAt,&vUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView); //投影变换矩阵
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4.0f,1.0f,1.0f,1000.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
pD3D->Release();
return S_OK;
} //渲染图形
VOID Render()
{
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(150,150,255),1.0f,0); //清除后台缓冲区
g_pd3dDevice->BeginScene(); //开始绘制 ::ZeroMemory(g_pKeyStateBuffer,sizeof(g_pKeyStateBuffer));
ReadDevice(g_pKeyboardDevice,g_pKeyStateBuffer,sizeof(g_pKeyStateBuffer));
////平移物体
static FLOAT fPosX=0.0f,fPosY=0.0f;
if(g_pKeyStateBuffer[DIK_A]&0x80) fPosX-=0.01f;
if(g_pKeyStateBuffer[DIK_D]&0x80) fPosX+=0.01f;
if(g_pKeyStateBuffer[DIK_W]&0x80) fPosY+=0.01f;
if(g_pKeyStateBuffer[DIK_S]&0x80) fPosY-=0.01f;
D3DXMATRIX matWorld;
D3DXMatrixTranslation(&matWorld,fPosX,fPosY,0.0f); //旋转物体
static float fAngleX=0.0f,fAngleY=0.0f,fAngleZ=0.0f;
if(g_pKeyStateBuffer[DIK_UP]&0x80) fAngleX-=0.01f;
if(g_pKeyStateBuffer[DIK_DOWN]&0x80) fAngleX+=0.01f;
if(g_pKeyStateBuffer[DIK_LEFT]&0x80) fAngleY+=0.01f;
if(g_pKeyStateBuffer[DIK_RIGHT]&0x80) fAngleY-=0.01f; D3DXMATRIX Rx,Ry;
D3DXMatrixRotationX(&Rx,fAngleX);
D3DXMatrixRotationY(&Ry,fAngleY); matWorld=Rx*Ry*matWorld;
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld); //绘制茶壶
g_pMeshTeapot->DrawSubset(0);
g_pd3dDevice->EndScene(); //结束绘制
g_pd3dDevice->Present(NULL,NULL,NULL,NULL); //从后台缓冲区复制到前台----翻转
} //清除对象,内存
VOID Cleanup()
{
g_pKeyboardDevice->Unacquire();
ReleaseD3D(g_pMeshTeapot);
ReleaseD3D(g_pKeyboardDevice);
ReleaseD3D(g_pDirectInput);
ReleaseD3D(g_pd3dDevice); //if (g_pMeshTeapot!=NULL)
//{
// g_pMeshTeapot->Release();
// g_pMeshTeapot=NULL;
//}
//if (g_pKeyboardDevice!=NULL)
//{
// g_pKeyboardDevice->Release();
// g_pKeyboardDevice=NULL;
//}
//if (g_pDirectInput!=NULL)
//{
// g_pDirectInput->Release();
// g_pDirectInput=NULL;
//}
//if (g_pd3dDevice!=NULL)
//{
// g_pd3dDevice->Release();
// g_pd3dDevice=NULL;
//} } BOOL ReadDevice(IDirectInputDevice8 *pDIDevice,void *pBuffer,long ISize)
{
HRESULT hr;
while(true)
{
/*pDIDevice->Poll();*/
pDIDevice->Acquire();
if (SUCCEEDED(hr=pDIDevice->GetDeviceState(ISize,pBuffer))) break;
if (hr!=DIERR_INPUTLOST||hr!=DIERR_NOTACQUIRED) return FALSE;
/*if (FAILED(pDIDevice->Acquire())) return FALSE */;
}
return TRUE;
}

DX9 DirectX键盘控制程序 代码的更多相关文章

  1. DX9 DirectX鼠标控制程序 代码

    代码实例1: // @time: 2012.3.26 // @author: jadeshu // des: DirectX鼠标控制程序 #include <Windows.h> #inc ...

  2. DX9 DirectX 索引缓存(IndexBuffer) 代码

    // @time: 2012.3.22 // @author: jadeshu // des: 索引缓存 //包含头文件 #include <Windows.h> #include < ...

  3. IOS开发之触摸背景关闭键盘的代码实现

    直接上代码: // 触摸背景,关闭键盘 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch ...

  4. IOS 回收键盘通用代码

    感觉IOS的键盘回收好累,所以封装了一个通用一点的方法 -(IBAction)spbResignFirstResponder:(id)sender { // NSLogObj(sender); if ...

  5. Android开发之使一打开activity等界面Edittext获取焦点,弹出软键盘java代码实现

    // 获取编辑框焦点 editText.setFocusable(true); //打开软键盘 IInputMethodManager imm = (InputMethodManager)getSys ...

  6. DX9 空间坐标变换示例代码

    // @time 2012.3.25 // @author jadeshu #include <Windows.h> #include <d3d9.h> #include &l ...

  7. iOS开发——OC篇&纯代码退出键盘

    关于iOS开发中键盘的退出,其实方法有很多中,而且笔者也也学会了不少,包括各种非纯代码界面的退出. 但是最近开始着手项目的时候却闷了,因为太多了,笔者确实知道有很多中方法能实现,而且令我影响最深的就是 ...

  8. 【好程序员笔记分享】——iOS开发之纯代码键盘退出

    -iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单)     iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...

  9. 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流

    本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...

随机推荐

  1. iOS-静态库,动态库,framework浅析(三)

    创建framework静态库 第一步,新建项目 新建项目.png 第二步,删除系统默认创建的[FMDB.h]和[FMDB.m]文件,导入需要打包的源文件. 导入源码后的工程.png 第三步,修改项目配 ...

  2. Copycat - AppendRequest

    对于Command,Configuration都要通过appendEntries的方式,把Entries同步给follower LeaderState.configure /** * Commits ...

  3. scrollView截取指定区域的图片

    把scrollView放到一个容器里面,再截图就可以了 scrollview放到容器: UIView *lunboCarrier = [[UIView alloc] initWithFrame:CGR ...

  4. 为单实例数据库配置ASM

    环境配置沿用搭建RAC的环境配置 配置ASM可以在数据库软件安装之前进行,也可以在安装完数据库软件配置数据库前进行 [root@rac01 Packages]# cd /etc/yum.repos.d ...

  5. pip技巧(加速下载和安装)

    pip技巧(linux同样) 某些开发包下载过程中会很慢,会出现timeout的情况,解决办法: 可以配置下镜像,加速下载和安装 1.python的豆瓣源地址(镜像) https://pypi.dou ...

  6. SpringBoot 文件上传实践

    背景:将上传的文件,如图片,写入指定服务器路径,保存起来.多文件上传时,由于HttpServletRequest不能直接取出文件数据,所以将其强制转换为MultipartHttpServletRequ ...

  7. mint-ui是什么?怎么使用?说出至少三个组件使用方法?

    mint-ui是基于vue的前端组件库.npm安装,然后import样式和js,vue.use(mintUi)全局引入.在单个组件局部引入:import { Toast } from 'mint-ui ...

  8. inet超级服务器和守护进程

    inetd是监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求.它可以为多种服务管理连接,当 inetd接到连接时,它能够确定连接所需的程序,启动相应的进程,并把 socke ...

  9. 如何在Digital Ocean上申请服务器的教程

    本文会详细叙述如何在digital ocean上注册.申请.创建以及配置服务器,亲测有效. what's the Digital Ocean ? 根据度娘释义,Digital Ocean是digita ...

  10. Python3学习之路~6.8 多态

    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型 ...