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 }
  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/javado/p/2791725.html
Copyright © 2011-2022 走看看