#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;
}
}
}
OleLoadPicture 在指定窗口上绘制
最新推荐文章于 2020-08-11 01:00:09 发布