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

從零構建 DirectX 獨佔模式全螢幕環境

     編輯:VC 教學

本文記錄在 Visual C++ 6.0 中,基於 Win32 SDK 建立 DirectDraw 獨佔模式全螢幕渲染環境的完整步驟,適合需繞過 GDI 直接操作顯示記憶體的高性能繪圖場景。

專案初始化與視窗調整

  1. 建立標準 Win32 Application 專案(非 MFC)。
  2. 移除 WM_PAINT 中的預設繪圖代碼(DrawText 等),避免 GDI 干擾。
  3. 修改 MyRegisterClass:設定 CS_HREDRAW | CS_VREDRAW、背景筆刷為 NULL、無選單、類名一致。
  4. 修改 InitInstance:使用 WS_EX_TOPMOST | WS_POPUP 創建無邊框全螢幕視窗,尺寸取 GetSystemMetrics(SM_CXSCREEN/CYSCREEN)。

DirectDraw 核心物件建立流程

宣告全域介面指標:

LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSPrimary; // 主畫面
LPDIRECTDRAWSURFACE lpDDSBack;    // 後備緩衝

在 InitInstance 中依序執行:

DDSURFACEDESC ddsd = {0};
DDSCAPS ddscaps = {0};
HRESULT ddrval;

ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
if (ddrval == DD_OK) {
    ddrval = lpDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
}
if (ddrval == DD_OK) {
    ddrval = lpDD->SetDisplayMode(640, 480, 8); // 640x480 256 色
}
if (ddrval == DD_OK) {
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
    ddsd.dwBackBufferCount = 1;
    ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
}
if (ddrval == DD_OK) {
    ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
}
若任一步驟失敗,呼叫清理函數並銷毀視窗返回 FALSE。

必要專案設定

  • 加入 #include <ddraw.h>
  • 專案設定 Link 頁籤加入 ddraw.lib
  • 實作資源釋放函數 DestroyDirectDrawObjects():依序 RestoreDisplayMode()、Release() 介面、歸零指標。

鍵盤退出處理

case WM_KEYDOWN:
    switch (wParam) {
        case VK_ESCAPE:
        case VK_F12:
            DestroyDirectDrawObjects();
            PostMessage(hWnd, WM_CLOSE, 0, 0);
            break;
    }
    break;

完成上述步驟後,即擁有一個 640×480×8bpp 的獨佔模式 DirectDraw 環境,可直接對 lpDDSBack 進行離屏繪圖,再透過 Flip() 呈現,實現零撕裂、高幀率動畫與遊戲循環基礎。

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