OleLoadPicture 在指定窗口上绘制

  
#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
#endif

void 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;  
    }
      
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值