關於IPicture::Render函數

一、IPicture::Render簡介html

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分別是指在屏幕上顯示的左上角右下角spa

xsrc,ysrc,cxsrc,cysrc分別是指圖片的大小,因此屏幕上長寬的比例和圖片長寬的比例是同樣的。指針

有一點使人不解 0,hmHeight,hmWidth,-hmHeight對應於xsrc,ysrc,cxsrc,cysrc,並非以0,0開頭。prcWBounds 通常賦值爲NULL。htm

二、IPicture::Render其它說明對象

網上觀點一:blog

在作一個圖片瀏覽控件,用Render顯示JPG圖片,並能拖動圖片(調整左上座標),當圖片是原圖大小時,拖動的時候速度很快,但當縮小或放大圖片後再拖動,速度就很是慢了              m_spIPicture->Render(*pDC, lOffsetX, lOffsetY, lWidth, lHeight, 0 , hmHeight, hmWidth, -hmHeight, 0);
也就是當lWidth和lHeight不等於原圖大小時,調整lOffsetX或lOffsetY,Render執行比較慢。              不知道我有沒有把問題說清楚。繼承

網上觀點二:接口

嗯,GDI+速度還能夠,可是拖動以前保存一個縮略圖,拖動中不顯示原始圖片而顯示一個帶縮略圖的圖標(就像在資源管理器中拖動文件那樣)比較好一點。圖片

 

三、利用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);

相關文章
相關標籤/搜索