前言
本系列教導如何在 C++ Builder 中使用 DirectX 進行高效能遊戲/多媒體開發。開發環境:中文 Windows 98、C++ Builder 4、DirectX 6+ SDK。本文為第一篇,奠定 DirectDraw 核心概念與初始化流程。
一、DirectX 核心特性
- 標準高效能遊戲/多媒體工具包,與 OS 完美整合。
- 硬體抽象層 (HAL) + 硬體模擬層 (HEL):查詢「相容表」,硬體支援走 HAL,否則走 HEL 模擬。
- 元件物件模型 (COM):介面版本獨立,保證向前相容。
二、DirectX 主要元件
| 元件 | 功能 |
| DirectDraw | 直接存取顯示硬體,管理顯存/系統記憶體,高速 2D 繪圖與翻轉動畫 |
| Direct3D | 3D 硬體介面 |
| DirectInput | 輸入裝置支援 |
| DirectSound | 3D 音效、音效記憶體管理 |
| DirectPlay | 網路多人遊戲通訊 |
| DirectSetup | 自動安裝驅動程式 |
三、DirectDraw 兩種顯示模式
- 全螢幕獨佔模式:獨佔顯示硬體,效能最高,可控制解析度、刷新率、色深。
- 視窗模式:在 GDI 視窗中繪圖,相容性好但效能較低。
本系列以全螢幕獨佔模式為主。
四、建立全螢幕獨佔模式的 5 步驟
- 列舉硬體裝置:
DirectDrawEnumerate 取得所有裝置 GUID,預設主裝置為 NULL。
- 建立 DirectDraw 物件:
DirectDrawCreate(GUID*, LPDIRECTDRAW*, IUnknown*)。
- 取得高版本 COM 介面:
QueryInterface(IID_IDirectDraw2, ...) 取得 IDirectDraw2/3/4/7,取得後釋放舊介面。
- 設定協作等級:
SetCooperativeLevel(HWND, DWORD flags)。獨佔全螢幕旗標組合:
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NOWINDOWCHANGES
- 列舉並設定顯示模式:
EnumDisplayModes 列舉支援模式,SetDisplayMode(w, h, bpp, refresh, flags) 切換。
五、dx1 範例程式操作流程
介面包含 6 個按鈕,依步驟順序啟用:
- 裝置列舉 → 顯示裝置名稱於 ComboBox1
- 建立 DD 物件
- 取得 IDirectDraw2 介面
- 設定協作等級(核取方塊選擇旗標)
- 列舉顯示模式 → 顯示於 ComboBox2 (格式: WxHxBPPxRefresh)
- 設定顯示模式 → 螢幕立即切換
六、關鍵 API 參數說明
DirectDrawEnumerate 回呼
BOOL WINAPI EnumDeviceCallBack(GUID FAR* lpGUID,
LPSTR lpDeviceDesc, LPSTR lpDeviceName, LPVOID lpContext);
SetCooperativeLevel 旗標
| 旗標 | 說明 |
| DDSCL_EXCLUSIVE | 獨佔模式,需搭配 FULLSCREEN |
| DDSCL_FULLSCREEN | 全螢幕,需搭配 EXCLUSIVE |
| DDSCL_NOWINDOWCHANGES | DD 不自動最小化/還原視窗 |
| DDSCL_ALLOWMODEX | 允許 Mode X (320x240x256),需搭配上兩者 |
| DDSCL_ALLOWREBOOT | 允許熱鍵重開機 |
| DDSCL_NORMAL | 普通視窗模式 |
EnumDisplayModes 旗標
DDEDM_STANDARDVGAMODES:包含 Mode 13h (320x200x256)
DDEDM_REFRESHRATES:列舉不同刷新率模式
七、專案設定提醒
- 安裝 DirectX 5+ SDK
- 專案選項 → Directories/Conditionals → Include Path / Library Path 加入 SDK 路徑
- 原始碼包含
#include "ddraw.h"
總結
掌握「列舉→建立→取得高版介面→設定協作等級→列舉/設定模式」五步驟,即可建立 DirectDraw 全螢幕獨佔環境,為後續圖面操作、動畫、遊戲開發奠基。
- 上一篇文章: C++ Builder DirectX 程式設計實戰(二):裝置列舉、建立 DD 物件與顯示模式設定完整碼
- 下一篇文章: 主流 C/C++ 編譯器數值運算效能大比拚
Copyright ©
程式碼之家 All Rights Reserved