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

Win32 應用程式建立 DirectDraw 獨佔全螢幕環境步驟詳解

     編輯:VC++

建立流程概覽

  1. 建立標準 Win32 專案,移除 WM_PAINT 文字繪製代碼。
  2. 修改視窗類別註冊:背景筆刷設 NULL,避免閃爍。
  3. 建立視窗:WS_EX_TOPMOST | WS_POPUP,尺寸設為螢幕解析度。
  4. 初始化 DirectDraw:建立介面、設定合作層級、設定顯示模式、建立主介面與背景緩衝區。
  5. 釋放資源:離開時還原顯示模式、釋放介面。
  6. 處理 VK_ESCAPE/VK_F12 退出。

關鍵程式碼片段

視窗類別註冊

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASS wc = { 0 };
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = NULL;           // 關鍵:無背景刷
    wc.lpszClassName = szWindowClass;
    return RegisterClass(&wc);
}

建立全螢幕視窗

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle,
        WS_POPUP, 0, 0,
        GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
        NULL, NULL, hInstance, NULL);
    // ... ShowWindow, UpdateWindow
}

DirectDraw 初始化

LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSPrimary, lpDDSBack;

DDSURFACEDESC ddsd = { sizeof(ddsd) };
DDSCAPS ddscaps;
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.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);
}

// 失敗時呼叫 DestroyDirectDrawObjects() 清理並銷毀視窗

資源釋放

void DestroyDirectDrawObjects()
{
    if (lpDD)
    {
        lpDD->RestoreDisplayMode();
        if (lpDDSPrimary)
        {
            lpDDSPrimary->Release();
            lpDDSPrimary = NULL;
        }
        lpDD->Release();
        lpDD = NULL;
    }
}

鍵盤退出處理

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

專案設定提醒

  • 加入 #include <ddraw.h>
  • 專案設定 → Link → Object/library modules 加入 ddraw.lib

此為 DirectDraw 7/舊版 DirectX 基礎架構,現代專案建議改用 Direct3D 9/11/12。

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