MFC 原生 CStatic 僅支援位圖/圖示/元件檔,無法直接顯示 JPEG/GIF,更別提動畫 GIF。CPictureEx 類別封裝了 GIF 幀解析、OleLoadPicture/IPicture 繪製與背景執行緒動畫播放,同時支援 JPEG、BMP、WMF、ICO、CUR 等所有 OleLoadPicture 辨識的格式,並提供 ATL 版本 CPictureExWnd。
WS_GROUP 樣式作為佔位)。m_Picture,類型 CStatic。CStatic m_Picture 改為 CPictureEx m_Picture,並 #include "PictureEx.h"。PictureEx.h/.cpp。OnInitDialog 中:
if (m_Picture.Load(_T("mypicture.gif")))
m_Picture.Draw();
非對話框視窗需手動呼叫 Create → Load → Draw。
// 成員變數
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 | 設定/取得剪裁矩形,僅顯示圖片局部 |
Load 解析所有幀與延遲時間,Draw 啟動背景執行緒(_beginthreadex)循環 BitBlt 每一幀。OleLoadPicture/IPicture::Render 繪製,無額外執行緒。Stop() 終止執行緒,Draw() 可從上次幀繼續播放。GIFTYPE),Load 時需完全一致。COLOR_3DFACE,若父視窗自繪背景,請在 Load 後呼叫 SetBkColor(parentBgColor)。SetPaintRect 可實現「精靈圖」效果,單一大圖包含多個圖示,動態切換顯示區域。UnLoad() 或確保析構函式釋放資源。CPictureEx/CPictureExWnd 以極簡介面解決了 MFC/ATL 專案長期缺乏動畫 GIF 支援的痛點,支援檔案/資源/記憶體多種來源,程式碼開源且易於擴展(如加入 PNG/APNG 支援)。直接納入專案即可使用,無需第三方授權費用。