博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于IPicture::Render函数
阅读量:5040 次
发布时间:2019-06-12

本文共 2883 字,大约阅读时间需要 9 分钟。

1、IPicture::Render简介

HRESULT Render( HDC , //Handle of device context on which to render the image long , //Horizontal position of image in hdc long , //Vertical position of image in hdc long , //Horizontal dimension of destination rectangle long , //Vertical dimension of destination rectangle OLE_XPOS_HIMETRIC ,            //Horizontal offset in source picture OLE_YPOS_HIMETRIC ,            //Vertical offset in source picture OLE_XSIZE_HIMETRIC ,            //Amount to copy horizontally in source picture OLE_YSIZE_HIMETRIC ,            //Amount to copy vertically in source picture LPCRECT            //Pointer to position

x,y,cx,cy分别是指在屏幕上显示的左上角右下角

xsrc,ysrc,cxsrc,cysrc分别是指图片的大小,所以屏幕上长宽的比例和图片长宽的比例是一样的。

有一点令人不解 0,hmHeight,hmWidth,-hmHeight对应于xsrc,ysrc,cxsrc,cysrc,并不是以0,0开头。 一般赋值为NULL。

2、IPicture::Render其它说明

网上观点一:

在做一个图片浏览控件,用Render显示JPG图片,并能拖动图片(调整左上坐标),当图片是原图大小时,拖动的时候速度很快,但当缩小或放大图片后再拖动,速度就非常慢了              m_spIPicture->Render(*pDC, lOffsetX, lOffsetY, lWidth, lHeight, 0 , hmHeight, hmWidth, -hmHeight, 0);

也就是当lWidth和lHeight不等于原图大小时,调整lOffsetX或lOffsetY,Render执行比较慢。              不知道我有没有把问题说清楚。

网上观点二:

嗯,GDI+速度还可以,但是拖动之前保存一个缩略图,拖动中不显示原始图片而显示一个带缩略图的图标(就像在资源管理器中拖动文件那样)比较好一点。

 

3、

    IPicture接口管理一个图片对象和它的属性。图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持。图像对象的主要接口是IPicture和IPictureDisp。IPictureDisp从IDispatch继承,提供了通过自动化访问图片属性的能力。图片对象可通过OleCreatePictureIndirect创建。关于IPicture支持的其他接口和方法可以看MSDN,一般创建图片对象可以用OleLoadPicture函数,它简化了基于流内容创建图片对象。下面的代码中有两个未定义的变量是FilePath和hDC。 //FilePath是从外部传入的图片路径 //打开文件 HANDLE hFile = CreateFile(FilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); _ASSERTE(INVALID_HANDLE_VALUE != hFile); //取文件大小 DWORD dwFileSize = GetFileSize(hFile, NULL); _ASSERTE(-1 != dwFileSize); LPVOID pvData = NULL; //分配内存,准备读入图片文件的数据 //GlobalAlloc从堆分配指定字节的内存区域 HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); _ASSERTE(NULL != hGlobal); //GlobalLock函数锁住一个全局的内存对象同时返回一个指向对象首字节的指针 pvData = GlobalLock(hGlobal); _ASSERTE(NULL != pvData); DWORD dwBytesRead = 0; //读取文件的数据到分配的全局内存 BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL); _ASSERTE(FALSE != bRead); GlobalUnlock(hGlobal); CloseHandle(hFile);

//到此,我们已经把文件的数据读到了内存当中

LPSTREAM pstm = NULL; //从全局内存创建IStream接口指针 HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); _ASSERTE(SUCCEEDED(hr) && pstm); //根据图片文件创建IPicture接口指针 hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture); _ASSERTE(SUCCEEDED(hr) && gpPicture); pstm->Release();

//至此,IPicture接口建立好,下面开始画图片 //hDC是外部传入的画图设备 long hmWidth; long hmHeight; gpPicture->get_Width(&hmWidth); gpPicture->get_Height(&hmHeight); //转换himetric距离为pixels距离,1英寸=25.4毫米 int nWidth = MulDiv(hmWidth, GetDeviceCaps(hDC, LOGPIXELSX), 2540); int nHeight = MulDiv(hmHeight, GetDeviceCaps(hDC, LOGPIXELSY), 2540); RECT rc; GetClientRect(hWnd, &rc); //IPicture::Render显示图片 gpPicture->Render(hDC, 0, 0, nWidth, nHeight, 0, hmHeight, hmWidth, -hmHeight, &rc);

转载于:https://www.cnblogs.com/yangxx-1990/p/5212010.html

你可能感兴趣的文章
算法时间复杂度
查看>>
二叉树的遍历 - 数据结构和算法46
查看>>
类模板 - C++快速入门45
查看>>
[转载]JDK的动态代理深入解析(Proxy,InvocationHandler)
查看>>
centos7 搭建vsftp服务器
查看>>
RijndaelManaged 加密
查看>>
Android 音量调节
查看>>
HTML&CSS基础学习笔记1.28-给网页添加一个css样式
查看>>
windows上面链接使用linux上面的docker daemon
查看>>
Redis事务
查看>>
Web框架和Django基础
查看>>
python中的逻辑操作符
查看>>
CSS兼容性常见问题总结
查看>>
HDU 1548 A strange lift (Dijkstra)
查看>>
每天一个小程序—0005题(批量处理图片大小)
查看>>
C# 启动进程和杀死进程
查看>>
tcp实现交互
查看>>
IIS的各种身份验证详细测试
查看>>
JavaScript特效源码(3、菜单特效)
查看>>
聊聊、Zookeeper Linux 单服务
查看>>