2

根据 MSDN:

如果 nWidthSrc 和 nWidthDest 参数的符号或者如果 nHeightSrc 和 nHeightDest 参数不同,则 StretchBlt 会创建位图的镜像。

所以我尝试创建颠倒的图像。我有一个看起来像这样的课程:

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 兼容性有关,我一直无法理解其背后的逻辑。

那么,我应该怎么做才能让我的位图翻转呢?

4

1 回答 1

7

要翻转图片,您不会否定源的高度 - 您会否定目的地的高度。为此,您必须将目标矩形的底部指定为原点,因此您的调用看起来像这样:

StretchBlt(pdc, 0, h, w, -h, dc, 0, 0, w, h, SRCCOPY);
于 2013-05-30T16:05:51.530 回答