2013-06-15 6 views
0

У меня есть серия панелей и событие щелчка на панели. Первоначально у меня были ярлыки на панели, но это делало вещи слишком забитыми и усложняло мое событие click. В любом случае, я могу просто написать текст в центре панели, потому что, помещая метку посередине, она мешает щелчку. Все, что мне нужно - это квадрат/прямоугольник, похожий на объект, который я могу: a) док-станция b) изменить цвет c) поместить динамический текст посередине. Может быть, я пропускаю контроль, предпочтительный для панели?Какой самый простой способ написать число в середине панели?

+0

Вы можете подписаться на событие 'Paint' панели и нарисовать его непосредственно. –

+0

Сейчас я пытаюсь сделать код максимально лаконичным. У меня есть 100 панелей, и я назначил их всех на одно и то же событие, поэтому через отправителя я могу динамически заставить их вести себя одинаково. Не могли бы вы опубликовать ответ, демонстрирующий наиболее сжатый способ рисования текста в центре панели, который я могу повторить в цикле for на 100 панелях, например. Тогда, конечно, я планирую изменить этот текст на одно событие щелчка. – CodeCamper

ответ

3

Добавить событие рисования на Panel(s) и нарисовать номер как строку, используя DrawString метод Graphics класс. Проверьте этот код в качестве примера:

//Add the Paint event, you can set the same handler for each panel you are using 
panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint); 

//create the font with size you want to use, measure the string with that font 
//and the Graphics class, calculate the origin point and draw your number: 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
     Panel p = (Panel)sender; 
     Font font = new System.Drawing.Font(new FontFamily("Times New Roman"),30); 
     string number = "10"; 
     SizeF textSize = e.Graphics.MeasureString(number, font); 
     PointF origin = new PointF(p.Width/2 - textSize.Width/2, p.Height/2 - textSize.Height/2); 
     e.Graphics.DrawString("10", font, Brushes.Black, origin); 
} 

Поскольку этот код выполняется очень часто, вы могли бы хотеть объявить и создать экземпляр в Font за пределами Paint обработчика:

Font font = new System.Drawing.Font(new FontFamily("Times New Roman"),30); 
private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
     Panel p = (Panel)sender; 
     string number = "10"; 
     SizeF textSize = e.Graphics.MeasureString(number, font); 
     PointF origin = new PointF(p.Width/2 - textSize.Width/2, p.Height/2 - textSize.Height/2); 
     e.Graphics.DrawString("10", font, Brushes.Black, origin); 
} 

EDIT:

Добавлено после комментария OP: Поиск наибольшего размера шрифта, для которого строка все еще помещается в панель

string number = "10"; 
float emSize = 10f; 
SizeF textSize = SizeF.Empty; 
Font font = null; 
do 
{ 
    emSize++; 
    font = new System.Drawing.Font(new FontFamily("Times New Roman"), emSize); 
    textSize = e.Graphics.MeasureString(number, font); 
} 
while (panel1.Width > textSize.Width && panel1.Height > textSize.Height); 
font = new System.Drawing.Font(new FontFamily("Times New Roman"), --emSize); 

Отказ от ответственности: Я не принимал во внимание float до int литье, но это то, о чем следует позаботиться.

+0

Очень приятный материал! Спасибо! Никогда не использовал метод DrawString раньше! Также я замечаю, что у вас есть метод MeasureString, который делает меня чрезвычайно любопытным. Не могли бы вы продемонстрировать мне способ использования MeasureString для динамического соответствия размера шрифта в панели (например, он бы выбрал размер шрифта, который позволил бы заполнить как можно больше, не переполняя текст?) Я смущен, насколько точно играет, и если это будет возможно. – CodeCamper

+0

В принципе, вам нужно создать экземпляр шрифтов разных размеров и измерить желаемое значение. Затем проверьте размер строки и размер панели и сделайте это, пока она все еще подходит для панели Увеличите размер шрифта и первый раз, когда я переполняю, используйте последний, который установлен. –

+0

Это действительно здорово. После игры с этим я смогу интегрировать свой оригинальный дизайн в это. намного проще, я не думаю, что когда-либо буду использовать ярлык в любой из моих программ ... – CodeCamper

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