DirectX 之 DirectDraw 視窗模式

2021-05-24 21:44:45 字數 2544 閱讀 6181

在視窗模式下使用 directdraw , 最大的痛苦是不能使用換頁操作(flip). 但是有許多人還是喜歡在視窗模式下進行遊戲.

首先, 視窗模式下建立乙個 idirectdraw 介面物件和全屏模式下是一樣的, 不同的是, 在選擇協作模式和不能改變螢幕解析度. (當然你堅決要改變, 一定要有禮貌的改變.)

// 設定協作級別,視窗化下使用 ddscl_normal 標誌.

if (failed(m_x2d_lpddraw->setcooperativelevel(m_x2d_hwnd, ddscl_normal)))

return (e_fail);

// 使用 directdraw 介面物件建立 directdrawsu***ce 主頁面物件.

ddsu***cedesc2 ddsd;

init_dxstruct(ddsd);

ddsd.dwflags = ddsd_caps;

ddsd.ddscaps.dwcaps = ddscaps_primarysu***ce;

if (failed(m_x2d_lpddraw->createsu***ce(&ddsd, &m_x2d_lpddrawprimarysu***ce, null)))

return (e_fail);

// 建立乙個離屏頁面

init_dxstruct(ddsd);

ddsd.dwflags = ddsd_caps | ddsd_width | ddsd_height;

ddsd.dwwidth = width;

ddsd.dwheight = height;

ddsd.ddscaps.dwcaps = ddscaps_offscreenplain;

if (failed(m_x2d_lpddraw->createsu***ce(&ddsd, &m_x2d_lpddrawbacksu***ce, null)))

return (e_fail);

/*   在這裡省略掉給這個離屏頁面附屬上裁剪器,

下面使用到這個離屏頁面的是已經附屬上裁減器的.    */

lpdirectdrawclipper lpddclipper = null;

// 建立裁剪器.

if (failed(m_x2d_lpddraw->createclipper(0, &lpddclipper, null)))

return (e_fail);

// 與視窗工作區關聯.

if (failed(lpddclipper->sethwnd(0, m_x2d_hwnd)))

if (failed(m_x2d_lpddrawprimarysu***ce->setclipper(lpddclipper)))

safe_release(lpddclipper);

給主頁面設定裁剪器, 是為了視窗在超出(超出螢幕的顯示部分)桌面時能正常工作.實際上主頁面就是你的桌面.

現在桌面上有許多視窗在執行, 我們不能胡亂的在桌面上亂畫, 否則其他的視窗可能抱怨. 我們要知道我們的視窗工作區位置, 然後我們在這個工作區內工作.

getclientrect(m_x2d_hwnd, &m_x2d_clientrect);

clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect);

clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect+1);

m_x2d_clientrect 儲存的是我們的視窗工作區(客戶區)位置.

然後我們可能這樣用:

m_x2d_lpddrawprimarysu***ce->blt(&m_x2d_clientrect, m_x2d_lpddrawbacksu***ce, null, ddblt_wait, null));

這個位轉換目標位置就是我們的工作區. 因為我們給主頁面附屬了裁剪器, 所以不能再用bltfast來位轉換了.

如果我們像這樣用, 可能看到乙個雜亂的桌面.

rect rct = ;

m_x2d_lpddrawprimarysu***ce->blt(&rct, su***ce, null, ddblt_wait, null));

這樣的後果是:

在桌面的 x = 0, y = 0 位置, 畫上 寬 = 300, 高 = 123 的 su***ce 圖形.

在視窗模式下, 一定要正確獲得自己的工作區, 當視窗移動或者改變大小, 我們因該有所行動.

case wm_move:

case wm_size:

getclientrect(m_x2d_hwnd, &m_x2d_clientrect);

clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect);

clienttoscreen(m_x2d_hwnd, (lppoint)&m_x2d_clientrect+1);

break;

還有, 當視窗失去焦點(活動), 應該停止在繼續向主頁面繪畫. 否則, 你畫的將覆蓋掉在視窗上的其他視窗的內容.

case wm_activate:

菜鳥DirectX之頂點快取

現在是22點43分,剛下班回家,因為遊戲要十二月份上線,比之前的計畫提前了三個月,拼命的加班啊。一什麼是頂點快取 在遊戲中,物體模型是用多邊形網格來描述的,一般的是三角形,頂點快取就是來儲存用來描述物體模型的所有多面形的頂點的資訊,這些資訊有頂點的三維座標,頂點顏色,頂點法向量,紋理座標等。二如何使...

菜鳥DirectX之紋理對映

一紋理對映是什麼 就是你用前面部落格中講到的方法繪製乙個正方形後,在正方形上貼一張你想要顯示的 二紋理對映的使用 使用方法分為四步 1 在頂點格式中定義紋理的座標 比如 struct myvertex 2 填充頂點資料 customvertex vertices void pvertices if ...

DirectX學習之WinMain函式

剛開始學習directx,使用vs2013編譯環境,建立第乙個視窗,學習winmain函式。winmain函式是windows應用程式的入口,相當於c語言的main函式。winmain函式主要實現以下功能 1.註冊視窗類,建立視窗,執行其他必要的初始化的操作 2.進入訊息迴圈,根據從應用程式訊息佇列...