初学DirectX的一些问题~~~~~~~~~~ 1、我使用的是VS2005,想用MFC来建立一个Directx工程,看有些资料上说有新建“Directx工程”的项目,但是VS2005里面没有。应该如何在VS2005里建立一个Directx的MFC模板呢?2、看到Directx的一些例子都有过渡效果的按钮,那些按钮是怎么做的?各位来解答啊~~ O(∩_∩)O谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建立一个win32项目 然后把下面代码打进#include <d3d9.h>#include <D3Dx9core.h>//-----------------------------------------------------------------------------// 全局变量//-----------------------------------------------------------------------------LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象ID3DXMesh* Text = 0;WCHAR* CharToWChar(char* _Char){ size_t aLen = strlen(_Char)+1; int wLen = MultiByteToWideChar(CP_ACP,0,_Char,(int)aLen,NULL,0); WCHAR* _WChar = new WCHAR[wLen]; MultiByteToWideChar(CP_ACP,0,_Char,(int)aLen,_WChar,wLen); return _WChar;}char* WCharToChar(WCHAR* _WChar){ size_t wLen = wcslen(_WChar)+1; int aLen = WideCharToMultiByte(CP_ACP,0,_WChar,(int)wLen,NULL,0,NULL,NULL); char* _Char = new char[aLen]; WideCharToMultiByte(CP_ACP,0,_WChar,(int)wLen,_Char,aLen,NULL,NULL); return _Char;}//-----------------------------------------------------------------------------// Desc: 初始化Direct3D//-----------------------------------------------------------------------------HRESULT InitD3D( HWND hWnd ){ //创建Direct3D对象, 该对象用来创建Direct3D设备对象 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //创建Direct3D设备对象 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } HDC hdc = CreateCompatibleDC( 0 ); // Fill out a LOGFONT structure that describes the font’s properties. LOGFONT lf; ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = 25; // in logical units lf.lfWidth = 12; // in logical units lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold) lf.lfItalic = false; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfCharSet = DEFAULT_CHARSET; // // font style //WCHAR ch[]={L"华文彩艺"}; // lf.lfFaceName=CharToWChar("华文彩艺"); //wcstrcpy(lf.lfFaceName, ch); // Create a font and select that font with the device context. HFONT hFont; HFONT hFontOld; hFont = CreateFontIndirect(&lf); hFontOld = (HFONT)SelectObject(hdc, hFont); // Create the 3D mesh of text. D3DXCreateText(g_pd3dDevice, hdc, L"Direct3D", 0.001f, 0.4f, &Text, 0, 0); // Reselect the old font, and free resources. SelectObject(hdc, hFontOld); DeleteObject( hFont ); DeleteDC( hdc ); return S_OK;}//-----------------------------------------------------------------------------// Desc: 释放创建对象//-----------------------------------------------------------------------------VOID Cleanup(){ //释放Direct3D设备对象 if( g_pd3dDevice != NULL) g_pd3dDevice->Release(); //释放Direct3D对象 if( g_pD3D != NULL) g_pD3D->Release();}//-----------------------------------------------------------------------------// Desc: 渲染图形//-----------------------------------------------------------------------------VOID Render(){ //清空后台缓冲区 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 ); //开始在后台缓冲区绘制图形 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { //在此在后台缓冲区绘制图形 Text->DrawSubset( 0 ); //结束在后台缓冲区渲染图形 g_pd3dDevice->EndScene(); } //将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice->Present( NULL, NULL, NULL, NULL );}//-----------------------------------------------------------------------------// Desc: 消息处理//-----------------------------------------------------------------------------LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){ switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; case WM_PAINT: Render(); ValidateRect( hWnd, NULL ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam );}//-----------------------------------------------------------------------------// Desc: 程序入口//-----------------------------------------------------------------------------INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ){ //注册窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ClassName", NULL }; RegisterClassEx( &wc ); //创建窗口 HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序", WS_OVERLAPPEDWINDOW, 200, 100, 600, 500, NULL, NULL, wc.hInstance, NULL ); //初始化Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { //显示主窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); //进入消息循环 MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { Render(); //渲染图形 } } } UnregisterClass( L"ClassName", wc.hInstance ); return 0;}关于里面的控件 那是directX里面的控件 你看看相关的书就会知道了 Directx的MFC模板.......应该没有,只有自己建立MFC程序然后往里面添加代码,DXUT控件都是用图片画上去的,仔细看例子下面的CustomUI程序 这些代码的作用是什么?我是想做MFC开发Directx。 1、directx目前还没有像mfc那样封装过的类库,全是api,不是三言两语可以教会你的。买本基础书,然后下个开源引擎慢慢研究才是捷径。2、过渡效果(渐变)就是帧动画,比如一张图片在一秒内绘制25次,透明度从100%到0,你就会看到过渡效果。更多知识可以去查看“动画原理”。 强烈建议你不要现在就使用MFC,你最终还是要了解SDK的,MFC会浪费你很多无谓的时间。 直接用SDK。函数名不好记,多写代码,会发现很多问题 控件都是DXUT画得, 有sdk里面有专门得例子 我看到例子里的DXUT工具了,谢谢~ 关于两台计算机通过网络进行数据传输的问题 VC++里的ODBC+ACCESS编程里绑定数据出现了问题,等待解决中…… 抓图的问题。(如何避免窗口的遮挡和隐藏导致的指定窗口没有被抓到图) 用CTabControl控件组合了几个子对话框,但对话框中的控件在按下键盘上的键时消失了??? 关于 一 个 内存池 的简单问题~~~ 在线截贴 给分!! ^_^怎样配置ODBC源^_^ 捕获不到异常 这个问题真的很让人郁闷,烦大家给指点指点!!!(&%$$#%$%#) 有谁安装了MSDN2002? (纯属交流) 关于winpcap过滤问题? 像网络电视一样可以使视区精简模式 基于VFW视频开发的问题
#include <d3d9.h>
#include <D3Dx9core.h>//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象
ID3DXMesh* Text = 0;
WCHAR* CharToWChar(char* _Char)
{
size_t aLen = strlen(_Char)+1;
int wLen = MultiByteToWideChar(CP_ACP,0,_Char,(int)aLen,NULL,0);
WCHAR* _WChar = new WCHAR[wLen];
MultiByteToWideChar(CP_ACP,0,_Char,(int)aLen,_WChar,wLen);
return _WChar;
}
char* WCharToChar(WCHAR* _WChar)
{
size_t wLen = wcslen(_WChar)+1;
int aLen = WideCharToMultiByte(CP_ACP,0,_WChar,(int)wLen,NULL,0,NULL,NULL);
char* _Char = new char[aLen];
WideCharToMultiByte(CP_ACP,0,_WChar,(int)wLen,_Char,aLen,NULL,NULL);
return _Char;
}//-----------------------------------------------------------------------------
// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
//创建Direct3D对象, 该对象用来创建Direct3D设备对象
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL; //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //创建Direct3D设备对象
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
} HDC hdc = CreateCompatibleDC( 0 ); // Fill out a LOGFONT structure that describes the font’s properties. LOGFONT lf; ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = 25; // in logical units lf.lfWidth = 12; // in logical units lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold) lf.lfItalic = false; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfCharSet = DEFAULT_CHARSET; // // font style
//WCHAR ch[]={L"华文彩艺"};
// lf.lfFaceName=CharToWChar("华文彩艺");
//wcstrcpy(lf.lfFaceName, ch);
// Create a font and select that font with the device context. HFONT hFont; HFONT hFontOld; hFont = CreateFontIndirect(&lf); hFontOld = (HFONT)SelectObject(hdc, hFont); // Create the 3D mesh of text.
D3DXCreateText(g_pd3dDevice, hdc, L"Direct3D", 0.001f, 0.4f, &Text, 0, 0); // Reselect the old font, and free resources. SelectObject(hdc, hFontOld); DeleteObject( hFont ); DeleteDC( hdc );
return S_OK;
}
//-----------------------------------------------------------------------------
// Desc: 释放创建对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
//释放Direct3D设备对象
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release(); //释放Direct3D对象
if( g_pD3D != NULL)
g_pD3D->Release();
}
//-----------------------------------------------------------------------------
// Desc: 渲染图形
//-----------------------------------------------------------------------------
VOID Render()
{
//清空后台缓冲区
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
//开始在后台缓冲区绘制图形
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
//在此在后台缓冲区绘制图形
Text->DrawSubset( 0 );
//结束在后台缓冲区渲染图形
g_pd3dDevice->EndScene();
} //将在后台缓冲区绘制的图形提交到前台缓冲区显示
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0; case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
} return DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// Desc: 程序入口
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
//注册窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L"ClassName", NULL };
RegisterClassEx( &wc ); //创建窗口
HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序",
WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
NULL, NULL, wc.hInstance, NULL ); //初始化Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
//显示主窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd ); //进入消息循环
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render(); //渲染图形
}
}
} UnregisterClass( L"ClassName", wc.hInstance );
return 0;
}
关于里面的控件 那是directX里面的控件 你看看相关的书就会知道了
DXUT控件都是用图片画上去的,仔细看例子下面的CustomUI程序
这些代码的作用是什么?我是想做MFC开发Directx。
2、过渡效果(渐变)就是帧动画,比如一张图片在一秒内绘制25次,透明度从100%到0,你就会看到过渡效果。更多知识可以去查看“动画原理”。
我看到例子里的DXUT工具了,谢谢~