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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

查看: 1859|回复: 0

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

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

文件DirectXWnd.h

#if !defined(DIRECTXWND-H)

#define DIRECTXWND_H

//DirectXWnd.h:header file

#include<ddraw.h>

#pragma comment (lib,“ddraw。Lib”)//链接时加入ddraw.lib库

class CdirectXWnd: public CWnd

{

//Construction

public:

CDirectXWnd();

//Attributes

public:

BOOL blsActive; //应用程序是否激活

protected:

LPDERECTDRAW lpDD; //DirectDraw对象指针

LPDERECTDRAWSURFACE lpFrontBuffer;//DirectDraw主缓冲区

LPDERECTDRAWSURFACE lpBacdBuffer;//DirectDraw后备缓冲区

int nBufferCount; //后备缓冲区个数

//Operations

protected:

void Msg(LPSTR fmt,...);

public:

BOOL Create(LPCSTR lpszAppName); //创建窗体

//Overrides

virtual BOOL InitializeGame(UINT Gmodex,UINT GmodeY,UINT GBPP);

virtual BOOL CleanSurface();

virtual void UpdateFrame();

virtual BOOL RestoreSurfaces(void);

//{{AFX-VIRTUAL(CdirectXWnd)

//}}AFX_VIRTUAL

//Implementation

public:

virtual~CdirectXWnd();

//Generated message map functions

protected:

//{{AFX-MSG(CderectXWnd)

afx-msg void OnActivateApp(BOOL bActive, HTASK hTask);

//}}AFX-MSG

DECLARE-MESSAGE-MAP()

};

////////////////////////

//{{AFX-INSERT-LOCATION}}

#endif//!defined(DERECTXWND-H)

文件DirectXWnd.CPP

//DirectXWnd.cpp:implementation file

#include”stdafx.h”

#include”DirectX.h”

#include”DirectXWnd.h”

#ifdef-DEUG

#define new DEBUG-NEW

#undef THIS –FILE

static char THIS –FILE[]=--FILE--;

#endif

CDirectXWnd::CdirectWXnd()

{

lpDD=NULL;

lpFrontBuffer=NULL;

lpBackBuffer=NULL;

nBufferCount=0;

blsActive=TRUE;

}

CDirectXWnd::~CdirectXWnd()

{

if(lpDD){

CleanSurface();

lpDD->Release();

lpDD=NULL;

}

}

BOOL CdirectXWnd::Create(LPCSTR IpszAppName)

{

CString className=AfxRegisterWndClass(CS-DBLCLKS,:oadCursor(NULL,IDC-ARRWINDOW, className,IpszAppName,

WS-VISIBLE | WS-SYSMENU | WS-POPUP, 0, 0, GetSystemMetrics(SM-CXSCREEN), GetSystemMetrics(SM-CYSCREEN),NULL,NULL));

}

BOOL CdirectXWnd::InitializeGame(UINT GmodeX,UINT GModeY, UINT GBPP)

{

HRESULT ddrval;

ddrval=DirectDrawCreate(NULL,&lpDD,NULL);

if(ddrval!=DD-OK){

Msg(“DirectDrawCreate failed err=%d”, ddrval);

return FALSE;

}

ddral=lpDD->SetCooperativeLevel(m-hWnd,DDSCL-EXCLUSIVE | DDSCL-FULLSCREEN);

if(ddrval!=DD-OK){

Msg(“SetCooperativeLevel failed err=%d”,ddrval);

return FALSE;

}

ddrval=lpDD_>SetDisplayMode(GmodeX,GmodeY,GBPP);

if(ddrval!-DD-OK)

{

Msg(“SetDisplayMode failed err=%d”,ddrval0;

return FALSE;

}

//check capabilites

DDCAPS ddcaps;

ddcaps.dwSize=sizeof(ddcaps);

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

if(ddrval!=DD-OK){

Msg(“SetDisplayMode 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;

}

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 CDirectSWnd: :UpdateFrame()

{

}

BEGIN_MESSAGE_MAP(CdirectXWnd,CWnd)

//{{AFX_MSG_MAP(CdirectXWnd)

ON_WM_KEYDOWN()

ON_WM_ACTIVATEAPP()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////

//CDirectXWnd message gandlers

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;

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

本版积分规则

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

GMT+8, 2025-2-6 12:46

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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