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