首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder DirectX 程式設計實戰(三):圖面類型、圖形載入與遺失處理詳解

     編輯:關於C++

前言

本文系統介紹 DirectDraw 圖面核心概念、圖形檔案載入技術、圖面遺失機制,並以範例程式 dx2 完整演示操作流程與程式碼實作細節。

一、DirectDraw 圖面分類

類型說明
主圖面直接顯示於螢幕,對應 GDI 桌面繪圖面,每個 DD 物件僅能有一個,尺寸由顯示模式決定。
離螢幕圖面不直接顯示,作為精靈、背景、雙緩衝緩衝區。可建立多個,尺寸可調整,但通常不超過主圖面。
複合圖面/翻轉鏈用於無閃爍動畫(雙/三重緩衝翻轉),後續動畫篇介紹。
覆蓋圖面硬體支援,可疊加於主圖面之上(如影片播放),DD 無法模擬。

二、圖面記憶體配置策略

DD 可將圖面建立於:

  1. 顯示記憶體:速度最快,支援硬體加速,容量有限。
  2. AGP 記憶體:次之,擴充顯存不足時使用。
  3. 系統記憶體:最慢,但容量大,作為最後備援。

建議:高頻存取、需硬體加速的圖面優先放顯存;靜態大圖可放系統記憶體。

三、圖形檔案載入流程

利用 GDI 協助載入並轉換格式:

  1. LoadImage 載入 BMP 為 DIB 區塊。
  2. Surface->GetDC 取得圖面相容 DC。
  3. BitBlt 將 DIB 複製到圖面(自動處理格式轉換)。
  4. ReleaseDC 釋放 DC。

優點:相容性好、支援多種顯示模式、自動格式轉換。缺點:速度較慢,高效能場合建議用 IDirectDrawSurface::Blt 或鎖定記憶體直接寫入。

四、圖面遺失機制

觸發情境

  • 應用程式最小化
  • 顯示模式改變
  • 使用者 Alt+Tab 切換

處理流程

  1. 偵測:Surface->IsLost() == DDERR_SURFACELOST
  2. 恢復顯示模式至原始設定(必要步驟)。
  3. 呼叫 Surface->Restore() 重新配置記憶體。
  4. 重新繪製所有圖形資料(Restore 僅配置記憶體,內容不保留)。

五、dx2 範例程式執行流程

  1. 建立 DD、設定 800x600 全螢幕
  2. 建立主圖面
  3. 建立 100x100 離螢幕圖面
  4. 載入 view.bmp 到離螢幕圖面(100x100)
  5. 載入 view.bmp 到主圖面(縮放 200x100,位置 0,0)
  6. 離螢幕圖面複製到主圖面(200,0),並排顯示不同縮放
  7. 切換 640x480 → 圖面遺失、畫面消失
  8. 恢復 800x600 → Restore 圖面(畫面仍空白)
  9. 重新載入圖形 → 畫面恢復

六、關鍵程式碼片段

建立主圖面

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);

DDSURFACEDESC 關鍵成員

  • dwSize:結構大小,必填
  • dwFlags:指定哪些欄位有效
  • dwWidth/Height:圖面尺寸(主圖面不需設定)
  • ddsCaps.dwCaps:圖面類型旗標

總結

掌握圖面類型選擇、GDI 載入協作、遺失偵測與恢復流程,是 DirectDraw 穩健開發的基石。下一篇將進入動畫與翻轉鏈技術。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved