利用MFC程式來測試框架?

摘要:關於利用MFC程式來測試框架的深入研究。

步驟/方法

現在,我們按下列步驟寫一個程式來測試這個框架:
1 把剛才建立的工程框架拷貝到一個新目錄下,並開啟。用Class View 建立一個基於CWnd的類CtestWnd,然後把CtestWnd.h和CtestWnd.CPP檔案中的所有“CWnd”字串替換為“CdirectXWnd”,並在CtestWnd.h檔案頭加入下列字串:#include “DirectXWnd.h”.
2 開啟DirectX.CPP檔案,在檔案頭加入# include “TestWnd.h”,並把該檔案中的所有”CdirectXWnd”字串替換成”CtestWnd”並儲存。
3 為CtestWnd類增加一個虛擬函式UpdateFrame(),這個函式覆蓋了其基類CdirectXWnd的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 -$#@62;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 -$#@62;GetDC(&hdc) = =DD- OK)
{
if(x$#@60;0) dx=5;
if(x$#@62;590) dx= -5;
if (y$#@60;0) dy =5;
if ( y$#@62;430) dy = -5;
x += dx ; y + =dy;
Ellipse( hdc ,x,y,x+50,y+50);
LpBackBuffer -$#@62;ReleaseDC(hdc);
}
while(1)
{
HRESULT ddrval;
ddrva =lp FrontBuffer-$#@62;Flip(NULL,0);
if( ddrval = =DD_ OK)
{break;}
if (ddravl= =DDERR_SURFACELOST)
{
if(!CdirectXWnd::RestoreSurfaces())
{
break;
}
}
if (ddravl !=DDERR_WASSTILLDRAWING)
{
break;
}
}
}

利用MFC程式來測試框架

4:編譯並執行程式,螢幕上會出現一個白色球在移動
附錄:
檔案DirectXWnd.h
#if !defined(DIRECTXWND-H)
#define DIRECTXWND_H
//DirectXWnd.h:header file
#include$#@60;ddraw.h$#@62;
#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-$#@62;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-$#@62;SetCooperativeLevel(m-hWnd,DDSCL-EXCLUSIVE DDSCL-FULLSCREEN);
if(ddrval!=DD-OK){
Msg(“SetCooperativeLevel failed err=%d”,ddrval);
return FALSE;
}
ddrval=lpDD_$#@62;SetDisplayMode(GmodeX,GmodeY,GBPP);
if(ddrval!-DD-OK)
{
Msg(“SetDisplayMode failed err=%d”,ddrval0;
return FALSE;
}

利用MFC程式來測試框架

//check capabilites
DDCAPS ddcaps;
ddcaps.dwSize=sizeof(ddcaps);
ddrval=lpDD-$#@62;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$#@60;=1024L*1024L*(GBPP/8)
GModeX$#@62;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_$#@62;CreateSurface(&ddsd,&lpFrontBuffer,NULL);
if(ddrval !=DD_OK){
Msg(“CreateSurface failed err=%d”,ddrval);
return FALSE;
}
DDSCAPS ddscaps;
ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
ddrval=lpFrontBuffer_$#@62;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_$#@62;Restore();
if(ddrval !=DD_OK)
return FALSE;
return TRUE;
}
BOOL CDirectXWnd: :CleanSurface()
}
if(lpBackBuffer){
lpBackBuffer_$#@62;Release();
lpBackBuffer=NULL;
}
if(lpFrontBuffer){
lpFrontBuffer_$#@62;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;
}

利用MFC程式來測試框架

程式, 框架, 深入研究,
相關問題答案