2014-11-03 3 views
1

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

 //getting screen size and setting window to maximized 
     Rectangle screenEdge = Screen.PrimaryScreen.Bounds; 
     this.Width = screenEdge.Width; 
     this.Height = screenEdge.Height; 
     this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
     this.WindowState = FormWindowState.Maximized; 

     //using 90% of width and 40% (times two) of height 
     int lWidth = (int)(this.Width * 0.9); 
     int lHeight = (int)(this.Height * 0.4); 

     //horiz. spacing: remainder, divided up for left and right 
     int lLeft = (this.Width - lWidth)/2; 
     //vert. spacing: remainder divided for top, bottom and between 
     int lTop = (this.Height - (2 * lHeight))/3 ; 

     //the labels holding the numbers 
     lSoll = new Label(); 
     lIst = new Label(); 

     //setting label lSoll to calc'd dimensions, adding & aligning text 
     lSoll.Left = lLeft; 
     lSoll.Width = lWidth; 
     lSoll.Top = lTop; 
     lSoll.Height = lHeight; 
     Font sollFont = new Font(FontFamily.GenericSansSerif, lSoll.Height); 
     Font sFSized = new Font(sollFont.FontFamily, lSoll.Height); 
     lSoll.Font = sFSized; 
     lSoll.TextAlign = ContentAlignment.MiddleCenter; 
     lSoll.ForeColor = Color.Blue; 
     lSoll.BackColor = Color.White; 
     updateSollText(42); 

     //same as above, just a bit lower 
     lIst.Left = lLeft; 
     lIst.Width = lWidth; 
     lIst.Top = lTop * 2 + lSoll.Height; 
     lIst.Height = lHeight; 
     Font istFont = new Font(FontFamily.GenericSansSerif, lIst.Height); 
     Font iFSized = new Font(istFont.FontFamily, lIst.Height); 
     lIst.Font = iFSized; 
     lIst.TextAlign = ContentAlignment.TopCenter; 
     lIst.ForeColor = Color.Red; 
     lIst.BackColor = Color.White; 
     updateIstText(39); 

Проблема с этим кодом (кроме clumsyness):
Текст на этикетках отображается частично под метками нижние границы, т.е. невидимых, откроется в нижней части.
Я дважды проверил свои вычисления и обнаружил, что кроме ошибки округления 1 pt (вершины) все должно работать.
Я также попытался сделать шрифт меньше высоты этикетки, что помогло немного, но, конечно же, не было исправлено.
На самом деле, хотя textalign должен охватывать это, потому что это то, для чего оно предназначено.
чейнинга также высота-Comp (низкий средний сверху) TextAlign ничего не меняется, в то время как левый/центральный/правый делают различие ожидается

Screen of misaligned numbers

Что может быть причиной этого?

+1

Метка всегда имеет немного отступов между ее краями и шрифтом, чтобы буквы не перекрывались с другими элементами управления. В вашем коде вы устанавливаете размер шрифта на высоту своей метки, ведь это никогда не подойдет. Почему бы не повернуть его и рассчитать высоту шрифта и поместить свойство autoEllipsis на ваш ярлык в true (делая его автоматическим масштабированием для текста). Обратите внимание, что вам все равно придется вручную использовать ширину метки, если вы хотите, чтобы она покрывала всю ширину формы. –

ответ

3

Единица измерения по умолчанию для шрифта - это точки, а не пиксели. Например, с настройкой DPI по умолчанию 96, шрифт 9 точек занимает 9 * 96/72 = 12 пикселей. Поэтому шрифт, который вы просите, слишком велик и не подходит.

Обходной путь прост, вы можете указать единицу измерения, которую вы предпочитаете, с перегрузкой конструктора шрифтов, которая принимает аргумент GraphicsUnit. Фиксация:

Font sollFont = new Font(FontFamily.GenericSansSerif, lSoll.Height, GraphicsUnit.Pixel); 
Font sFSized = new Font(sollFont.FontFamily, lSoll.Height, GraphicsUnit.Pixel); 
+0

Мне было интересно, откуда пришли 72, а затем нашел 72 точки на дюйм (http://stackoverflow.com/questions/139655/convert-pixels-to-points) – Jeb

+0

Работает отлично! Благодарю. – Mark

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