zoukankan      html  css  js  c++  java
  • 关于IPicture::Render函数

    1、IPicture::Render简介

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

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

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

    有一点令人不解 0,hmHeight,hmWidth,-hmHeight对应于xsrc,ysrc,cxsrc,cysrc,并不是以0,0开头。prcWBounds 一般赋值为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接口加载、显示图片

        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);

  • 相关阅读:
    系统维护相关问题
    Python环境维护
    哈希表解决字符串问题
    论文笔记二:《A Tutoral on Spectral Clustering》
    论文笔记之哈希学习比较--《Supervised Hashing with Kernels》《Towards Optimal Binary Code Learning via Ordinal Embedding》《Top Rank Supervised Binary Coding for Visual Search》
    Java中String、StringBuffer、StringBuilder的比较与源 代码分析
    浙大pat1040 Longest Symmetric String(25 分)
    浙大pat1039 Course List for Student(25 分)
    浙大pat---1036 Boys vs Girls (25)
    百炼oj-4151:电影节
  • 原文地址:https://www.cnblogs.com/yangxx-1990/p/5212010.html
Copyright © 2011-2022 走看看