zoukankan      html  css  js  c++  java
  • IPicture

     1 #pragma once
     2 
     3 
     4 class CPicture
     5 {
     6 public:
     7     CPicture();
     8     virtual ~CPicture();
     9 
    10 public:
    11     BOOL LoadPictureFromRes( UINT nPicID, LPCTSTR lpszResType );
    12     BOOL LoadPictureFromFile( LPCTSTR lpszFile );
    13     BOOL Draw( HDC hDC, LPCRECT lprcDest, LPCRECT lprcSrc = NULL );
    14     void Release();
    15     inline operator bool() const;
    16     BOOL GetSize( LPSIZE lpSize, HDC hDC );
    17 
    18 protected:
    19     IPicture* m_pPic;
    20     OLE_XSIZE_HIMETRIC m_nWidth, m_nHeight;
    21 };
      1 #include "Picture.h"
      2 
      3 CPicture::CPicture() : m_pPic( NULL )
      4 {
      5 }
      6 
      7 CPicture::~CPicture()
      8 {
      9     if ( m_pPic != NULL )
     10     {
     11         m_pPic->Release();
     12     }
     13 }
     14 
     15 CPicture::operator bool() const
     16 {
     17     return m_pPic != NULL ? true : false;
     18 }
     19 
     20 void CPicture::Release()
     21 {
     22     if ( m_pPic != NULL )
     23     {
     24         m_pPic->Release();
     25         m_pPic = NULL;
     26     }
     27 }
     28 
     29 
     30 BOOL CPicture::LoadPictureFromRes( UINT nPicID, LPCTSTR lpszResType )
     31 {
     32     HINSTANCE hInst;
     33     HRSRC hRes;
     34     HGLOBAL hGlobal, hMem;
     35     LPVOID lpData, lpBuf;
     36     DWORD dwSize;
     37     HRESULT hr;
     38     IStream* pStm;
     39 
     40     if ( m_pPic )
     41     {
     42         m_pPic->Release();
     43         m_pPic = NULL;
     44     }
     45 
     46     hInst = ::GetModuleHandle( NULL );
     47 
     48     hRes = ::FindResource( hInst, MAKEINTRESOURCE( nPicID ), lpszResType );
     49     if ( hRes == NULL )
     50     {
     51         return NULL;
     52     }
     53 
     54     hGlobal = ::LoadResource( hInst, hRes );
     55     if ( hGlobal == NULL )
     56     {
     57         return NULL;
     58     }
     59 
     60     dwSize = ::SizeofResource( hInst, hRes );
     61 
     62     hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
     63     if ( hMem == NULL )
     64     {
     65         ::FreeResource( hGlobal );
     66         return FALSE;
     67     }
     68 
     69     lpBuf = ::GlobalLock( hMem );
     70     lpData = ::LockResource( hGlobal );
     71     memcpy( lpBuf, lpData, dwSize );
     72     ::GlobalUnlock( hMem );
     73 
     74     //UnlockResource
     75     ::FreeResource( hGlobal );
     76 
     77     hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStm );
     78     if ( FAILED( hr ) )
     79     {
     80         ::GlobalFree( hMem );
     81         return FALSE;
     82     }
     83 
     84     hr = ::OleLoadPicture( pStm, dwSize, TRUE, IID_IPicture, ( LPVOID* )&m_pPic );
     85     if ( hr != S_OK )
     86     {
     87         //m_pPic = NULL;
     88         pStm->Release();
     89         return FALSE;
     90     }
     91 
     92     m_pPic->get_Width( &m_nWidth );
     93     m_pPic->get_Height( &m_nHeight );
     94 
     95     pStm->Release();
     96     return TRUE;
     97 }
     98 
     99 BOOL CPicture::LoadPictureFromFile( LPCTSTR lpszFile )
    100 {
    101     BOOL bRet;
    102     HANDLE hFile;
    103     DWORD dwSize, dwSizeHigh, dwReads;
    104     HGLOBAL hMem;
    105     LPVOID lpBuf;
    106     HRESULT hr;
    107     IStream* pStm;
    108 
    109     if ( m_pPic )
    110     {
    111         m_pPic->Release();
    112         m_pPic = NULL;
    113     }
    114 
    115     hFile = ::CreateFile( lpszFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    116     if ( hFile == INVALID_HANDLE_VALUE )
    117     {
    118         return FALSE;
    119     }
    120 
    121     dwSize = ::GetFileSize( hFile, &dwSizeHigh );
    122     if ( dwSize == INVALID_FILE_SIZE || dwSizeHigh != 0 )
    123     {
    124         ::CloseHandle( hFile );
    125         return FALSE;
    126     }
    127 
    128     hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
    129     if ( hMem == NULL )
    130     {
    131         ::CloseHandle( hFile );
    132         return FALSE;
    133     }
    134 
    135     lpBuf = ::GlobalLock( hMem );
    136 
    137     bRet = ::ReadFile( hFile, lpBuf, dwSize, &dwReads, NULL );
    138     if ( !bRet || dwReads != dwReads )
    139     {
    140         ::CloseHandle( hFile );
    141         ::GlobalUnlock( hMem );
    142         ::GlobalFree( hMem );
    143         return FALSE;
    144     }
    145 
    146     ::CloseHandle( hFile );
    147     ::GlobalUnlock( hMem );
    148 
    149     hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStm );
    150     if ( FAILED( hr ) )
    151     {
    152         ::GlobalFree( hMem );
    153         return FALSE;
    154     }
    155 
    156     hr = ::OleLoadPicture( pStm, dwSize, TRUE, IID_IPicture, ( LPVOID* )&m_pPic );
    157     if ( hr != S_OK )
    158     {
    159         //m_pPic = NULL;
    160         pStm->Release();
    161         return FALSE;
    162     }
    163 
    164     m_pPic->get_Width( &m_nWidth );
    165     m_pPic->get_Height( &m_nHeight );
    166 
    167     pStm->Release();
    168     return TRUE;
    169 }
    170 
    171 BOOL CPicture::GetSize( LPSIZE lpSize, HDC hDC )
    172 {
    173     int cxPerInch, cyPerInch;
    174 
    175     if ( lpSize == NULL || hDC == NULL )
    176     {
    177         return FALSE;
    178     }
    179 
    180     cxPerInch = ::GetDeviceCaps( hDC, LOGPIXELSX );
    181     cyPerInch = ::GetDeviceCaps( hDC, LOGPIXELSY );
    182 
    183     if ( cxPerInch == 0 || cyPerInch == 0 )
    184     {
    185         return FALSE;
    186     }
    187 
    188     lpSize->cx = ::MulDiv( m_nWidth, cxPerInch, HIMETRIC_INCH );
    189     lpSize->cy = ::MulDiv( m_nHeight, cyPerInch, HIMETRIC_INCH );
    190 
    191     return TRUE;
    192 }
    193 
    194 
    195 BOOL CPicture::Draw( HDC hDC, LPCRECT lprcDest, LPCRECT lprcSrc )
    196 {
    197     POINT ptOri;
    198     SIZE szSize;
    199     int cxPerInch, cyPerInch;
    200     HRESULT hr;
    201 
    202     if ( hDC == NULL || lprcDest == NULL || m_pPic == NULL )
    203     {
    204         return FALSE;
    205     }
    206 
    207     if ( lprcSrc == NULL )
    208     {
    209         hr = m_pPic->Render( hDC, lprcDest->left, lprcDest->top, \
    210                              lprcDest->right - lprcDest->left, \
    211                              lprcDest->bottom - lprcDest->top, \
    212                              0, m_nHeight, m_nWidth, -m_nHeight, \
    213                              NULL );
    214     }
    215     else
    216     {
    217         cxPerInch = ::GetDeviceCaps( hDC, LOGPIXELSX );
    218         cyPerInch = ::GetDeviceCaps( hDC, LOGPIXELSY );
    219 
    220         if ( cxPerInch == 0 || cyPerInch == 0 )
    221         {
    222             return FALSE;
    223         }
    224 
    225         ptOri.x = ::MulDiv( lprcSrc->left, HIMETRIC_INCH, cxPerInch );
    226         ptOri.y = ::MulDiv( lprcSrc->top, HIMETRIC_INCH, cyPerInch );
    227 
    228         szSize.cx = ::MulDiv( lprcSrc->right - lprcSrc->left, HIMETRIC_INCH, cxPerInch );
    229         szSize.cy = ::MulDiv( lprcSrc->bottom - lprcSrc->top, HIMETRIC_INCH, cyPerInch );
    230 
    231         hr = m_pPic->Render( hDC, lprcDest->left, lprcDest->top, \
    232                              lprcDest->right - lprcDest->left, \
    233                              lprcDest->bottom - lprcDest->top, \
    234                              ptOri.x, m_nHeight - ptOri.y, szSize.cx, -szSize.cy, \
    235                              NULL );
    236     }
    237 
    238     return hr == S_OK ? TRUE : FALSE;
    239 }
  • 相关阅读:
    车标知识学习网页开发,与Flask通过base64展示二进制图片 #华为云·寻找黑马程序员#
    大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#
    大型情感剧集Selenium:2_options设置 #华为云·寻找黑马程序员#
    【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署
    大型情感剧集Selenium:1_介绍 #华为云·寻找黑马程序员#
    使用Python开发小说下载器,不再为下载小说而发愁 #华为云·寻找黑马程序员#
    #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else
    #华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源
    走近深度学习,认识MoXing:初识华为云ModelArts的王牌利器 — MoXing
    开启 J2EE(一)—‘全明星队伍’
  • 原文地址:https://www.cnblogs.com/javado/p/2791725.html
Copyright © 2011-2022 走看看