2012-01-17 3 views
1

Мой первоначальный инстинкт - получить текущую настройку DpiY системы через экземпляр Graphics, но я не могу понять, как ее получить.Как получить размер шрифта в пикселях?

Spellunking через отражатель я вижу, что Microsoft управляет его использованием небезопасного кода:

IntPtr dC = UnsafeNativeMethods.GetDC(NativeMethods.NullHandleRef); 
try 
{ 
    using (Graphics graphics = Graphics.FromHdcInternal(dC)) 
    { 
     float num = graphics.DpiY; 
    } 
} 

Что такое управляемый эквивалент способ построения графика, когда я не имею графики?

Я пробовал:

using (Graphics g = Graphics.FromHdc(IntPtr.Zero)) 
{ 
    return font.GetHeight(g.DpiY); 
} 

Но что бросает Значение не может быть пустым исключение.

+0

Обычно, когда я получаю до конца моего вопроса и выяснить, что мой * реальный вопрос *, я меняю свой титул. Просмотрите мое редактирование, чтобы убедиться, что я не задал ваш вопрос. – Will

+0

@Will Это было своего рода вопросом в моем первоначальном вопросе. Я не * всегда * заинтересован в размере шрифта (например, размер управления, размер изображения, масштаб). я боялся, что кто-то может закрыть вопрос и попытаться использовать «MeasureText», чтобы получить высоту шрифта. Люди склонны смешивать вопрос с применимостью. Я пробовал пропустить рассуждение, имея только мой вопрос. Но люди отказываются отвечать на него, не зная, почему я хочу что-то сделать. у меня были исчерпывающие примеры * почему *, тогда у вас есть Джон Сондерс, потому что он сердитый (http://stackoverflow.com/q/8141795/12597) –

+0

@Will Вот еще один хороший пример проблемы. Парень спросил точный вопрос, который у меня был *** LINQ где или фильтр C# *** (http://stackoverflow.com/questions/5954965/linq-where-or-filter-c-sharp). Ответ обманул вопрос, отвечая вместо примера. Сегодня у меня есть тот же вопрос, но существующие ответы не отвечают на вопрос. я должен построить тот же самый вопрос (слова в названии перегруппированы, чтобы выглядеть достаточно различным *** Фильтр LINQ, где или *** (http://stackoverflow.com/questions/8900131/linq-filter-where-or) –

ответ

1

Вы можете попробовать использовать метод TextRendering который не использует Graphics объект:

int textHeight = TextRenderer.MeasureText("Text", this.Font).Height; 

Или, если это будет необходимо, вы можете сделать свой собственный быстрый Graphic:

float textHeight; 
using (Bitmap b = new Bitmap(1,1)) 
using (Graphics g = Graphics.FromImage(b)) { 
    textHeight = this.Font.GetHeight(g.DpiY); 
} 
+0

Я был обеспокоен тем, что разрешение растрового изображения не гарантируется для создания в текущей заданной настройке dpi (т. Е. Многие системы рисования создают графическое изображение с разрешением 72 dpi). Но, похоже, оно соответствует разрешению системы при создании «Bitmap» , –

Смежные вопросы