您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > VC.net > 正文
VC.NET的Direct3D极速入门宝典
[文章信息]
作者:fireseed
时间:2004-05-29
出处:论坛
责任编辑:方舟
[文章导读]
我的这篇文章适合那些很懒但想快速入门、不懂英文或编程知识很欠缺的人看
advertisement
热点推荐
· 天极网软件频道改版调查
· 25软件精选 Excel分页汇总
· 提升Win XP性能的20个特殊技巧
· 图解JBuilderX安装与实践
· Fireworks国画:葡萄小鸡图
[正文]

1 2 3  下一页

  听说DirectX9.0发布了吗?如果没有,你现在也应该听我说过了,那就去http://download.microsoft.com/download/b/6/a/b6ab32f3-39e8-4096-9445-d38e6675de85/dx90bsdk.exe下载一个最新的DirectX9.0的SDK,因为我将使用D3D9来进行全文的讲解。其实DirectX9.0里有非常详细的教程和参考,大多数人只需要看看这些帮助就可以自己学习D3D了,我的这篇文章适合那些很懒但想快速入门、不懂英文或编程知识很欠缺的人看。装好DirectX9.0后,打开VC.net,新建一个Win32工程,在StdAfx.h里添加下面的语句:



#include <d3d9.h> // D3D标准头文件
#include <D3dx9math.h> // D3D数学库头文件
#include <stdio.h> // 这个不用我说了吧?
#pragma comment( lib, "d3d9" ) // D3D的静态库
#pragma comment( lib, "d3dx9" ) // D3D数学库的静态库

  然后把winmain所在文件的代码做如下的修改:

#include "stdafx.h"
#define MAX_LOADSTRING 100

HINSTANCE g_hInst;
HWND g_hWnd;
IDirect3D9 *g_pD3D;
IDirect3DDevice9 *g_pd3dDevice;
IDirect3DVertexBuffer9 *g_pVB;

TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void OnIdle( void );
void OnCreate( HWND hWnd );
HRESULT InitD3D( void );
HRESULT CreateObject( void );
void ReleaseD3D( void );
HRESULT SetModalMatrix( void );
HRESULT SetProjMatrix( WORD wWidth, WORD wHeight );
void BeforePaint( void );
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
 MSG msg;
 HACCEL hAccelTable;

 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 LoadString(hInstance, IDC_D3DTEST, szWindowClass, MAX_LOADSTRING);
 MyRegisterClass(hInstance);

 if (!InitInstance (hInstance, nCmdShow))
 {
  return FALSE;
 }

 hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_D3DTEST);

 while ( true )
 {
  if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
  {
   if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
   {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
  continue;
  }
  if ( WM_QUIT == msg.message )
  {
   break;
  }
  OnIdle();
 } 
 UnregisterClass( szWindowClass, g_hInst );
 return (int)msg.wParam;
}

ATOM MyRegisterClass( HINSTANCE hInstance )
{
 WNDCLASSEX wcex;
 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.style = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc = (WNDPROC)WndProc;
 wcex.cbClsExtra = 0;
 wcex.cbWndExtra = 0;
 wcex.hInstance = hInstance;
 wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_D3DTEST);
 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName = (LPCTSTR)IDC_D3DTEST;
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
 return RegisterClassEx(&wcex);
}

BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
 g_hInst = hInstance;
 CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL );
 if ( !g_hWnd )
 {
  return FALSE;
 }
 ShowWindow( g_hWnd, nCmdShow );
 UpdateWindow( g_hWnd );
 return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 int wmId, wmEvent;
 switch (message)
 {
  case WM_CREATE:
   OnCreate( hWnd );
   break;
  case WM_COMMAND:
   wmId = LOWORD(wParam);
   wmEvent = HIWORD(wParam);
   switch (wmId)
   {
    case IDM_EXIT:
     DestroyWindow(hWnd);
     break;
    default:
     return DefWindowProc(hWnd, message, wParam, lParam);
   }
   break;
  case WM_SIZE:
   SetProjMatrix( LOWORD( lParam ), HIWORD( lParam ) );
   break;
  case WM_DESTROY:
   ReleaseD3D();
   PostQuitMessage(0);
   break;
  default:
   return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
}

void OnCreate( HWND hWnd )
{
 g_hWnd = hWnd;
 InitD3D();
 CreateObject();
}

void ReleaseD3D( void )
{
}

HRESULT InitD3D( void )
{
 return S_OK;
}

void BeforePaint( void )
{
}

HRESULT CreateObject( void )
{
 return S_OK;
}

void OnIdle( void )
{
}

HRESULT SetModalMatrix( void )
{
 return S_OK;
}

HRESULT SetProjMatrix( WORD wWidth, WORD wHeight )
{
 return S_OK;
}

  上面的代码仅是一个框架,仔细研究过上篇文章的朋友应该非常清楚这些代码的含意,不过我还是需要大至讲解一下。 在InitInstance函数中,初始化程序实例的开始,我们将该实例的句柄放到全局变量中去,以便以后使用:

g_hInst = hInstance;

  在创建窗体时,我并没有直接将CreateWindow的返回值——创建成功的窗体句柄赋给全局变量g_hWnd,因为CreateWindow函数在执行中会引发几个消息,其中有WM_CREATE,在这个消息的处理函数中OnCreate中,我执行了下面的语句:

g_hWnd = hWnd;

  这样,我们就可以早一点用到g_hWnd了。SetProjMatrix是设置投影矩阵的,投影矩形仅受窗口纵横比影响,所以在WM_SIZE事件时调用时就可以了。而SetModalMatrix是设置模型矩阵的,也就是眼睛点和视点之类的东东,所以它一定要在Rander的时候,准确的说是在Render之前执行。InitD3D在窗体创建时调用,用于初始化D3D设备。CreateObject和InitD3D一样是初始化函数,它用于创建三维对象。


1 2 3  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 解析C++中的内部连接与外部连接
  • C++实现三维视图绘制与消隐技术
  • C++中指针的使用艺术
  • 可怜的Bool——浅析程序可扩展性
  • Visual C++.NET DirectShow编程
  • 深入解析C++中的三个修饰符
  • 盘符混乱咋办 拨乱反正有巧招
  • MotherBoard Monitor入门篇
  • MotherBoard Monitor进阶篇
  • 如何买到一部称心的品牌电脑
  • 关注!国内首款GeForce 6200显卡曝光
  • 《魔兽世界》角色扮演游戏壁纸
  • 天极缉拿假IE4.0为首的仿冒鼠
  • 《魔兽世界》Q版人物头像集
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索