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

MFC/ATL 專案中播放動畫 GIF:CPictureEx 類別完整使用指南

     編輯:關於VC++

背景與動機

MFC 原生 CStatic 僅支援位圖/圖示/元件檔,無法直接顯示 JPEG/GIF,更別提動畫 GIF。CPictureEx 類別封裝了 GIF 幀解析、OleLoadPicture/IPicture 繪製與背景執行緒動畫播放,同時支援 JPEG、BMP、WMF、ICO、CUR 等所有 OleLoadPicture 辨識的格式,並提供 ATL 版本 CPictureExWnd。

MFC 版本:CPictureEx 快速上手

  1. 對話框放置「靜態文字」或「圖片控制項」,屬性勾選 Group(利用其 WS_GROUP 樣式作為佔位)。
  2. 建立控制項變數 m_Picture,類型 CStatic。
  3. 對話框標頭檔將 CStatic m_Picture 改為 CPictureEx m_Picture,並 #include "PictureEx.h"。
  4. 專案加入 PictureEx.h/.cpp。
  5. OnInitDialog 中:

if (m_Picture.Load(_T("mypicture.gif")))
    m_Picture.Draw();

非對話框視窗需手動呼叫 Create → Load → Draw。

ATL 版本:CPictureExWnd


// 成員變數
CPictureExWnd m_wndBanner;

// WM_INITDIALOG 處理函數
HWND hWnd = GetDlgItem(IDC_MYPIC);
if (hWnd) m_wndBanner.SubclassWindow(hWnd); // 子類化現有控制項

// 載入與播放
m_wndBanner.Load(_T("banner.gif"));
m_wndBanner.Draw();

亦可直接 Create 建立獨立視窗。

核心介面總覽

函式說明
Load(LPCTSTR szFile)從檔案載入
Load(HGLOBAL hGlobal, DWORD dwSize)從全域記憶體載入(呼叫者負責 GlobalFree)
Load(LPCTSTR szResName, LPCTSTR szResType)從資源載入,如 Load(MAKEINTRESOURCE(IDR_GIF), _T("GIFTYPE"))
Draw()繪製靜態圖或啟動動畫播放執行緒
Stop()暫停動畫
UnLoad()停止動畫並釋放所有資源(Load 內部自動呼叫)
SetBkColor(COLORREF)設定透明區填充色(預設 COLOR_3DFACE)
IsGIF() / IsAnimatedGIF() / IsPlaying()狀態查詢
GetSize() / GetFrameCount()尺寸與幀數
SetPaintRect / GetPaintRect設定/取得剪裁矩形,僅顯示圖片局部

動畫播放機制

  • 動畫 GIF:Load 解析所有幀與延遲時間,Draw 啟動背景執行緒(_beginthreadex)循環 BitBlt 每一幀。
  • 非動畫:直接使用 OleLoadPicture/IPicture::Render 繪製,無額外執行緒。
  • Stop() 終止執行緒,Draw() 可從上次幀繼續播放。

常見問題與技巧

  • 資源類型名稱:VC 資源編輯器匯入 GIF 時自訂類型(如 GIFTYPE),Load 時需完全一致。
  • 背景色:對話框背景通常為 COLOR_3DFACE,若父視窗自繪背景,請在 Load 後呼叫 SetBkColor(parentBgColor)。
  • 剪裁矩形:SetPaintRect 可實現「精靈圖」效果,單一大圖包含多個圖示,動態切換顯示區域。
  • 記憶體洩漏:視窗銷毀前務必呼叫 UnLoad() 或確保析構函式釋放資源。

總結

CPictureEx/CPictureExWnd 以極簡介面解決了 MFC/ATL 專案長期缺乏動畫 GIF 支援的痛點,支援檔案/資源/記憶體多種來源,程式碼開源且易於擴展(如加入 PNG/APNG 支援)。直接納入專案即可使用,無需第三方授權費用。

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