По данным MSDN:
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, у меня всегда были проблемы с пониманием логики этого.
Итак, что я должен сделать, чтобы я мог перевернуть мое растровое изображение?
Чтобы перевернуть картинку, вы не отрицаете высоту источника — вы отрицаете высоту пункта назначения. Чтобы пойти с этим, вы должны указать низ вашего конечного прямоугольника в качестве источника, поэтому ваш вызов будет выглядеть примерно так:
StretchBlt(pdc, 0, h, w, -h, dc, 0, 0, w, h, SRCCOPY);
Других решений пока нет …