2013-05-30 51 views
1

根據MSDN:StretchBlt()不創建鏡像

StretchBlt創建一個位圖的鏡像如果nWidthSrc和nWidthDest參數或者如果標誌nHeightSrc和nHeightDest參數不同。

所以我試着創建顛倒的圖像。我有一個類看起來像這樣:

class Picture 
{ 
private: 
HBITMAP bmp; //Bitmap 
HDC pdc; //Device context 
short int w; //Weidth of bitmap 
short int h; //Heighth of bitmap 

public: 
short int x; 
short int y; 
void draw(HDC); 
void upside_down(); 
} 

,我有這樣的方法:

void Picture::upside_down() 
{ 
HDC dc = CreateCompatibleDC(pdc); 
HBITMAP bmap = CreateCompatibleBitmap(pdc, w, h); 
SelectObject(dc, bmap); 
BitBlt(dc, 0, 0, w, h, pdc, 0, 0, SRCCOPY); 
StretchBlt(pdc, 0, 0, w, h, dc, 0, 0, w, -h, SRCCOPY); 
DeleteDC(dc); 
DeleteObject(bmap); 
} 

,但它不工作,沒有任何反應。我不知道這是否與DC兼容性有關,我總是在理解背後的邏輯時遇到問題。

那麼,我該怎麼做才能讓我的位圖翻轉?

+0

彈射邏輯看起來正確。通過「*沒有任何反應*」,你的意思是根本沒有圖像?沒有負高度的圖像也沒有?大概你還有其他的錯誤... – mark

+0

那麼當我試圖改變一些參數,例如,完全黑暗的圖像。我用我的代碼顯示的這些參數似乎是正確的,但不是翻轉的圖像,我始終得到相同的圖像,保持不變。 – PookyFan

回答

3

要翻轉圖片,您不要否定源的高度 - 否定目標的高度。爲了配合這一點,你必須指定你的目標矩形爲原點的底部,所以你的電話會看起來是這樣的:

StretchBlt(pdc, 0, h, w, -h, dc, 0, 0, w, h, SRCCOPY); 
+0

謝謝你,男人,它的工作有限。我欠你。 – PookyFan