atavin-ta писал(а):Всё-таки, можно через Bitblt?
А в чем проблема-то? Почему нельзя?
Я нашел свой пробный (тестовый) кусок. Но он писан был на MS C++, MFC. Там используется не BitBlt, а StretchBlt. Чтобы как раз отмасштабировать на всю клиентскую область окна. В общем, писалось это досаточно давно, вываливаю кусок кода as is.
Код именно "тестовый", так как каждый раз в прилагаемом обработчике OnPaint картинка грузится из файла. Т.е. цель этого кода - именно убедиться, что картинка рисуется в окне.
Код: Выделить всё
void CBitmapIggle::OnPaint()
{
// CStatic::OnPaint ();
CPaintDC dc (this); // device context for painting
// load IDB_BITMAP1 from file
HBITMAP hBMP = 0;
if (hBMP == 0) {
GFL_ERROR iGFLerror;
GFL_LOAD_PARAMS rLoadParams;
//---------------------
if ((iGFLerror = gflLibraryInit ()) != GFL_NO_ERROR) {
return;
};
gflGetDefaultLoadParams (&rLoadParams);
if ((iGFLerror = gflLoadBitmapIntoDDB (
"D:\\TEMP\\IMG_5324_TRUNCATED.JPG",
&hBMP, // GFL_BITMAP ** bitmap,
&rLoadParams, // GFL_LOAD_PARAMS * params,
NULL // &rInformations // GFL_FILE_INFORMATION * informations,
)) != GFL_NO_ERROR) {
return;
};
gflLibraryExit ();
};
if (hBMP)
{
HDC hImageDC;
hImageDC = CreateCompatibleDC (dc.m_ps.hdc);
// Select the bitmap into the in-memory DC
HBITMAP hOldBitmap = 0;
hOldBitmap = (HBITMAP)SelectObject (hImageDC, hBMP);
// Find a centerpoint for the bitmap in the client area
CRect rect;
GetClientRect (&rect);
int nX = 0;
int nY = 0;
// Copy the bits from the in-memory DC into the on-
// screen DC to actually do the painting. Use the centerpoint
// we computed for the target offset.
BITMAP bm;
GetObject (hBMP, sizeof(bm), &bm); // get size of bitmap
::SetStretchBltMode (dc.m_ps.hdc, HALFTONE);
::StretchBlt (dc.m_ps.hdc, nX, nY, rect.Width (), rect.Height (),
hImageDC,
0, 0,
bm.bmWidth,bm.bmHeight,
SRCCOPY);
DeleteObject ((HBITMAP)SelectObject (hImageDC, hOldBitmap));
DeleteDC (hImageDC); // добавлено 16.10.2009 (похоже, ошибочка была - не было этого вызова)
};
}; // CBitmapIggle::OnPaint()