2015-11-20 4 views
1

Мы используем Measurestring() для расчета размера, размера текста и длины тонов. Для разного разрешения экрана MeasureString() дает разные размеры.MeasureString() дает разные размеры для разных разрешений экрана

Graphics g; 
Size size = g.MeasureString(GetItemText(this.Items[n]), this.Font).ToSize(); 
width=size.width;  

для разрешения экрана 125%, size.width = 76 и Для разрешения экрана 100% и 150%, size.width = 61.

Как я могу получить такую ​​же ширину в этом коде, пожалуйста, предложите мне некоторые идеи для измерения размера с помощью measurestring().

Жду предложений ........

+2

Для чего вы используете измерение? Если «Графика» - это то, что отображается на экране, то, очевидно, размер изменяется с разрешением экрана. В этом-то и дело. Если вы хотите размер для определенного разрешения, вы можете создать «битмап» с этим разрешением и использовать его объект «Graphics» для измерения строки. – juharr

+0

Вы также можете посмотреть https://msdn.microsoft.com/en-us/library/system.drawing.graphics.pageunit(v=vs.110).aspx, т. Е. Свойство PageUnit – TheLethalCoder

+0

Это совершенно нормально, размер шрифта выражается в * точках *. Один пункт - 1/72 дюйма. Когда вы увеличиваете DPI видеоадаптера до 125%, меняется соотношение между пикселями и пикселями. От 96 пикселей на дюйм до 120 пикселей на дюйм. Поэтому вам нужно больше пикселей, чтобы получить одинаковый размер точки. И таким образом получить результат от MeasureString, который на 125% больше. Когда вы переходите на 150% и не заявляете, что ваше приложение имеет значение dpiAware, тогда запускается функция виртуализации Windows для Windows. Это означает, что dpi составляет 96 и масштабирует ваше окно. Заметно, текст нечеткий. –

ответ

1

Это потому, что 125% ведет себя по-разному по умолчанию. Например, в Windows 7, если вы измените настройку DPI, из-за режима Windows XP style, приложения будут знать текущую настройку DPI. Однако, если вы установили 150%, этот флажок не установлен по умолчанию, поэтому приложения будут работать в режиме неактивного DPI, а это значит, что MeasureString вернет тот же результат, что и в случае 96 DPI, и будет выполнено изменение размера автоматически Windows.

Windows DPI Setting

Обычно вы можете игнорировать результат, так как размеры будут преобразовываться в вашей заявке в любом случае. Если вы все еще хотите, чтобы получить фактическое значение DPI в Windows, см мой ответ здесь: https://stackoverflow.com/a/33412669/5114784

И тогда вы можете высококлассные ваш рисунок, как это (но, как я уже говорил, обычно это не требуется):

// See GetSystemDpi in the referenced post 
float zoomFactor = (float)GetSystemDpi()/96f; 
size.Width = (int)(size.Width * zoomFactor); 
size.Height = (int)(size.Height * zoomFactor); 
Смежные вопросы