Формы VB6 не подходят для небольших экранов, а не для изображения [duplicate]

Часто этот вопрос связан как дубликат вопросов, связанных с кодом типа

printf("%d %d\n", i, i++);

или

printf("%d %d\n", ++i, i++);

или схожими вариантами.

Пока это также неопределенное поведение , как уже было сказано, существуют тонкие различия, когда printf() участвует в сравнении с выражением, таким как:

   x = i++ + i++;

В следующем statement:

printf("%d %d\n", ++i, i++);

порядок оценки аргументов в printf() является неуказанным . Это означает, что выражения i++ и ++i могут быть оценены в любом порядке. Стандарт C11 содержит некоторые соответствующие описания:

Приложение J, неуказанное поведение

Порядок, в котором обозначение функции, аргументы и подвыражения в аргументах вычисляются в вызове функции (6.5.2.2).

blockquote>

3.4.4, неуказанное поведение

Использование неопределенного значения или другого поведение, когда этот международный стандарт предоставляет две или более возможности и не налагает никаких дополнительных требований, которые выбираются в любом случае.

ПРИМЕР Пример неуказанного поведения - это порядок, в котором оцениваются аргументы функции.

blockquote>

Неисправное поведение НЕ является проблемой. Рассмотрим этот пример:

printf("%d %d\n", ++x, y++);

Это также имеет неуказанное поведение , потому что порядок оценки ++x и y++ не указан. Но это совершенно законное и достоверное утверждение. В этом утверждении есть неопределенное поведение no undefined. Поскольку модификации (++x и y++) выполняются с различными объектами.

Что делает следующий оператор

printf("%d %d\n", ++i, i++);

как неопределенное поведение заключается в том, что эти два выражения изменяют тот же объект i без промежуточной точки последовательности .


] Еще одна деталь заключается в том, что запятая , участвующая в вызове printf (), является разделителем , а не оператором запятой .

Это важное различие, потому что -коммутатор вводит точку последовательности между оценкой их операндов, что делает следующий законным:

int i = 5;
int j;

j = (++i, i++);  // No undefined behaviour here because the comma operator 
                 // introduces a sequence point between '++i' and 'i++'

printf("i=%d j=%d\n",i, j); // prints: i=7 j=6

Оператор запятой оценивает свои операнды слева направо и дает только значение последнего операнда. Таким образом, в j = (++i, i++); приращения ++i i до 6 и i++ дают старое значение i (6), которое назначено на j. Затем i становится 7 из-за пост-приращения.

Итак, если запятая в вызове функции должна была быть оператором запятой, то

printf("%d %d\n", ++i, i++);

не будет проблемой. Но он вызывает неопределенное поведение , потому что запятая здесь является разделителем .


Для тех, кто новичок в неопределенное поведение выиграет от чтения Что должен знать каждый программист C о неопределенном поведении , чтобы понять концепцию и многие другие варианты неопределенного поведения в C.

Это сообщение: Неопределенное, неопределенное и определенное по реализации поведение также актуально.

0
задан Rowland Shaw 11 October 2013 в 17:19
поделиться

1 ответ

Без дополнительной информации трудно быть уверенным, но вот догадка:

Начиная с Windows 7, если система замечает, что у вас есть монитор с чрезмерным разрешением, он автоматически выбирает настройку с высоким разрешением DPI.

Если ваша программа не поддерживает DPI, применяется одна из нескольких форм appcompat (на основе версии Windows, некоторых системных параметров и характеристик приложения). В зависимости от того, какие исправления предпринимаются Windows, растровая графика может быть масштабирована и пикселирована или не масштабирована и отображается как «меньше, чем ожидалось».

Просто чтобы добавить топливо в огонь, люди часто пытаются сделать интерфейс с использованием ScaleMode = vbPixels и / или ручных преобразований и полагаться на фиксированное соотношение между этими виртуальными пикселями и фактическими показателями экрана. Жесткое кодирование 15 Twips / Pixel (1440/96) очень распространено, потому что пиксельные экраны с 96 пикселями DPI VGA (и VGA-производными) использовались в течение длительного времени.

Эта ошибка может привести к такому программа для управления размерами неправильно, даже если другие получают изменения размерами при восстановлении DPI.

Вы можете попробовать прочитать High DPI для информации по этому вопросу.

In в случае чего-то вроде фонового изображения формы вам нужно либо несколько растровых изображений разных размеров, из которых вы выберете во время выполнения, либо вам нужно будет масштабировать изображение самостоятельно.

5
ответ дан Bob77 27 August 2018 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: