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

VC 中顯示 JPEG/GIF 圖片的簡易方法:IPicture COM 介面

     編輯:VC 教學

為什麼不用 BMP?

MFC 僅原生支援 BMP,未壓縮佔用空間大,嵌入資源會嚴重膨脹執行檔。JPEG (有損高壓縮) 與 GIF (256 色高壓縮) 更適合分發與資源嵌入。

核心技術:IPicture 介面

IPicture 為標準 COM 圖片介面,管理點陣圖、圖示、繪圖元等語言無關抽象。系統提供標準實現,支援 IPersistStream 從串流載入/儲存。關鍵 API:OleLoadPicture 從 IStream 載入圖片並回傳 IPicture*。

實作步驟

  1. 選取檔案:標準 CFileDialog 過濾 *.jpg;*.gif,路徑存入 CString m_sPath。
  2. 讀入記憶體建立串流:
    IStream* pStm = NULL;
    CFile file; CFileStatus fs;
    if (file.Open(m_sPath, CFile::modeRead) && file.GetStatus(fs) && fs.m_size != -1) {
        HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, fs.m_size);
        if (hGlobal) {
            LPVOID pv = GlobalLock(hGlobal);
            if (pv) {
                file.ReadHuge(pv, fs.m_size);
                GlobalUnlock(hGlobal);
                CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); // 串流物件
            }
        }
    }
  3. 載入圖片並繪製:
    IPicture* pPic = NULL;
    if (SUCCEEDED(OleLoadPicture(pStm, fs.m_size, TRUE, IID_IPicture, (LPVOID*)&pPic))) {
        OLE_XSIZE_HIMETRIC hmW; OLE_YSIZE_HIMETRIC hmH;
        pPic->get_Width(&hmW); pPic->get_Height(&hmH);
        // 轉換為裝置像素
        double fx = (double)pDC->GetDeviceCaps(HORZRES) * hmW / (pDC->GetDeviceCaps(HORZSIZE) * 100.0);
        double fy = (double)pDC->GetDeviceCaps(VERTRES) * hmH / (pDC->GetDeviceCaps(VERTSIZE) * 100.0);
        if (FAILED(pPic->Render(*pDC, 0, 0, (DWORD)fx, (DWORD)fy,
                               0, hmH, hmW, -hmH, NULL)))
            AfxMessageBox("渲染失敗");
        pPic->Release();
    } else AfxMessageBox("載入失敗");

關鍵點說明

  • Render 參數:目標 DC、左上角座標、寬高、來源圖片偏移/裁剪區域 (HIMETRIC 單位,1/100 公釐),負高度表示 Y 軸向下。
  • 錯誤處理:SUCCEEDED/FAILED 巨集檢查 HRESULT。
  • 資源釋放:pPic->Release()、串流自動釋放 (建立時 fDeleteOnRelease=TRUE)。

限制與擴充

僅能顯示 GIF 第一幀,完整動畫需外部 ActiveX 控件支援。若需嵌入資源,可用 FindResource/LoadResource 取得資料指標建立串流,邏輯相同。

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