MFC 內建 CStatic 僅支援靜態圖片。CPictureEx 為開源類別,支援 GIF(含動畫)、JPEG、BMP、WMF、ICO 等格式,且能從資源載入、自動播放動畫。本文示範完整整合流程、資源匯入、播放控制、滑鼠點擊開啟超連結、游標變更等進階應用。
PictureEx.h/.cpp,複製到專案目錄並加入專案。IDC_GIF,Type 選 Rectangle。IDC_GIF 加入控制變數 m_GifPic,型別 CStatic。CPictureEx m_GifPic;(取代 CStatic)。#include "PictureEx.h"。roaring.gif 放入 res 資料夾。roaring.gif → Open as: Custom → 類型輸入 GIF → 確定。IDR_GIFROARING),可重新命名。
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIFROARING), _T("GIF"))) {
m_GifPic.Draw(); // 開始播放動畫
}
return TRUE;
}
WM_LBUTTONDOWN 訊息處理 OnLButtonDown。
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rc; m_GifPic.GetWindowRect(&rc); ScreenToClient(&rc);
if (rc.PtInRect(point)) {
ShellExecute(m_hWnd, _T("open"), _T("https://example.com"), NULL, NULL, SW_SHOWNORMAL);
}
CDialog::OnLButtonDown(nFlags, point);
}
hand.cur 為游標資源,ID IDC_CURSOR_HAND。HCURSOR m_hHandCursor;,OnInitDialog 載入:m_hHandCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_HAND);WM_SETCURSOR 訊息處理 OnSetCursor。
BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
CRect rc; m_GifPic.GetWindowRect(&rc); ScreenToClient(&rc);
CPoint pt; GetCursorPos(&pt); ScreenToClient(&pt);
if (rc.PtInRect(pt) && m_hHandCursor) {
SetCursor(m_hHandCursor);
return TRUE;
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
| 方法 | 說明 |
|---|---|
Load(resourceID, type) | 從資源載入,type 為 "GIF"、"JPEG" 等 |
Load(filePath) | 從檔案載入 |
Draw() | 開始/繼續播放動畫 |
Stop() | 停止動畫 |
IsPlaying() | 查詢是否正在播放 |
SetWindowPos | 調整大小位置(繼承自 CWnd) |
CPictureEx 內部使用 IPicture/IStream,需專案啟用 COM(AfxOleInit)。Stop() 可能導致存取已釋放記憶體;建議在 OnDestroy 呼叫 m_GifPic.Stop()。