本文系統介紹 DirectDraw 圖面核心概念、圖形檔案載入技術、圖面遺失機制,並以範例程式 dx2 完整演示操作流程與程式碼實作細節。
| 類型 | 說明 |
|---|---|
| 主圖面 | 直接顯示於螢幕,對應 GDI 桌面繪圖面,每個 DD 物件僅能有一個,尺寸由顯示模式決定。 |
| 離螢幕圖面 | 不直接顯示,作為精靈、背景、雙緩衝緩衝區。可建立多個,尺寸可調整,但通常不超過主圖面。 |
| 複合圖面/翻轉鏈 | 用於無閃爍動畫(雙/三重緩衝翻轉),後續動畫篇介紹。 |
| 覆蓋圖面 | 硬體支援,可疊加於主圖面之上(如影片播放),DD 無法模擬。 |
DD 可將圖面建立於:
建議:高頻存取、需硬體加速的圖面優先放顯存;靜態大圖可放系統記憶體。
利用 GDI 協助載入並轉換格式:
LoadImage 載入 BMP 為 DIB 區塊。Surface->GetDC 取得圖面相容 DC。BitBlt 將 DIB 複製到圖面(自動處理格式轉換)。ReleaseDC 釋放 DC。優點:相容性好、支援多種顯示模式、自動格式轉換。缺點:速度較慢,高效能場合建議用 IDirectDrawSurface::Blt 或鎖定記憶體直接寫入。
Surface->IsLost() == DDERR_SURFACELOSTSurface->Restore() 重新配置記憶體。ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
lpDD2->CreateSurface(&ddsd, &lpDDPrimary, NULL);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.dwHeight = 100; ddsd.dwWidth = 100;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
lpDD2->CreateSurface(&ddsd, &lpDDOffScreen, NULL);
dwSize:結構大小,必填dwFlags:指定哪些欄位有效dwWidth/Height:圖面尺寸(主圖面不需設定)ddsCaps.dwCaps:圖面類型旗標掌握圖面類型選擇、GDI 載入協作、遺失偵測與恢復流程,是 DirectDraw 穩健開發的基石。下一篇將進入動畫與翻轉鏈技術。