UpdateFrame():
void CtestWnd :: UpdateFrame()
{
staic int x= 0, dx =5;
staic int y =0, dy =5;
HDC hdc;
DDBL TFX ddbltfx;
HRESULT ddrval;
UpdateWindow();
Ddbltfx.swSize = sizedof(ddbltfx);
Ddbltfx.dwFillColor = 0;
Ddrval = lpBackBuffer ->Blt(
NULL ,//dest rect
NULL,//src surface
NULL,// src rect
DDBLT_COLORFILL |DDBLT_WAIT,
&ddbltfx);
if (ddrval ! = DD_OK)
{
msg(“ Fill failed ddrval =0x%081x”,ddrval);
return;
}
if (lpBackBuffer ->GetDC(&hdc) = =DD- OK)
{
if(x<0) dx=5;
if(x>590) dx= -5;
if (y<0) dy =5;
if ( y>430) dy = -5;
x += dx ; y + =dy;
Ellipse( hdc ,x,y,x+50,y+50);
LpBackBuffer ->ReleaseDC(hdc);
}
while(1)
{
HRESULT ddrval;
ddrva =lp FrontBuffer->Flip(NULL,0);
if( ddrval = =DD_ OK)
{break;}
if (ddravl= =DDERR_SURFACELOST)
{
if(!CdirectXWnd::RestoreSurfaces())
{
break;
}
}
if (ddravl !=DDERR_WASSTILLDRAWING)
{
break;
}
}
}
4:
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,::LoadCursor(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;
}