IPicture::Render 很難使用,它的一堆座標參數更是讓人迷惑不解,即使經常使用也難免出錯。 MSDN在解釋這個方法的使用時並沒有解釋清楚。MSDN的解釋如下。
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 of destination for a metafile hdc
);
這個方法的十個參數當中,第一個和最後一個參數沒得說,最關鍵的是從第二個到第九個,分成兩組,分別爲:
第一組:x, y, cx,cy
這一組參數描述的是在指定設備上的一個矩形區域(cx - width, cy - height),將在這個區域裏輸出圖像。
第二組:xSrc, ySrc, cxSrc, cySrc
這一組參數描述的是從圖像數據中裁剪的一個矩形區域,將把這個矩形區域中的內容輸出到上一組參數定義的設備區域上。
現在假設有圖像I(x,y)要在設備D(x,y)上輸出,輸出時只有平移和縮放,沒有旋轉,則一般情況下有如下的變換:
[IPicture-Render.png]
上面公式的第一個矩陣是從圖像到設備的平移縮放矩陣,縮放比爲rx, ry,平移量爲sx, sy。第二個矩陣是圖像的上下翻轉矩陣,這是一個特殊的座標變換矩陣,它十分關鍵,因爲在一般的Windows位圖中垂直方向上的座標是上下翻轉的,所以需要把y座標再翻轉過來才能正確地顯示在輸出設備上,其中Ih是圖像I(x,y)的高度。
從這個公式得到如下關係式:
Dx = Ix rx+ sx
Dy = Ih ry– Iy ry+ sy
Dw = Iw rx
Dh = – Ih ry
Ix = (Dx– sx) / rx
Iy = (Ih ry– Dy + sy)/ ry
Iw = Dw / rx
Ih = – Dh / ry
使用這組關係式,再根據需要從設備座標計算出圖像座標,或者從圖像座標計算出設備座標,就可以正確地在設備指定位置輸出指定的圖像內容了。