Я работаю над приложением MFC Dialog, скомпилированным статически.
В диалоговом окне есть статический элемент управления для отображения растрового изображения. Когда пользователь выбирает элемент в списке, растровое изображение изменяется на соответствующее изображение. Изображение по умолчанию для элемента 1 и определено в init-instance. Отображается при запуске приложения. Существует 9 вариантов выбора с 9 различными изображениями ресурсов растровых изображений, все растровые изображения имеют одинаковый размер и разрешение. Когда пользователь выбирает другой элемент списка, определяется новое растровое изображение и вызывается функция CreateCompatibleBitmap для DC. Оператор case загружает различные изображения ресурсов с помощью функции LoadBitmapW. Статический элемент управления обновляется с помощью нового растрового изображения.
В моей системе разработки все отлично работает, см. «Correct.png», в котором показано расположение и размер отображаемых битовых карт. Все 9 отображаемых растровых изображений имеют правильный размер.
Correct.png:
Когда я устанавливаю программу на другие машины, исходное растровое изображение отображается в правильномразмер. Когда выбраны списки, отображаемое новое изображение не масштабируется должным образом, чтобы соответствовать исходному размеру изображения, даже если я повторно указываю статическую контрольную позицию и размер, использованные первоначально. Последующие изображения увеличиваются и обрезаются в системах с меньшим разрешением экрана (или, возможно, с меньшим DPI). В системах с более высоким разрешением 4k изображения последующие изображения меньше исходного изображения по умолчанию. Изображения "Lower.png" и "Higher.png" показывают это.
Lower.png:
Higher.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);