使用IPicture接口显示图片

以下代码使用IPicture接口显示图片,可直接放于OnDraw函数中。

IPictrue接口支持BMP、DIB、EMF、GIF、ICO、JPG、WMF格式图片的显示,但只能保存BMP和ICO格式的图片。

//  pDoc为文档对象指针
//  pDC为设备描述表指针

::CoInitialize(NULL);  
//  COM 初始化
HRESULT hr;
CFile file;

file.Open(pDoc
-> GetPathName(), CFile::modeRead  |  CFile::shareDenyNone );   //  读入文件内容
DWORD dwSize  =  file.GetLength();
HGLOBAL hMem 
=  ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
LPVOID lpBuf 
=  ::GlobalLock( hMem );
file.ReadHuge( lpBuf, dwSize );
file.Close();
::GlobalUnlock( hMem );

IStream 
*  pStream  =  NULL;
IPicture 
*  pPicture  =  NULL;

//  由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr  =  ::CreateStreamOnHGlobal( hMem, TRUE,  & pStream );
ASSERT ( SUCCEEDED(hr) );

hr 
=  ::OleLoadPicture( pStream, dwSize, TRUE, IID_IPicture, ( LPVOID  *  ) & pPicture );
ASSERT(hr
== S_OK);

long  nWidth,nHeight;   //  宽高,MM_HIMETRIC 模式,单位是0.01毫米
pPicture -> get_Width(  & nWidth );     //  宽
pPicture -> get_Height(  & nHeight );   //  高

CRect rect;
GetClientRect(
& rect);

CSize sz( nWidth, nHeight );
pDC
-> HIMETRICtoDP(  & sz );   //  转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
long  x, y, cx, cy;

//  原始大小
/*

cx = sz.cx;
cy = sz.cy;
x = rect.Width() / 2 - cx / 2;
y = rect.Height() / 2 - cy / 2;
*/

//  自动适应窗口
double  fRatePic, fRateWnd;
fRatePic 
=  ( double )sz.cx  /  ( double )sz.cy;
fRateWnd 
=  ( double )rect.Width()  /  ( double )rect.Height();
if  (fRatePic  >  fRateWnd)
{
    cx 
=  rect.Width();
    cy 
=  ( long )(rect.Width()  /  fRatePic);
}
else
{
    cx 
=  ( long )(rect.Height()  *  fRatePic);
    cy 
=  rect.Height();
}
if  (cx  ==  rect.Width())
{
    x 
=   0 ;
    y 
=  rect.Height()  /   2   -  cy  /   2 ;
}
if  (cy  ==  rect.Height())
{
    x 
=  rect.Width()  /   2   -  cx  /   2 ;
    y 
=   0 ;
}

pPicture
-> Render(pDC -> m_hDC, x, y, cx, cy,
    
0 , nHeight, nWidth,  - nHeight, NULL);

if  ( pPicture ) pPicture -> Release(); //  释放 IPicture 指针
if  ( pStream ) pStream -> Release();   //  释放 IStream 指针,同时释放了 hMem

::CoUninitialize();


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值