CImageMaster轻松显示图片

//========================================================================
//TITLE:
//    CImageMaster轻松显示图片
//AUTHOR:
//    norains
//DATE:
//    Sunday  26-September-2007
//Environment:
//        EVC4.0 + Windows CE 5.0 Standard SDK
//========================================================================
    虽然IImaging组件可以很简单地显示图片,但如果是更好地显示图片,却又不简单.那有没有什么方法能很简单又能更好地显示图片呢?答案是:有!那就是使用CImageMaster类!
   
    ...
   
    ... ...
   
    ... ... ...
   
    Oh,Forgive me! 原谅我这个自卖自夸的人吧! 原谅我这个无聊的人偶尔发发的牢骚吧!世界多美好! :-)
   
    这篇豆腐块主要是介绍CImageMaster的使用,而代码的主要思想可以参考我另外一篇文章:详聊IImage的图片显示 http://blog.csdn.net/norains/archive/2007/08/26/1759912.aspx
   
   
    好吧,老样子,让我们看看该类的函数吧:
   
    1.Open(const TCHAR *pcszFile)
     
      打开一个图片文件.如果打开成功,需要调用Close()函数进行资源的释放.
     
   
    2.Close()
   
      调用Open()成功后需调用该函数进行资源的释放.
     
     
    3.IsOK()
   
      判断是否已经准备好绘制图档.
     
     
    4.GetHeight()
   
      获取图片的高度.
     
     
    5.GetWidth()
   
      获取图片的宽度.
     
     
    6.DrawIntegrity(HDC hdc, ImageDrawMode mode,const RECT *pDstRect, const RECT *pSrcRect,BOOL bDraw)
   
      绘制原始图档.如果图片过大,可能会绘制失败.
     
      hdc:目标DC
     
      mode:绘制的模式.
        IMG_FIT - 按比例拉伸至整个pDstRect区域.
        IMG_STRETCH - 填充整个pDstRect区域,而不管其比例.
        IMG_NATIVE - 如果pSrcRect区域小于pDstRect,则按pSrcRect的大小在pDstRect居中显示;如果pSrcRect区域大于pDstRect,则效果和IMG_FIT相同.
       
      pDstRect: 目标DC所绘制的区域.
     
      pSrcRect: 源DC所需要绘制的区域.
     
      bDraw: 为TRUE时立刻绘制到hdc;为FALSE不绘制到hdc上.因为在DrawIntegrity()函数中需要从文件中获取文件信息并创建图片DC来保存图片信息,所以第一调用的时候会比较慢,但以后由于是将图片DC直接绘制到hdc中,所以速度会大大加快.
     
     
     
    7.DrawThumbnail(HDC hdc, ImageDrawMode mode, const RECT *pDstRect, const RECT *pSrcRect, BOOL bDraw)
   
        绘制缩略图.如果DrawIntegrity()函数失败,调用该函数绘制缩略图可能会成功.
       
        参数的意义和DrawIntegrity()相同.
       
       
    代码的具体作用和思想请参见:http://blog.csdn.net/norains/archive/2007/08/26/1759912.aspx
   
    CImageMaster的代码如下:
        
     
/ /    
//  ImageMaster.h: interface for the CImageMaster class.
//
// Version:
//     1.1.1
//
// Date:
//     2007.08.13
/ /

#ifndef IMAGEMASTER_H
#define  IMAGEMASTER_H


#include 
" imaging.h "



// --------------------------------------------------------------------
// Enum value
enum  ImageDrawMode
{    
    
// Fit to the play window size. How wide (height) the window is, how 
    
// is the move. Keep aspect ratio.
    IMG_FIT,

    
// Not support.Stretch to the play window size. Don't keep the aspect ratio.
    IMG_STRETCH,


    
// When the size of video is smaller than the play window, it displayes
    
// as the video size. If it's bigger , it just like the DISP_FIT mode.
    IMG_NATIVE
};

class  CImageMaster
{
public :
    BOOL DrawThumbnail(HDC hdc, ImageDrawMode mode, 
const  RECT  * pDstRect,  const  RECT  * pSrcRect, BOOL bDraw);
    BOOL DrawIntegrity(HDC hdc, ImageDrawMode mode,
const  RECT  * pDstRect,  const  RECT  * pSrcRect,BOOL bDraw);    
    BOOL IsOK();    
    
void  Close();
    UINT GetHeight();
    UINT GetWidth();
    BOOL Open(
const  TCHAR  * pcszFile);
    CImageMaster();
    
virtual   ~ CImageMaster();

protected :    
    
void  CalculateDrawArea(ImageDrawMode mode, const  RECT  * pDstRect, const  RECT  * pSrcRect,RECT  * pDrawRect);
    BOOL IsOKImagingInterfaces();
    
void  ReleaseImagingInterfaces();
    IImage 
*  m_pImage;
    IImagingFactory 
*  m_pImagingFactory;
    TCHAR m_szFileName[MAX_PATH];
    ImageInfo m_ImageInfo;
    RECT m_rcLastThumbnail; 
// The last drawed area for the  DrawThumbnail() function.



    
// It's for the memory DC information
    typedef  struct  MemoryDCInfo
    {
        HBITMAP hBitmap;
        HDC hdc;
        HGDIOBJ hOldSel;
        UINT uiWidth;
        UINT uiHeight;
    }MEMORYDCINFO,
* PMEMORYDCINFO;

    MEMORYDCINFO m_IntegrityMemDCInfo;
    MEMORYDCINFO m_ThumbnailMemDCInfo;
    
void  DeleteMemoryDC(MEMORYDCINFO  * pDCInfo);
    BOOL CreateMemoryDC(HDC hdc,MEMORYDCINFO 
* pDCInfo,UINT uiWidth,UINT uiHeight);
    BOOL IsOKMemoryDC(
const  MEMORYDCINFO  * pMemDC);
    BOOL Draw(HDC hdcDest, 
const  RECT  * pDstRect, const  MEMORYDCINFO  * pSrcDCInfo,  const  RECT  * pSrcRect);
};

#endif   //  #ifndef IMAGE_H







/ /
//  Image.cpp: implementation of the CImageMaster class.
//
/ /
#include  " stdafx.h "
#include 
" initguid.h "
#include 
" ImageMaster.h "


// ======================================================================
// Link the .lib
#pragma  comment (lib,"Ole32.lib")

// =======================================================================


/ /
//  Construction/Destruction
/ /

CImageMaster::CImageMaster():
m_pImage(NULL),
m_pImagingFactory(NULL)
{
    memset(m_szFileName,
0 , sizeof (m_szFileName));
    memset(
& m_ImageInfo, 0 , sizeof (m_ImageInfo));
    memset(
& m_IntegrityMemDCInfo, 0 , sizeof (m_IntegrityMemDCInfo));
    memset(
& m_ThumbnailMemDCInfo, 0 , sizeof (m_ThumbnailMemDCInfo));
    memset(
& m_rcLastThumbnail, 0 , sizeof (m_rcLastThumbnail));
}

CImageMaster::
~ CImageMaster()
{
    Close();
}


// ----------------------------------------------------------------------
// Description:
//     Open the image file
//
// Parameters:
//     pcszFile : [in] The image file to open
//
// Return Value:
//     TRUE -- Succeed in opening the file
//   FALSE -- Failed in opening the file
// ----------------------------------------------------------------------
BOOL CImageMaster::Open( const  TCHAR  * pcszFile)
{
    BOOL bResult 
=  FALSE;

    HRESULT hr;

    
if  (FAILED(hr  =  CoInitializeEx(NULL, COINIT_MULTITHREADED)))
    {  
        
goto  END;
    }

    
if (FAILED(hr  =  CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,( void ** & m_pImagingFactory)))
    {
        
goto  END;
    }

    
if (FAILED(hr  =  m_pImagingFactory -> CreateImageFromFile(pcszFile,  & m_pImage)))
    {
        
goto  END;
    }

    m_pImage
-> GetImageInfo( & m_ImageInfo);
    _tcscpy(m_szFileName,pcszFile);

    bResult 
=  TRUE;

END:
    
if (bResult  ==  FALSE)
    {
        Close();
    }

    
return  bResult;
}



// ----------------------------------------------------------------------
// Description:
//     Get the width of the image
//
// Parameters:
//     NULL
//
// Return Value:
//     0 -- May be failure.
//   others -- succeed
// ----------------------------------------------------------------------
UINT CImageMaster::GetWidth()
{

    
return  m_ImageInfo.Width;
}


// ----------------------------------------------------------------------
// Description:
//     Get the height of the image
//
// Parameters:
//     NULL
//
// Return Value:
//     0 -- May be failure.
//   others -- succeed
// ----------------------------------------------------------------------
UINT CImageMaster::GetHeight()
{
    
return  m_ImageInfo.Height;
}



// ----------------------------------------------------------------------
// Description:
//     Close the opened image to release the resource
//
// Parameters:
//     NULL
//
// Return Value:
//     NULL
// ----------------------------------------------------------------------
void  CImageMaster::Close()
{

    ReleaseImagingInterfaces();
    DeleteMemoryDC(
& m_IntegrityMemDCInfo);
    DeleteMemoryDC(
& m_ThumbnailMemDCInfo);

    memset(m_szFileName,
0 , sizeof (m_szFileName));
    memset(
& m_ImageInfo, 0 , sizeof (m_ImageInfo));
    memset(
& m_rcLastThumbnail, 0 , sizeof (m_rcLastThumbnail));
}






// -----------------------------------------------------------------------------------------------
// Description:
//     Check the object is read for operating. If failed in calling the Open() or never call before,
// it will return FALSE.
//
// Parameters:
//     NULL
//
// Return Values:
//     TRUE - It's all ready for other operating.
//     FALSE - It's not ready.
//
// ---------------------------------------------------------------------------------------------------------
BOOL CImageMaster::IsOK()
{
    
if (IsOKMemoryDC( & m_IntegrityMemDCInfo)  ==  FALSE  &&  
        IsOKMemoryDC(
& m_ThumbnailMemDCInfo)  ==  FALSE  &&  
        IsOKImagingInterfaces() 
==  FALSE)
    {    
        
return  FALSE;    
    }

    
return  TRUE;
}



// -----------------------------------------------------------------------------------------------
// Description:
//     Release the imaging interfaces resource.
//
// ----------------------------------------------------------------------------------------------
void  CImageMaster::ReleaseImagingInterfaces()
{
    
if (m_pImage  !=  NULL)
    {
        m_pImage
-> Release();
        m_pImage 
=  NULL;
    }

    
if (m_pImagingFactory  !=  NULL)
    {
        m_pImagingFactory
-> Release();
        m_pImagingFactory 
=  NULL;
    }

    CoUninitialize();
}


// -----------------------------------------------------------------------------------------------
// Description:
//     Create the memory DC for storing the image data.
//
// Parameters:
//     hdc : [in] The source DC
//     pDCInfo : [out] The created memory DC
//     uiWidth : [in] The memory DC width
//     uiHeight : [in] The memory DC height
//
// ----------------------------------------------------------------------------------------------
BOOL CImageMaster::CreateMemoryDC(HDC hdc,MEMORYDCINFO  * pDCInfo,UINT uiWidth,UINT uiHeight)
{
    BOOL bResult 
=  FALSE;

    
// Create a DC that matches the device
    pDCInfo -> hBitmap  =  CreateCompatibleBitmap(hdc,uiWidth,uiHeight);
    
if (pDCInfo -> hBitmap  ==  NULL)
    {
        
goto  END;
    }

    pDCInfo
-> hdc  =  CreateCompatibleDC(hdc);
    
if (pDCInfo -> hdc  ==  NULL)
    {
        
goto  END;
    }

    
// Select the bitmap into to the compatible device context
    pDCInfo -> hOldSel  =  SelectObject(pDCInfo -> hdc,pDCInfo -> hBitmap);

    pDCInfo
-> uiWidth  =  uiWidth;
    pDCInfo
-> uiHeight  =  uiHeight;

    bResult 
=  TRUE;

END:
    
if (bResult  ==  FALSE)
    {
        DeleteMemoryDC(pDCInfo);
        memset(pDCInfo,
0 , sizeof (MEMORYDCINFO));
    }

    
return  TRUE;
}


// -----------------------------------------------------------------------------------------------
// Description:
//     Delete the memory DC to release resource
//
// Parameters:
//     pDCInfo : [out] The created memory DC to be deleted.
// ----------------------------------------------------------------------------------------------
void  CImageMaster::DeleteMemoryDC(MEMORYDCINFO  * pDCInfo)
{
    SelectObject(pDCInfo
-> hdc,pDCInfo -> hOldSel);
    DeleteObject(pDCInfo
-> hBitmap);    
    DeleteDC(pDCInfo
-> hdc);

    memset(pDCInfo,
0 , sizeof (MEMORYDCINFO));
}


// -----------------------------------------------------------------------------------------------
// Description:
//     Check the imaging interfaces whether ready or not.
//
// Parameters:
//     NULL
//
// Return Values:
//     TRUE - It's  ready
//     FALSE - It's not ready.
//
// ---------------------------------------------------------------------------------------------------------
BOOL CImageMaster::IsOKImagingInterfaces()
{
    
if (m_pImage  ==  NULL  ||  m_pImagingFactory  ==  NULL)
    {
        
return  FALSE;
    }

    
return  TRUE;
}


// -----------------------------------------------------------------------------------------------
// Description:
//     Check the memory whether ready or not.
//
// Parameters:
//     pMemDC : [in] The memory DC to checked.
//
// Return Values:
//     TRUE - It's  ready
//     FALSE - It's not ready.
//
// ---------------------------------------------------------------------------------------------------------
BOOL CImageMaster::IsOKMemoryDC( const  MEMORYDCINFO  * pMemDC)
{
    
if (pMemDC -> hdc  ==  NULL  ||  pMemDC -> hBitmap  ==  NULL  ||  pMemDC -> hOldSel  ==  NULL)
    {
        
return  FALSE;
    }

    
return  TRUE;
}


// -----------------------------------------------------------------------------------------------
// Description:
//     Caculate the draw area
//
// Parameters:
//     mode : [in] The image display mode.
//     pDstRect : [in] A pointer to a RECT value defining the portion of the display area within the graphics context that receives the output from this method. 
//     psrcRect : [in] An optional pointer to a RECT that specifies, in 0.01mm units, the portion of the image to be drawn in dstRect. 
//                 To display the entire image, set this value to NULL. 
//     pDrawRect : [out] The calculated draw area.
//
// -----------------------------------------------------------------------------------------------
void  CImageMaster::CalculateDrawArea(ImageDrawMode mode, const  RECT  * pDstRect,  const  RECT  * pSrcRect, RECT  * pDrawRect)
{
    RECT rcDraw 
=  { 0 };

    
if (mode  ==  IMG_FIT  ||  mode  ==  IMG_NATIVE)
    {
        LONG lDstWidth 
=  (pDstRect -> right  >  pDstRect -> left)  ?  (pDstRect -> right  -  pDstRect -> left) : (pDstRect -> left  -  pDstRect -> right);
        LONG lDstHeight 
=  (pDstRect -> bottom  >  pDstRect -> top)  ?  (pDstRect -> bottom  -  pDstRect -> top) : (pDstRect -> top  >  pDstRect -> bottom);
        LONG lSrcWidth 
=  (pSrcRect  ==  NULL)  ?  m_ImageInfo.Width : (pSrcRect -> right  -  pSrcRect -> left);
        LONG lSrcHeight 
=  (pSrcRect  ==  NULL)  ?  m_ImageInfo.Height : (pSrcRect -> bottom  -  pSrcRect -> top);

        LONG lDispLeft,lDispTop,lDispWidth,lDispHeight;

        
if (mode  ==  IMG_NATIVE  &&  lDstWidth  >=  lSrcWidth  &&  lDstHeight  >=  lSrcHeight)
        {
            lDispLeft 
=  (lDstWidth  -  lSrcWidth)  /   2   +  pDstRect -> left;
            lDispTop 
=  (lDstHeight  -  lSrcHeight)  /   2   +  pDstRect -> top;
            lDispWidth 
=  lSrcWidth ;
            lDispHeight 
=  lSrcHeight ;
        }
        
else
        {
            
if (lSrcWidth  *  lDstHeight  >  lDstWidth  *  lSrcHeight)
            {
                lDispWidth 
=  lDstWidth;                
                lDispHeight 
=  (LONG)(( float )lDispWidth  /  ( float )lSrcWidth  *  lSrcHeight);
                lDispLeft 
=  pDstRect -> left;
                lDispTop 
=  (lDstHeight  -  lDispHeight)  /   2   +  pDstRect -> top;        
            }
            
else   if (lSrcWidth  *  lDstHeight  <  lDstWidth  *  lSrcHeight)
            {
                lDispHeight 
=  lDstHeight;
                lDispWidth 
=  (LONG)(( float )lDispHeight  /  ( float )lSrcHeight  *  lSrcWidth);
                lDispLeft 
=  (lDstWidth  -  lDispWidth)  /   2   +  pDstRect -> left;
                lDispTop 
=  pDstRect -> top;
            }
            
else
            {
                lDispWidth 
=  lDstWidth;                
                lDispHeight 
=  lDstHeight;
                lDispLeft 
=  pDstRect -> left;
                lDispTop 
=  pDstRect -> top;
            }
        }
        
        rcDraw.left 
=  lDispLeft;
        rcDraw.top 
=  lDispTop;
        rcDraw.right 
=  lDispLeft  +  lDispWidth;
        rcDraw.bottom 
=  lDispTop  +  lDispHeight;
    
    }
    
else   if (mode  ==  IMG_STRETCH)
    {        
        rcDraw 
=   * pDstRect;
    }

    
* pDrawRect  =  rcDraw;

}


// ----------------------------------------------------------------------
// Description:
//     This method displays the whole image onto the specified area as to the mode value.
// If you call the function first, it may cost a long time because of the initializing, but much quickly next time.
// So you could set the bDraw to FALSE and call the function to intialize before.
//
// Parameters:
//     hdc : [in] An HDC value that is the graphics context that receives output from this method. 
//     mode : [in] The image display mode.
//     pDstRect : [in] A pointer to a RECT value defining the portion of the display area within the graphics context that receives the output from this method. 
//     psrcRect : [in] An optional pointer to a RECT that specifies, in 0.01mm units, the portion of the image to be drawn in dstRect. 
//                 To display the entire image, set this value to NULL. 
//     bDraw : [in] If it's true, it will draw to the Dest DC immediately, or it only intializes. 
//     
// Return Value:
//     TRUE -- Succeed 
//   FALSE -- Failed 
// ----------------------------------------------------------------------
BOOL CImageMaster::DrawIntegrity(HDC hdc, ImageDrawMode mode,  const  RECT  * pDstRect,  const  RECT  * pSrcRect, BOOL bDraw)
{
    
if (pDstRect  ==  NULL)
    {
        
return  FALSE;
    }

    
if (IsOKMemoryDC( & m_IntegrityMemDCInfo)  ==  FALSE)
    {
        
// The imaging interfaces may close before,
        
// we must open again
         if (IsOKImagingInterfaces()  ==  FALSE  &&  Open(m_szFileName)  ==  FALSE)
        {
            
return  FALSE;
        }

        
if (CreateMemoryDC(hdc, & m_IntegrityMemDCInfo,m_ImageInfo.Width,m_ImageInfo.Height)  ==  FALSE)
        {
            
return  FALSE;
        }

        RECT rcMemDC 
=  { 0 , 0 ,m_ImageInfo.Width,m_ImageInfo.Height};    
        HRESULT hr 
=  m_pImage -> Draw(m_IntegrityMemDCInfo.hdc, & rcMemDC,NULL);
        
if (FAILED(hr))
        {
            ReleaseImagingInterfaces();
            DeleteMemoryDC(
& m_IntegrityMemDCInfo);
            
return  FALSE;
        }
    }
    
    BOOL bResult 
=  TRUE;
    
if (bDraw  ==  TRUE)
    {
        RECT rcDraw 
=  { 0 };
        CalculateDrawArea(mode,pDstRect,pSrcRect,
& rcDraw);
        bResult 
=  Draw(hdc, & rcDraw, & m_IntegrityMemDCInfo,pSrcRect);
    }


    
if (IsOKImagingInterfaces()  ==  TRUE)
    {
        ReleaseImagingInterfaces();
    }

    
return  bResult;
}


// ----------------------------------------------------------------------
// Description:
//     This method displays the Thumbnail image onto the specified area as to the mode value. If the pDstRect value is larger than the pSrcRect,
// it's the same as the DrawIntegrity() function, or it displayed the thumbnail which is not clarity enough.
// If you call the function first, it may cost a long time because of the initializing, but much quickly next time.
// So you could set the bDraw to FALSE and call the function to intialize before.
//
// Parameters:
//     hdc : [in] An HDC value that is the graphics context that receives output from this method. 
//     mode : [in] The image display mode.
//     pDstRect : [in] A pointer to a RECT value defining the portion of the display area within the graphics context that receives the output from this method. 
//     psrcRect : [in] An optional pointer to a RECT that specifies, in 0.01mm units, the portion of the image to be drawn in dstRect. 
//                 To display the entire image, set this value to NULL. 
//     bDraw : [in] If it's true, it will draw to the Dest DC immediately, or it only intializes. 
//     
// Return Value:
//     TRUE -- Succeed 
//   FALSE -- Failed 
// ----------------------------------------------------------------------
BOOL CImageMaster::DrawThumbnail(HDC hdc, ImageDrawMode mode,  const  RECT  * pDstRect,  const  RECT  * pSrcRect, BOOL bDraw)
{
    
if (pDstRect  ==  NULL)
    {
        
return  FALSE;
    }

    
if (IsOKMemoryDC( & m_ThumbnailMemDCInfo)  ==  FALSE  ||  
        m_rcLastThumbnail.right 
-  m_rcLastThumbnail.left  !=  pDstRect -> right  -  pDstRect -> left  ||
        m_rcLastThumbnail.bottom 
-  m_rcLastThumbnail.top  !=  pDstRect -> bottom  -  pDstRect -> top)
    {
        m_rcLastThumbnail 
=   * pDstRect;

        
// The imaging interfaces may close before,
        
// we must open again
         if (IsOKImagingInterfaces()  ==  FALSE  &&  Open(m_szFileName)  ==  FALSE)
        {
            
return  FALSE;
        }


        
// Delete the memory DC created before
         if (IsOKMemoryDC( & m_ThumbnailMemDCInfo)  ==  TRUE)
        {
            DeleteMemoryDC(
& m_ThumbnailMemDCInfo);
        }


        
// Caculate the minimun thumbnail width and height for creating memory DC.
        
// The IMG_NATIVE mode is most approximately to the actual image
        RECT rcMinImg  =  { 0 }; 
        CalculateDrawArea(IMG_NATIVE,pDstRect,NULL,
& rcMinImg);        

        
int  iImgThumWidth  =  (rcMinImg.right  >  rcMinImg.left)  ?  (rcMinImg.right  -  rcMinImg.left) : (rcMinImg.left  -  rcMinImg.right);
        
int  iImgThumHeight  =  (rcMinImg.bottom  >  rcMinImg.top)  ?  (rcMinImg.bottom  -  rcMinImg.top) : (rcMinImg.top  -  rcMinImg.bottom);
        
if (CreateMemoryDC(hdc, & m_ThumbnailMemDCInfo,iImgThumWidth,iImgThumHeight)  ==  FALSE)
        {
            
return  FALSE;
        }
    
        IImage 
* pImgThumbnail  =  NULL;
        m_pImage
-> GetThumbnail(iImgThumWidth,iImgThumHeight, & pImgThumbnail);


        RECT rcMem 
=  { 0 , 0 ,iImgThumWidth,iImgThumHeight};
        HRESULT hr 
=  pImgThumbnail -> Draw(m_ThumbnailMemDCInfo.hdc, & rcMem,NULL);
        
if (FAILED(hr))
        {
            ReleaseImagingInterfaces();
            DeleteMemoryDC(
& m_ThumbnailMemDCInfo);
            memset(
& m_rcLastThumbnail, 0 , sizeof (m_rcLastThumbnail));
            
return  FALSE;
        }

        
    }
    

    BOOL bResult 
=  TRUE;
    
if (bDraw  ==  TRUE)
    {
        RECT rcDraw 
=  { 0 };
        RECT rcImg 
=  { 0 };

        
if (pSrcRect  ==  NULL)
        {
            CalculateDrawArea(mode,pDstRect,NULL,
& rcDraw);
            bResult 
=  Draw(hdc, & rcDraw, & m_ThumbnailMemDCInfo,NULL);
        }
        
else
        {
            
// Get the width and height with the ratio
            rcImg.left  =  m_ThumbnailMemDCInfo.uiWidth  *  pSrcRect -> left  /  m_ImageInfo.Width;
            rcImg.top 
=  m_ThumbnailMemDCInfo.uiHeight  *  pSrcRect -> top  /  m_ImageInfo.Height;
            rcImg.right 
=  m_ThumbnailMemDCInfo.uiWidth  *  pSrcRect -> right  /  m_ImageInfo.Width;
            rcImg.bottom 
=  m_ThumbnailMemDCInfo.uiHeight  *  pSrcRect -> bottom  /  m_ImageInfo.Height;

            CalculateDrawArea(mode,pDstRect,
& rcImg, & rcDraw);
            bResult 
=  Draw(hdc, & rcDraw, & m_ThumbnailMemDCInfo, & rcImg);
        }
    }


    
if (IsOKImagingInterfaces()  ==  TRUE)
    {
        ReleaseImagingInterfaces();
    }

    
return  bResult;





}



// ----------------------------------------------------------------------
// Description:
//     Draw the source DC to dest DC
//
// Parameters:
//     hdcDest : [in] Handle to the destination device context.  
//     pDstRect : [in] The dest area
//     hdcSrc : [in] The source memory DC information
//     pSrcRect : [in] The source area to be drawed
//
BOOL CImageMaster::Draw(HDC hdcDest,  const  RECT  * pDstRect, const  MEMORYDCINFO  * pSrcDCInfo,  const  RECT  * pSrcRect)
{
    BOOL bResult 
=  FALSE;
    
if (pSrcRect  ==  NULL)
    {
        bResult 
=  StretchBlt(hdcDest,
                            pDstRect
-> left,
                            pDstRect
-> top,
                            pDstRect
-> right  -  pDstRect -> left,
                            pDstRect
-> bottom  -  pDstRect -> top,
                            pSrcDCInfo
-> hdc,
                            
0 ,
                            
0 ,
                            pSrcDCInfo
-> uiWidth,
                            pSrcDCInfo
-> uiHeight,
                            SRCCOPY);            
    }
    
else
    {
        bResult 
=  StretchBlt(hdcDest,
                            pDstRect
-> left,
                            pDstRect
-> top,
                            pDstRect
-> right  -  pDstRect -> left,
                            pDstRect
-> bottom  -  pDstRect -> top,
                            pSrcDCInfo
-> hdc,
                            pSrcRect
-> left,
                            pSrcRect
-> top,
                            pSrcRect
-> right  -  pSrcRect -> left,
                            pSrcRect
-> bottom  -  pSrcRect -> top,
                            SRCCOPY);
    }

    
return  bResult;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值