Статическое растровое изображение неправильно масштабирует изображения на разных экранах. Проблема с CreateCompatibleBitmap - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над приложением MFC Dialog, скомпилированным статически.

В диалоговом окне есть статический элемент управления для отображения растрового изображения. Когда пользователь выбирает элемент в списке, растровое изображение изменяется на соответствующее изображение. Изображение по умолчанию для элемента 1 и определено в init-instance. Отображается при запуске приложения. Существует 9 вариантов выбора с 9 различными изображениями ресурсов растровых изображений, все растровые изображения имеют одинаковый размер и разрешение. Когда пользователь выбирает другой элемент списка, определяется новое растровое изображение и вызывается функция CreateCompatibleBitmap для DC. Оператор case загружает различные изображения ресурсов с помощью функции LoadBitmapW. Статический элемент управления обновляется с помощью нового растрового изображения.

В моей системе разработки все отлично работает, см. «Correct.png», в котором показано расположение и размер отображаемых битовых карт. Все 9 отображаемых растровых изображений имеют правильный размер.

Correct.png: Correct.PNG

Когда я устанавливаю программу на другие машины, исходное растровое изображение отображается в правильномразмер. Когда выбраны списки, отображаемое новое изображение не масштабируется должным образом, чтобы соответствовать исходному размеру изображения, даже если я повторно указываю статическую контрольную позицию и размер, использованные первоначально. Последующие изображения увеличиваются и обрезаются в системах с меньшим разрешением экрана (или, возможно, с меньшим DPI). В системах с более высоким разрешением 4k изображения последующие изображения меньше исходного изображения по умолчанию. Изображения "Lower.png" и "Higher.png" показывают это.

Lower.png: Lower.png

Higher.png Hgher.png

По-видимому, CreateCompatibleBitmap не создает «совместимое» растровое изображение, поскольку относительный размер или масштаб не совпадают с исходным при запуске приложения.

Я не понимаю причину илизнать, как это исправить.

Этот код находится в функции :: OnLbnSelchange () для замены растровых изображений:

CBitmap bm; //Temp Bitmap
CDC* pDC = GetDC();
bm.CreateCompatibleBitmap(pDC, m_XOver, m_YDown);

switch (m_Selection) {  //Select bitmap to display
case 0:
    bm.LoadBitmapW(IDB_Selection1);
    break;
case 1: 
    bm.LoadBitmapW(IDB_Selection2);
    break;
case 2: 
    bm.LoadBitmapW(IDB_Selection3);
    break;
    // additional 6 cases deleted for brevity
default:
    break;

// Re-specifying static control size and position didn't help problem
//reset size of window to match original in init-instance
CWnd* pDlg = GetDlgItem(IDC_Bitmap);
pDlg->SetWindowPos(NULL, m_Left, m_Top, m_XOver, m_YDown, 0);

HBITMAP prev = m_Bitmap.SetBitmap(bm.operator HBITMAP());   //swap bitmap image
if (NULL != prev)
{
    DeleteObject(prev);     //delete the previous bitmap
}
ReleaseDC(pDC);
UpdateData(FALSE);
...