OleLoadPicture 在指定視窗上繪製

來源:互聯網
上載者:User

  

#include <crtdbg.h>#include <OLE2.H>#include <ocidl.h>#include <olectl.h>#include "Shlwapi.h"#include <stdio.h>#pragma comment(lib, "Shlwapi.lib")#ifndef VERIFY#ifdef _DEBUG#define VERIFY _ASSERT#else#define VERIFY(f) ((void)(f))#endif#endifvoid DrawImage(  HWND hWnd, //目標視窗控制代碼  LPCTSTR szFilePath,//靶心圖表片檔案 bmp jpg gif ico wmf  BOOL bDoubleBuff=TRUE)//使用雙緩衝{    if(IsWindow(hWnd) && PathFileExists(szFilePath))  {    HGLOBAL m_hMem=NULL;    DWORD dwLen=0;        try           {      //從檔案讀取      {        HANDLE hfile = CreateFile(szFilePath,          GENERIC_READ,           FILE_SHARE_READ,          NULL,          OPEN_EXISTING,          FILE_ATTRIBUTE_NORMAL,          NULL);        if(hfile != INVALID_HANDLE_VALUE)        {          dwLen= GetFileSize(hfile, NULL);          if(dwLen > 0)          {            m_hMem=GlobalAlloc(GMEM_MOVEABLE, dwLen);            if(m_hMem)            {              LPVOID pData = GlobalLock(m_hMem);                            if(pData)              {                DWORD dwReaded=0;                ReadFile(hfile, pData, dwLen, &dwReaded, NULL);                _ASSERT(dwReaded == dwLen);                          }              GlobalUnlock(m_hMem);            }          }          CloseHandle(hfile);        }      }            if(m_hMem)      {        //從記憶體建立IStream        IStream * m_pStream = NULL;        if(CreateStreamOnHGlobal(m_hMem, FALSE, &m_pStream) == S_OK)        {          //從IStream載入圖片          IPicture *m_pPicture=NULL;           if(OleLoadPicture(m_pStream, dwLen, TRUE, IID_IPicture, (LPVOID*)&m_pPicture) == S_OK)          {            //擷取圖片長寬            OLE_XSIZE_HIMETRIC m_JPEGWidth=0;            OLE_YSIZE_HIMETRIC m_JPEGHeight=0;            VERIFY(m_pPicture->get_Height(&m_JPEGHeight)==S_OK);            VERIFY(m_pPicture->get_Width(&m_JPEGWidth)==S_OK);            RECT rect;            GetClientRect(hWnd, &rect);            LONG nWidth = rect.right - rect.left;            LONG nHeight = rect.bottom - rect.top;            HDC hDstDC = GetDC(hWnd);            if(hDstDC)            {              HDC hDC = hDstDC;              //雙緩衝繪製控制代碼              HDC hMemDC = NULL;              HBITMAP hBitmap = NULL, hOldBitamp = NULL;              //雙緩衝繪製              if(bDoubleBuff)              {                hMemDC = CreateCompatibleDC(hDstDC);                hBitmap = CreateCompatibleBitmap(hDstDC, nWidth, nHeight);                hOldBitamp = (HBITMAP)SelectObject(hMemDC, hBitmap);                hDC = hMemDC;              }              //圖片像素點尺寸 此處僅為測試使用             #ifndef HIMETRIC_PER_INCH              #define HIMETRIC_PER_INCH 2540             #endif              LONG nPixWidth = MulDiv(m_JPEGWidth, GetDeviceCaps(hDC, LOGPIXELSX), HIMETRIC_PER_INCH);              LONG nPixHeiht = MulDiv(m_JPEGHeight, GetDeviceCaps(hDC, LOGPIXELSY), HIMETRIC_PER_INCH);              //繪製圖片              m_pPicture->Render(hDC,                 0, 0, nWidth, nHeight,                0,m_JPEGHeight, m_JPEGWidth, -m_JPEGHeight,                NULL);              //添加自訂繪製              {                //幀頻FPS統計記錄                {                  static DWORD dwCount=0;                  static DWORD dwLastTick=0;                  static double fFrameFreq = 0;                  dwCount++;                  DWORD dwThisTick = GetTickCount();                  if(dwThisTick > dwLastTick+1000)//超過一秒                  {                    //每秒種幀數                    fFrameFreq = (double)dwCount/((dwThisTick - dwLastTick)/1000.0);                    //為下一次統計做準備                    dwLastTick = dwThisTick;                    dwCount = 0;                  }                 #ifndef _stprintf_s                  #define _stprintf_s _stprintf                 #endif                                  TCHAR szBuffer[32];                  _stprintf_s(szBuffer, _T("FrameFreq=%.3fF/S"), fFrameFreq);                  TextOut(hDC, 0, 0, szBuffer, _tcslen(szBuffer));                }                //其它繪製                {                }              }              //雙緩衝繪製—緩衝區拷貝到目標DC              if(bDoubleBuff && hMemDC)              {                BitBlt(hDstDC,                   0, 0, nWidth, nHeight,                  hMemDC,                  0, 0,                  SRCCOPY);              }              //清理記憶體緩衝              if(hMemDC && hOldBitamp)                SelectObject(hMemDC, hOldBitamp);              if(hBitmap)                DeleteObject(hBitmap);              if(hMemDC)                DeleteObject(hMemDC);              //釋放有GetDC擷取的DC裝置              ReleaseDC(hWnd, hDstDC);            }            //釋放m_pPicture            m_pPicture->Release();          }                    //釋放m_pStream          m_pStream->Release();        }                //釋放記憶體        GlobalFree(m_hMem);        m_hMem=NULL;      }          }    catch(...)    {      _ASSERT(0);      throw;      }        }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.