Известная проблема или я что-то упускаю? IPicture дает неправильный размер при 125% (но не нормально или 150%) - PullRequest
0 голосов
/ 03 августа 2011

Мне кажется, я знаю, что происходит. См. Второе редактирование в конце этого сообщения.

В приложении Win32 на C / C ++ я работаю с (не оригинальным автором) кодом, который использует класс IPicture для рисования растрового изображения в диалоговом окне. Он работает при нормальном размере, и когда пользователь масштабирует «увеличение текста» до 150%, графика также автоматически масштабируется, но не при 125%.

В качестве напоминания, Windows позволяет перейти к Ease of Access (в Windows 7) и «Изменить размер текста и значков» на «Обычный» (100%), «Средний» (125%) или «Большой» (150%). .

IPicture загружает графику (размер пикселя 775) со значением HIMETRIC (аналогично TWIP), равным 20505, при 100%, при 150%, и в этих масштабах оно отображается правильно на экране (вторая увеличивается , но пропорционально правильно), но при 125% он имеет нормальный размер (в большем диалоговом окне) при ХИМЕТРИЧЕСКОЙ ширине 16404 (меньше, чем у двух других, которые масштабируются правильно).

Так что кажется, что по какой-то причине ширина и высота дают значения вне шкалы для 125%, хотя они правильно работают при 100% (меньше) и 150% (выше). Есть идеи?

При редактировании:

LONG gwWidth, gwHeight; // HIMETRIC units
m_spIPicture->get_Width(&gwWidth);
m_spIPicture->get_Height(&gwHeight);
{
     char msg[80];
     sprintf(&msg[0], "Preparing width %d height %d HIMETRICs\n", gwWidth, gwHeight);
     OutputDebugString(msg);
}

, где

IPicture* m_spIPicture;

Вся графика действует так, я спрашивал не только о ней. Каждый сообщает правильный размер в 125% и идентичные значения для 100% и 150%.

Я испытываю желание просто сделать это вручную (по крайней мере, сам получи DPI и посчитай значения).

При редактировании: путаница заключается в том, что я получаю одинаковые значения для 100% и 150%, но 125% масштабируется по-разному. При любом изменении системы нумерации я бы ожидал (в общем случае) один из трех результатов - без изменений, прогрессивно увеличиваться, постепенно изменяться.

Читая больше о виртуализации DPI, эта страница на http://msdn.microsoft.com/en-us/library/dd464659.aspx объясняет загадку с комментарием «Когда DPI установлено на 144, операционная система автоматически включает виртуализацию DPI». (Обратите внимание, что 144 - это 150% режим).

Я все еще изучаю это приложение (я унаследовал его от других источников), но, по-видимому, оно не поддерживает DPI, что означает, что оно будет виртуализироваться, что хорошо в этом случае (почти), но виртуализация не срабатывает, пока 150%, что означает, что мы вроде как наигрались на 125%. Итак, мне нужно либо сделать его виртуальным на 125%, либо знать на 125% и 150%, но, по крайней мере, теперь я знаю, почему он действует по-другому.

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Я не нахожусь в офисе в эту самую секунду, поэтому я не могу легко выкопать код, но да, я ожидаю третьего числа.Я либо ожидал, что все числа будут идентичными, либо все числа будут разными, и одна из возможных причин, почему они таковы, что они не кажутся правдоподобными (я не буду утомлять вас этим объяснением).Во всяком случае, это не работает.Я запускал его несколько раз, проверяя различные значения, желая, чтобы я ошибся, но я продолжаю получать эти цифры.

Я еще раз посмотрю и опубликую код, если не вижу, чтобы наМиллиард + 1 раз на это смотреть.

Спасибо

  • Tab
0 голосов
/ 03 августа 2011

Преобразование вашего значения HIMETRIC в 20505 дает 8,073 дюйма;деление на количество пикселей (775) дает 96 DPI.Пока это стандартная конфигурация Windows.

Преобразование значения HIMETRIC в 16404 дает 6,458 дюйма;деление на количество пикселей дает 120 DPI.Это ровно 96 * 125%, поэтому тоже кажется, что все в порядке.

Значение 150% должно давать 144 DPI;тогда значение HIMETRIC должно быть 13670. Вы уверены, что get_Width возвращает то же значение, что и для обычного режима?

Просмотр некоторого примера кода, где вы вызываете Render, очень поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...