使用IPicture接口显示图片

news/2024/8/22 10:54:19

 使用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();
 


http://www.niftyadmin.cn/n/1996048.html

相关文章

枚举复合文件的存储结构

枚举复合文件的存储结构 Word和Excel等文件均称为复合文件。这类文件内部有一个“文件系统”,采用“磁盘文件”的组织方式来组织文件内的数据,也称为“文件中的文件系统”。 每个复合文件中有一个“根存储”(类似于文件系统中的“根目录…

tapestry自定义基本IEngineService

tapestry自定义基本IEngineService tapestry的SeviceLink组件能调用9种基本的service(ActionService, AssetService, DirectService, EngineServiceInnerProxy, EngineServiceOuterProxy, ExternalService, HomeService, Pa…

一个失败的案例

最近有一个新的项目团队在开发一个新的功能,并且决定尝试用Scrum,非常有幸被邀请加入,担任ScrumMaster。一开始的时候一切似乎都很顺利,我们召开了一次项目的启动会议,请负责的产品经理明确对结果的期望,并…

static_cast揭密

static_cast揭密 本文讨论static_cast<> 和 reinterpret_cast<>。 介绍大多程序员在学C前都学过C&#xff0c;并且习惯于C风格&#xff08;类型&#xff09;转换。当写C&#xff08;程序&#xff09;时&#xff0c;有时候我 们在使用static_cast<>和reinter…

POI操作Excel一些中文问题的解决方法

1. 设置工作表名 &#xff08;下文中提到的workbook为类org.apache.poi.hssf.usermodel.HSSFWorkbook的一个实例&#xff09; 如果使用workbook.createSheet(sheetname)或者使用workbook.setSheetName(1, "中文")&#xff0c;默认会使用ENCODING_COMPRESSED_U…

02-CSS基础与进阶-day9_2018-09-12-21-27-10

z-index 当对多个元素设置定位时,重叠的定位元素可以通过z-index调整堆叠顺序 其值可以为0 正数 负数 特点 1 z-index默认值为0 取值越大 定位元素在层叠元素上越局上 2 z-index取值一样&#xff0c;后来居上 3 z-index值不能加单位 4 只有定位元素才有该属性&#xff0c;其余如…

讨论static_cast 和 reinterpret_cast

讨论static_cast 和 reinterpret_cast 作者&#xff1a;Sam NG 译者&#xff1a;小刀人 原文链接&#xff1a;What static_cast<> is actually doing 本文讨论static_cast<> 和 reinterpret_cast<>。 介绍大 多程序员在学C前都学过C&#xff0c;并且…

awk调用date命令

创建文件date.awk&#xff1a; $8 107582685 { cmd "date %Y-%m-%d-%H -d \"" $11 "\""while (cmd | getline line) {print line}close(cmd)} 调用命令: awk -f date.awk *.log | sort | uniq -dc | sort -nr sort参数: -n // 以数值来排…