Сделайте два RECT. Одним из них является окно, которое вы хотите установить в (принят в rcScreen), а другой имеет размеры изображения:
(pseudo-code)
RECT window;
GetClientRect(hwnd,&window)
RECT bitmap_rect;
BITMAP bitmap;
bitmap_rect.left = bitmap_rect.top = 0;
bitmap_rect.right = bitmap.bmWidth;
bitmap_rect.bottom = bitmap.bmHeight;
RECT draw_rect = size_rect(window,bitmap_rect,true,true);
Тогда StretchBlt это:
StretchBlt(toDC, draw_rect.left, draw_rect.top, draw_rect.right, draw_rect.bottom, fromDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
Это функция: (примечание нет случая для bCenter = false и Scale = true). ** bCenter - это флаг для «центральной картинки в окне». Масштаб - это флаг «режим панорамирования и сканирования» вместо «почтовый ящик», который полезен, если вы используете изображение в качестве фона окна, которое вы хотите изменить, но не хотите иметь почтовые ящики. **
RECT size_rect(RECT& rcScreen,
RECT& sizePicture,
bool bCenter,
bool Scale)
{
RECT rect = rcScreen;
double dWidth = rcScreen.right - rcScreen.left;
double dHeight = rcScreen.bottom - rcScreen.top;
double dAspectRatio = dWidth/dHeight;
double dPictureWidth = sizePicture.right - sizePicture.left;
double dPictureHeight = sizePicture.bottom - sizePicture.top;
double dPictureAspectRatio = dPictureWidth/dPictureHeight;
double nNewHeight = dHeight;
double nNewWidth = dWidth;
double nHeightCenteringFactor = 0;
double nWidthCenteringFactor = 0;
double xstart = rcScreen.left;
double ystart = rcScreen.top;
if (dPictureAspectRatio > dAspectRatio)
{
if (bCenter && Scale) {
nNewWidth = dPictureWidth*(1/(dPictureHeight/dHeight));
xstart = rcScreen.left - ((nNewWidth/2) - (dWidth/2));
}
else {
nNewHeight = (int)(dWidth/dPictureWidth*dPictureHeight);
if (bCenter)
ystart = ((dHeight - nNewHeight)/2) + rcScreen.top;
}
}
else if (dPictureAspectRatio < dAspectRatio)
{
if (bCenter && Scale) {
nNewHeight = dPictureHeight*(1/(dPictureWidth/dWidth));
ystart = rcScreen.top - ((nNewHeight/2) - (dHeight/2));
}
else{
nNewWidth = (dHeight/dPictureHeight*dPictureWidth);
if (bCenter)
xstart = ((dWidth - nNewWidth)/2) + rcScreen.left;
}
}
SetRect(&rect, xstart, ystart, nNewWidth, nNewHeight);
return rect;
}
MSDN [имеет хорошее обсуждение этой темы] (https:.//msdn.microsoft.com/en-us/library/windows/desktop/bb530115(v=vs.85).aspx), а также некоторый полезный пример кода. –
Ах да! Флаг «Масштаб» устанавливает его в режим «панорамирования и сканирования», как называет его статья, в отличие от режима «почтового ящика». –