用MFC構造DirectX應用框架

2021-04-13 14:15:52 字數 4043 閱讀 9521

2023年09月11日 10:51:00

一、 mfc類庫與directxsdk

microsoft directx sdk是開發基於 windows平台遊戲的乙個軟體開發工具,其主要功能主要包括在五個元件中: directdraw、 directsound、directplay、direct3d和directinput,每個元件都具不同的功能:

可以說directxsdk提供了編寫乙個遊戲所必須的功能及基層函式,所以大多windows遊戲都使用了ditrectxsdk。

mfc(microsoft foundation class)類庫是microsoft visual c++中提供的乙個功能強大的windows應用程式開發類,使用這些類我們可以避免和繁瑣的windows apl打交道,而且在visualc++中我們還可以利用c1asswizard對mfc類進行windows訊息對映,所以如果能用mfc類庫來開發directxsdk的應用程式,至少有以下幾個好處:

1.可以用 vc++的 c1asswizard方便地對windows訊息進行對映;

2.增加了程式的可讀性,並且可以用vc++的classview方便的管理所用的類;

3.增加程式**的可重用性,可以在原有的基礎上開發出功能更強大的應用程式更進一步,如果我們能開發出乙個能生成directxsdk應用程式基本框架的vc++的工程嚮導,則為以後開發directx sdk應用程式提供及大的方便。下面,我們將用visua1 c++5.0先編寫乙個directxsdk應用程式的基本框架。

二、編寫directxsdk應用程式基本框架

我們按下列步驟建立乙個勘rectxsdk程式的基本框架:

//call this when using mfc in a shared dll

#else enable3dcontrolsstatic();

//call this when linking to mfc statically

#endif

cdirectxwnd *pwnd=new cdirectxwnd();

pwnd-

m_pmainwnd = pwnd;

pwnd-

pwnd-

if(pwnd-

msg msg;

while(1)

else

}

}三、測試框架

現在,我們按下列步驟寫乙個測試程式來測試這個框架:

1.把剛才建立的工程框架拷貝到乙個新目錄下,並開啟。用c1assview建立乙個基於cwnd的類ctestwnd,然後把ctestwnd.h和ctestwnd.cpp檔案中的所有"cwnd"字串替換為"cdirectxwnd",並在ctestwnd.h檔案頭加入下列

字串:#include"directxwnd.h"。

2.開啟directx.cpp檔案,在檔案頭加入#include"testwnd.h",並把該檔案中的所有"cdirectxwnd"字串替換成"ctestwnd"並儲存。

3.為 ctestwnd類增加乙個虛函式updateframe(),這個函式覆蓋了其基類cdirectwnd的updateframe():

void ctestwnd::updateframe()

if(lpbackbuffer-

while(1)

;

if(ddrval==dderr_su***celost)

}

if(ddrval!=dderr_wasstilldrawing)

}

}

無心柳按:光是這麼追加在測試中沒有成功,可能要在ctestwnd.h中追加兩行:

public:

void updateframe();

否則編譯可能出錯。

4、編譯並執行該程式,螢幕上會出現乙個白色球在移動。

附錄: 檔案:directxwnd.h

檔案:directxwnd.cpp

//directxwnd.cpp:implementation file

#include "stdafx.h"

#include "directx.h"

#include "directxwnd.h"

#ifdef _dubug

#define new debug_new

#undef this_file

static char this_file=__file__;

#endif

cdirectxwnd::cdirectxwnd()

cdirectxwnd::~cdirectxwnd()

}bool cdirectxwnd::initializegame(uint gmodex,uint gmodey,uint gbpp)

ddrval=lpdd-

if(ddrval!=dd_ok)

ddrval=lpdd-

if(ddrval!=dd_ok)

//check capabilites

ddcaps ddcaps;

ddcaps.dwsize=sizeof(ddcaps);

ddrval=lpdd-

if(ddrval!=dd_ok)

if(ddcaps.dwcaps&ddcaps_nohardware)

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

if(nbuffercount==0)

else

}

ddsu***cedesc ddsd;

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

ddsd.dwsize=sizeof(ddsd);

ddsd.dwflags=ddsd_caps|ddsd_backbuffercount;

ddsd.ddscaps.dwcaps=ddscaps_primarysu***ce|ddscaps_flip|ddscaps_complex;

ddsd.dwbackbuffercount=nbuffercount-1;

ddrval=lpdd-

if(ddrval!=dd_ok)

else msg("顯示記憶體允許建立的緩衝區數=%d(最多需要3)",nbuffercount);

ddscaps ddscaps;

ddscaps.dwcaps=ddscaps_backbuffer;

ddrval=lpfrontbuffer-

if(ddrval!=dd_ok)

return true;

}

void cdirectxwnd::msg(lpstr fmt,...)

virtual function

bool cdirectxwnd::restoresu***ces()

bool cdirectxwnd::cleansu***ce()

if(lpfrontbuffer)

return true;

}

void cdirectxwnd::updateframe()

begin_message_map(cdirectxwnd,cwnd)

//}afx_msg_map

end_message_map()

///cdirectxwnd message handlers

void cdirectxwnd::onkeydown(uint nchar,uint nrepcnt,uint nflags)

cwnd::onkeydown(nchar,nrepcnt,nflags);

}

ctestwnd.zip,測試程式原始檔。

----無心柳

本文摘自《計算機程式設計技巧與維護》雜誌2023年第3期

整理:無心柳(全部**已經輸入測試通過)1999/11/02

用Delphi開發DirectX控制項

2000 09 02 00 22 2058人閱讀收藏 舉報 microsoft推出的directx使我們在windows9x下開發遊戲軟體便利了許多。一般在介紹directx 的資料裡都講的是如何用vc 來開發,其實inprise公司的語言也可以用來開發基於directx的遊戲軟體。我們這裡用的是d...

用DirectX實現魔方(一)

魔方英文名字叫做rubik s cube,是由匈牙利建築學教授和雕塑家ern rubik於1974年發明,最初叫做magic cube 這大概也是中文名字的來歷吧 1980年ideal toys公司開始銷售此玩具,並將名字改為rubik s cube。魔方在80年代最為風靡,至今未衰。截至2009年...

用DirectX實現魔方(一)

魔方英文名字叫做rubik s cube,是由匈牙利建築學教授和雕塑家ern rubik於1974年發明,最初叫做magic cube 這大概也是中文名字的來歷吧 1980年ideal toys公司開始銷售此玩具,並將名字改為rubik s cube。魔方在80年代最為風靡,至今未衰。截至2009年...