Прежде всего, имейте в виду, что с растеризацией технически не существует такой вещи, как истинная независимость разрешения. При достаточно большом увеличении отдельные тексели начнут становиться видимыми. Единственное решение этого - написать систему векторной графики.
При этом существует несколько шагов для создания надежной независимой от разрешения системы растрового изображения: определение размеров, системы координат и макет.
Для определения размера и позиционирования нам нужно использовать некоторый набор единиц, которые поддерживают соотношение с фактическим разрешением приложения. В этом случае давайте используем дюймы, потому что я американец, и вы можете масштабировать элементы с DPI (точек на дюйм). Например, допустим, ваше приложение работает с разрешением 800x600. По умолчанию Windows DPI 96. Это означает, что приложение имеет разрешение (800/96) x (600/96) дюймов или 8,33x6,25 дюймов.
Так как вам нужно уметь работать, как минимум, с соотношением сторон 4: 3 и 16: 9, то, как вы справляетесь с вашей системой координат экрана, становится немного сложнее. Что я рекомендую сделать, так это поместить (0,0) в центр области отображения (а также окна и элементы управления). Это хорошо работает, потому что если вы поместите (0,0) в угол, то, поскольку этот угол перемещается в зависимости от разрешения и соотношения сторон, он будет переводить все ваши спрайты, тогда как центр экрана всегда будет центром экрана. независимо от устройства. Если продолжить наш пример с 800x600, это приведет к созданию системы координат, которая (слева направо) от -4,165 дюйма до 4,165 дюйма и (сверху вниз) от 3,125 дюйма до -3,125 дюйма.
Таким образом, на данный момент у вас есть независимая от DPI система пользовательского интерфейса с элементами, которые всегда будут находиться в одном и том же месте относительно центра экрана - не совсем независимо от разрешения. К счастью, независимость DPI позволяет вам масштабировать пользовательский интерфейс путем масштабирования DPI на основе некоторой эвристики. Например, мы можем масштабировать DPI, используя вертикальное разрешение в качестве нашей эвристики. Если 800x600 - 96 DPI, мы будем использовать 123 DPI для 1024x768 или 115 DPI для 1280x720.
Наконец, вам нужно построить систему макетов, которая обрабатывает как абсолютное позиционирование, так и относительное позиционирование. Прекрасными примерами этого являются WPF и Интернет. Вы можете указать, что элементы управления / блоки заполняют несколько% родительского элемента, пристыковывая его к краю, наряду со многими другими полезными автоматическими параметрами макета. Все это вместе приведет к тому, что система пользовательского интерфейса будет выглядеть практически одинаково в разных разрешениях и пропорциях.
Подводя итог, я настоятельно рекомендую вам изучить WPF, поскольку он делает почти все это, за исключением того, что он поддерживает начало координат в системе координат верхнего левого угла и не автоматически масштабирует DPI на основе вертикального разрешения.