Как бороться за четкость контроллов
, Ноутбук, разрешение 1920 x 1080, масштабирование 125%
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.84] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google
Как бороться за четкость контроллов
, Ноутбук, разрешение 1920 x 1080, масштабирование 125%
|
Сообщ.
#1
,
|
|
|
|
В современных ноутбуках делают большое разрешение 1920 x 1080, что заставляет использовать масштабирование 125%, это делает размытые изображения и надписи в программах, которые были написаны ранее под предыдущие версии. Но современные версии программ идут без этих недостатков, все более менее читается и изображения на кнопках нормальные.
У меня проект написан на C, полностью на WinAPI без сторонних библиотек. При масштабе 100% все четко отображается так, как и задумано, на любом комьютере, однако если поставить на ноутбуке масштаб 100% то все настолько мелкое что работать не возможно. Придется вносить изменения в программу для масштаба 125%. Что сделано: Во первых как я это себе представляю нужно программе узнать а какой вообще масштаб, и если не 100% то корректировать пиктограммы, шрифты. Для этого я так понимаю есть DPI. ![]() ![]() #define INITIALX_96DPI 50 #define INITIALY_96DPI 50 #define INITIALWIDTH_96DPI 100 #define INITIALHEIGHT_96DPI 50 // DPI scale the position and size of the button control void UpdateButtonLayoutForDpi(HWND hWnd) { int iDpi = GetDpiForWindow(hWnd); int dpiScaledX = MulDiv(INITIALX_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI); int dpiScaledY = MulDiv(INITIALY_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI); int dpiScaledWidth = MulDiv(INITIALWIDTH_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI); int dpiScaledHeight = MulDiv(INITIALHEIGHT_96DPI, iDpi, USER_DEFAULT_SCREEN_DPI); SetWindowPos(hWnd, hWnd, dpiScaledX, dpiScaledY, dpiScaledWidth, dpiScaledHeight, SWP_NOZORDER | SWP_NOACTIVATE); } ... case WM_CREATE: { // Add a button HWND hWndChild = CreateWindow(L"BUTTON", L"Click Me", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 0, 0, 0, 0, hWnd, (HMENU)NULL, NULL, NULL); if (hWndChild != NULL) { UpdateButtonLayoutForDpi(hWndChild); } } break; case WM_DPICHANGED: { // Find the button and resize it HWND hWndButton = FindWindowEx(hWnd, NULL, NULL, NULL); if (hWndButton != NULL) { UpdateButtonLayoutForDpi(hWndButton); } } break; Вопрос какие способы, или технологии есть чтобы сделать проект более "адаптивным" ? |
|
Сообщ.
#2
,
|
|
|
|
Цитата H g @ Вопрос какие способы, или технологии есть чтобы сделать проект более "адаптивным" ? SetProcessDpiAwareness и обработка WM_DPICHANGED, и да, ручное масштабирование через пересчёт MulDiv |
|
Сообщ.
#3
,
|
|
|
|
Цитата H g @ Вопрос какие способы, или технологии есть чтобы сделать проект более "адаптивным" ? Если изображения получились слишком мелкими, значит их надо увеличить. Однако, оценки "большой-маленький" весьма субъективны. Поэтому можно попробовать дать возможность юзеру самому определять размеры. --- Предположим, имеется некий диалог (с контролами) некого формата. Предоставим возможность увеличения/уменьшения окна диалога с сохранением формата и всех пропорций обычным образом - "потянув за край окошка мышью". Значит, надо изготовить такие контролы , включая панель на которой они расположены, которые пропорционально меняют размеры, шрифты, иконки, рисунки, и расположение дочерних контролов (у кого имеются). Если всё получится удачно, смастерим из них библиотеку. как-то так. --- Вариант по-проще. Не даём юзеру менять размеры окна. Делаем это сами. Программа при старте узнаёт параметры скрина, и увеличивает свой диалог по вертикали до, например, 75% вертикального размера экрана. По горизонтали - пропорционально. итд итп. --- Скорее всего, самой большой проблемой будет реализация именно на С. На С++ вероятность успеха резко повышается. Кроме того, у реализации С имеются самые широкие возможности по утечке ресурсов. |
|
Сообщ.
#4
,
|
|
|
|
На счет размера контролов - ничего не скажу. А вот на счет графики у меня есть мысль, особенное если ты не пользуешь "тяжелые" C++ фрэймворки, а хочешь попрогать на чистых сях. Обрати внимание на Си-либу по работе с векторной графикой Cairo. Она, кстати, умеет работать с SVG форматом. Так что с качественным масштабированием графики (векторной) - у тебя проблем не будет. Один минус в моём совете - я это не пользовал, а так, слышал краем уха. Но чуйка подсказывает, что тут есть интересное и полезное! |
|
Сообщ.
#5
,
|
|
|
|
H g
оффтоп OpenGL уже устарел и не поддерживается как API. Может, ты имел ввиду Vulkan? Кстати, было бы интересно узнать, что за игры. Если заглянешь в наш форумский чат в ТГ (ссылка в моей подписи) или в раздел проектов на форуме Разработка и тестирование программ |
|
Сообщ.
#6
,
|
|
|
|
Цитата B.V. @ Может, ты имел ввиду Vulkan? B.V., респектище за тему! Я тут положу это для будущих размышлений |