【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1970|回复: 0

用MFC构造DirectX应用框架[转载]

[复制链接]
发表于 2009-5-13 20:05:07 | 显示全部楼层 |阅读模式

err=%d",ddrval);

return FALSE;

}

ddrval=lpDD->SetDisplayMode(GModeX,GModeY,GBPP);

if(ddrval!=DD_OK)

{

Msg("SetDisplayMode failed

err=%d",ddrval);

return FALSE;

}

//check capabilites

DDCAPS ddcaps;

ddcaps.dwSize=sizeof(ddcaps);

ddrval=lpDD->GetCaps(&ddcaps,NULL);

if(ddrval!=DD_OK)

{

Msg("GetCaps failed err=%d",ddrval);

return FALSE;

}

if(ddcaps.dwCaps&DDCAPS_NOHARDWARE)

{

Msg("No hardware support at all");

}

//default to double buffered on 1mb,triple buffered

if(nBufferCount==0)

{

if(ddcaps.dwVidMemTotal<=1024L*1024L*(GBPP/8)||GModeX>640)

{

nBufferCount=2;

}

else

{

nBufferCount=3;

}

}

DDSURFACEDESC ddsd;

::ZeroMemory(&ddsd,sizeof(ddsd));

ddsd.dwSize=sizeof(ddsd);

ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;

ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;

ddsd.dwBackBufferCount=nBufferCount-1;

ddrval=lpDD->CreateSurface(&ddsd,&lpFrontBuffer,NULL);

if(ddrval!=DD_OK)

{

Msg("CreateSurface failed

err=%d",ddrval);

return FALSE;

}

else Msg("显示内存允许建立的缓冲区数=%d(最多需要3)",nBufferCount);

DDSCAPS ddscaps;

ddscaps.dwCaps=DDSCAPS_BACKBUFFER;

ddrval=lpFrontBuffer->GetAttachedSurface(&ddscaps,&lpBackBuffer);

if(ddrval!=DD_OK)

{

Msg("GetAttachedsurface failed

err=%d",ddrval);

return FALSE;

}

return TRUE;

}

void CDirectXWnd::Msg(LPSTR fmt,...)

{

char buff[256];

va_list va;

lstrcpy(buff,"DirectxWnd:");

va_start(va,fmt);

wvsprintf(&buff[lstrlen(buff)],fmt,va);

va_end(va);

lstrcat(buff,"\r\n");

AfxMessageBox(buff);

}

////////////////////////Virtual Function

BOOL CDirectXWnd::RestoreSurfaces()

{

HRESULT ddrval;

ddrval=lpFrontBuffer->Restore();

if(ddrval!=DD_OK)

return FALSE;

return TRUE;

}

BOOL CDirectXWnd::CleanSurface()

{

if(lpBackBuffer)

{

lpBackBuffer->Release();

lpBackBuffer=NULL;

}

if(lpFrontBuffer)

{

lpFrontBuffer->Release();

lpFrontBuffer=NULL;

}

return TRUE;

}

void CDirectXWnd::UpdateFrame()

{

}

BEGIN_MESSAGE_MAP(CDirectXWnd,CWnd)

//{{AFX_MSG_MAP(CDirectXWnd,Cwnd)

ON_WM_KEYDOWN()

ON_WM_ACTIVATEAPP()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

///////////////////CDirectXWnd message handlers

void CDirectXWnd::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)

{

switch(nChar)

{

case VK_ESCAPE:

case VK_F12:

PostMessage(WM_CLOSE);

break;

}

CWnd::OnKeyDown(nChar,nRepCnt,nFlags);

}

void CDirectXWnd::OnActivateApp(BOOL bActive,HTASK hTask)

{

CWnd::OnActivateApp(bActive,hTask);

blsActive=bActive;

return;

}

请下载:1、DirectX.zip,工程框架源文件;2、

href="http://webking.online.jn.sd.cn/secondlife/application/CTestWnd.zip">CTestWnd.zip,测试程序源文件。

使用这两个源程序时不要直接编译,因为没有包含编译需要的所有文件,而应该根据本文提示做,需要输入代码的时候,将该文件替换成下载包中的相应文件就可以。另外,请在运行时不要用ALT+TAB切换出来,否则会被锁住,非Reset不可。要想不被锁住,请深入研究DirectDraw技术修改此程序。

color="#0000FF">----无心柳

本文摘自《计算机编程技巧与维护》杂志1999年第3期

整理:无心柳(全部代码已经输入测试通过)1999/11/02

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 10:11

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表