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

VC++ 程式載入播放 GIF 動畫:PictureEx 類別完整實作與超連結應用

     編輯:VC 教學

前言

MFC 內建 CStatic 僅支援靜態圖片。CPictureEx 為開源類別,支援 GIF(含動畫)、JPEG、BMP、WMF、ICO 等格式,且能從資源載入、自動播放動畫。本文示範完整整合流程、資源匯入、播放控制、滑鼠點擊開啟超連結、游標變更等進階應用。

1. 專案整合

  1. 下載 PictureEx.h/.cpp,複製到專案目錄並加入專案。
  2. 對話框編輯器拖入 Picture Control,ID 設為 IDC_GIF,Type 選 Rectangle。
  3. ClassWizard 為 IDC_GIF 加入控制變數 m_GifPic,型別 CStatic。
  4. 修改標頭檔:CPictureEx m_GifPic;(取代 CStatic)。
  5. 在對話框標頭檔 #include "PictureEx.h"。

2. 匯入 GIF 為自訂資源

  1. 將 roaring.gif 放入 res 資料夾。
  2. Resource View 右鍵 → Import → 選擇 roaring.gif → Open as: Custom → 類型輸入 GIF → 確定。
  3. 資源 ID 自動產生(如 IDR_GIFROARING),可重新命名。

3. 初始化並播放


BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIFROARING), _T("GIF"))) {
        m_GifPic.Draw(); // 開始播放動畫
    }
    return TRUE;
}

4. 圖片點擊開啟超連結

  1. ClassWizard 為對話框加入 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);
}

5. 滑鼠進入圖片區域變更游標為手形

  1. 匯入 hand.cur 為游標資源,ID IDC_CURSOR_HAND。
  2. 成員變數 HCURSOR m_hHandCursor;,OnInitDialog 載入:m_hHandCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_HAND);
  3. ClassWizard 加入 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);
}

6. 關鍵類別方法速查

方法說明
Load(resourceID, type)從資源載入,type 為 "GIF"、"JPEG" 等
Load(filePath)從檔案載入
Draw()開始/繼續播放動畫
Stop()停止動畫
IsPlaying()查詢是否正在播放
SetWindowPos調整大小位置(繼承自 CWnd)

注意事項

  • CPictureEx 內部使用 IPicture/IStream,需專案啟用 COM(AfxOleInit)。
  • 動畫播放使用 Timer,若對話框銷毀前未 Stop() 可能導致存取已釋放記憶體;建議在 OnDestroy 呼叫 m_GifPic.Stop()。
  • 大尺寸 GIF 可能記憶體佔用高,建議預先縮圖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved