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

C++ Builder DirectX 程式設計實戰(四):圖面操作與圖形載入完整範例

     編輯:關於C++

前言

承接前三篇,本文呈現完整的 main.cpp 實作碼,示範 DirectDraw 物件建立、協作等級設定、顯示模式切換、主/離螢幕圖面建立、位圖載入與 BitBlt 複製、圖面遺失與恢復全流程。

核心程式碼架構

// 關鍵介面指標
LPDIRECTDRAW        lpDD;
LPDIRECTDRAW2       lpDD2;
LPDIRECTDRAWSURFACE lpDDPrimary;   // 主圖面
LPDIRECTDRAWSURFACE lpDDOffScreen; // 離螢幕圖面
DDSURFACEDESC       ddsd;

關鍵步驟解析

1. 建立 DirectDraw 並設定獨佔全螢幕

DirectDrawCreate(NULL, &lpDD, NULL);
lpDD->QueryInterface(IID_IDirectDraw2, (LPVOID*)&lpDD2);
lpDD->Release(); // 釋放舊介面
lpDD2->SetCooperativeLevel(Handle,
    DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NOWINDOWCHANGES);
lpDD2->SetDisplayMode(800, 600, 16, 0, 0);

2. 建立主圖面

ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
lpDD2->CreateSurface(&ddsd, &lpDDPrimary, NULL);

3. 建立離螢幕圖面

ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.dwHeight = 100; ddsd.dwWidth = 100;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
lpDD2->CreateSurface(&ddsd, &lpDDOffScreen, NULL);

4. 載入位圖到離螢幕圖面

HDC hdc, hdcImage;
HBITMAP hbm = (HBITMAP)LoadImage(NULL, "view.bmp", IMAGE_BITMAP,
    100, 100, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hbm);
lpDDOffScreen->GetDC(&hdc);
BitBlt(hdc, 0, 0, 100, 100, hdcImage, 0, 0, SRCCOPY);
lpDDOffScreen->ReleaseDC(hdc);
// 清理 GDI 物件
DeleteDC(hdcImage); DeleteObject(hbm);

5. 離螢幕圖面複製到主圖面

HDC hdcPrimary, hdcOffScreen;
lpDDPrimary->GetDC(&hdcPrimary);
lpDDOffScreen->GetDC(&hdcOffScreen);
BitBlt(hdcPrimary, 200, 0, 100, 100, hdcOffScreen, 0, 0, SRCCOPY);
lpDDPrimary->ReleaseDC(hdcPrimary);
lpDDOffScreen->ReleaseDC(hdcOffScreen);

6. 圖面遺失與恢復

// 切換解析度導致圖面遺失
lpDD2->SetDisplayMode(640, 480, 16, 0, 0);
// 恢復解析度並還原圖面
lpDD2->SetDisplayMode(800, 600, 16, 0, 0);
lpDDPrimary->Restore();
lpDDOffScreen->Restore();
// 重新載入圖形資料

完整按鈕事件流程

範例以 9 個按鈕串聯完整流程:

  1. 建立 DD 物件並設定 800x600 全螢幕
  2. 建立主圖面
  3. 建立 100x100 離螢幕圖面
  4. 載入 view.bmp 到離螢幕圖面
  5. 載入 view.bmp 到主圖面(縮放 200x100)
  6. 離螢幕圖面複製到主圖面 (200,0)
  7. 切換 640x480 驗證圖面遺失
  8. 恢復 800x600 並 Restore 圖面
  9. 重新執行 4-6 步驟恢復畫面

重點提醒

  • GetDC/ReleaseDC 必須成對呼叫,否則會鎖定圖面。
  • 圖面遺失後必須先恢復原始顯示模式,Restore 才會成功。
  • 離螢幕圖面尺寸不可大於主圖面(除非顯示卡支援)。
  • 釋放介面順序:先釋放 Surface,再釋放 IDirectDraw2。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved