Сводка и решение:
Допустим, мы создаем растровое изображение памяти, совместимое с форматом экрана (DDB):
CBitmap toolBitmap;
toolBitmap.CreateCompatibleBitmap (pDC, 1000, 20);
Позже мы добавляем что-то в растровое изображение памяти (здесь не имеет значения) Теперь мы хотим сохранить растровое изображение (записать в файл как DIB).
Хотя мы знаем размеры (здесь: 1000x20) , мы не должны их использовать . Поскольку в Window 10 и process активировано масштабирование GDI и используется отображение с высоким разрешением с масштабированием - размеры могли измениться внутри. Таким образом, растровое изображение больше не 1000x20.
Этот сбой:
BITMAP bmHdr;
toolBitmap.GetObject(sizeof(BITMAP), &bmHdr);
Заголовок растрового изображения содержит исходные размеры (1000x20). Использование их для сохранения в файл приводит к неполному изображению . Будет сохранена только верхняя левая часть.
Этот работает - мы можем получить масштабированные размеры:
BITMAPINFO bi = {};
bi.dwSize = sizeof(bi);
int result = GetDIBits(pDC->GetSafeHdc(), (HBITMAP)toolBitmap.GetSafeHandle(), 0, 0, NULL, &bi, DIB_RGB_COLORS);
Теперь мы можем приступить к новым измерениям.
В итоге я использовал функции GDI +, которые также сохраняют полное (масштабированное) растровое изображение:
Gdiplus::Bitmap bm((HBITMAP)toolBitmap.GetSafeHandle(), NULL);
Gdiplus::Status status = bm.Save(pwszFileName, &clsidEncoder, NULL);
Я предполагаю, что есть тонны старого кода MFC и GDI, которые не будут работать правильно с активированным масштабированием GDI в Windows 10.