
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.16] |
![]() |
|
Сообщ.
#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
,
|
|
|
B.V.За совет спасибо
Пока в качестве временной меры нашел способ как запускать приложение в масштабе 100% (На рисунке как запускать Paint из windows xp так чтобы его не размазывало) при том что остальное все в масштабе 125%. Получается одно приложение мелкое но четкое, но если это будет мое приложение, значит я могу просто увеличить размеры контролов, сделать например в натройках (маленькие/большие кнопки и шрифты) Прикреплённая картинка
Но поищу еще способы. |
Сообщ.
#4
,
|
|
|
Цитата H g @ Вопрос какие способы, или технологии есть чтобы сделать проект более "адаптивным" ? Если изображения получились слишком мелкими, значит их надо увеличить. Однако, оценки "большой-маленький" весьма субъективны. Поэтому можно попробовать дать возможность юзеру самому определять размеры. --- Предположим, имеется некий диалог (с контролами) некого формата. Предоставим возможность увеличения/уменьшения окна диалога с сохранением формата и всех пропорций обычным образом - "потянув за край окошка мышью". Значит, надо изготовить такие контролы , включая панель на которой они расположены, которые пропорционально меняют размеры, шрифты, иконки, рисунки, и расположение дочерних контролов (у кого имеются). Если всё получится удачно, смастерим из них библиотеку. как-то так. --- Вариант по-проще. Не даём юзеру менять размеры окна. Делаем это сами. Программа при старте узнаёт параметры скрина, и увеличивает свой диалог по вертикали до, например, 75% вертикального размера экрана. По горизонтали - пропорционально. итд итп. --- Скорее всего, самой большой проблемой будет реализация именно на С. На С++ вероятность успеха резко повышается. Кроме того, у реализации С имеются самые широкие возможности по утечке ресурсов. |
Сообщ.
#5
,
|
|
|
Цитата H g @ Но поищу еще способы. На счет размера контролов - ничего не скажу. А вот на счет графики у меня есть мысль, особенное если ты не пользуешь "тяжелые" C++ фрэймворки, а хочешь попрогать на чистых сях. Обрати внимание на Си-либу по работе с векторной графикой Cairo. Она, кстати, умеет работать с SVG форматом. Так что с качественным масштабированием графики (векторной) - у тебя проблем не будет. Один минус в моём совете - я это не пользовал, а так, слышал краем уха. Но чуйка подсказывает, что тут есть интересное и полезное! ![]() |
Сообщ.
#6
,
|
|
|
Цитата ЫукпШ @ Значит, надо изготовить такие контролы , включая панель на которой они расположены, которые пропорционально меняют размеры, шрифты, иконки, рисунки, и расположение дочерних контролов (у кого имеются). Если всё получится удачно, смастерим из них библиотеку. У меня CAD система, на главной форме пользователь рисует кинематическую схему, а потом кликая на элементах появляются диалоговые окна неизменяемых размеров. ... Да, конечно, можно сделать большие и маленькие по размерам диалоговые окна при запуске программы определить (или даже в настройках дать возможность пользователю выбрать) и показывать "большой" или "маленький" диалог. Скорее всего так и сделаю. Цитата Majestio @ Обрати внимание на Си-либу по работе с векторной графикой Cairo Графика у меня можно сказать сделана двумя функциями ![]() ![]() MoveToEx(hdc, x2, y2, NULL); LineTo(hdc, x1, y1); а остальная магия это математика. Графика и так векторная, что-то с ней делать, кроме как работать в главном окне - нет необходимости. Есть еще окно, где 3D вид всей кинематической схемы, но там все сделано на OpenGL и это окно меня очень порадовало, потому что работает идеально, не смотря на все козни создателей новых windows и производителей ноутбуков. OFFTOP Скрытый текст Параллельно у меня 4 проекта, 1 CAD система и 3 игры. В 3-х мерной игрушке сначало думал делать значки/иконки/рисунки и т.д. в Photoshop и потом в качестве текстур вставлять, но видя как отлично отработала OpenGL я сделаю все элементы интерфейса в том числе и рисунки на OpenGL. За советы спасибо |
![]() |
Сообщ.
#7
,
|
|
H g
оффтоп Цитата H g @ OpenGL OpenGL уже устарел и не поддерживается как API. Может, ты имел ввиду Vulkan? Кстати, было бы интересно узнать, что за игры. Если заглянешь в наш форумский чат в ТГ (ссылка в моей подписи) или в раздел проектов на форуме Разработка и тестирование программ |
Сообщ.
#8
,
|
|
|
Цитата B.V. @ Может, ты имел ввиду Vulkan? B.V., респектище за тему! Я тут положу это для будущих размышлений ![]() |
Сообщ.
#9
,
|
|
|
OFFTOP
Скрытый текст Цитата B.V. @ Кстати, было бы интересно узнать, что за игры. Если заглянешь в наш форумский чат в ТГ (ссылка в моей подписи) или в раздел проектов на форуме Разработка и тестирование программ Создал тему в разделе Разработка и тестирование программ, "Пошаговая стратегия" она 3D на OpenGL, еще есть две игры но они не представляют интерес для публики, это : "три в ряд" и "2D платформер". ТГ каналами не пользуюсь. |