У меня есть серия панелей и событие щелчка на панели. Первоначально у меня были ярлыки на панели, но это делало вещи слишком забитыми и усложняло мое событие click. В любом случае, я могу просто написать текст в центре панели, потому что, помещая метку посередине, она мешает щелчку. Все, что мне нужно - это квадрат/прямоугольник, похожий на объект, который я могу: a) док-станция b) изменить цвет c) поместить динамический текст посередине. Может быть, я пропускаю контроль, предпочтительный для панели?Какой самый простой способ написать число в середине панели?
ответ
Добавить событие рисования на 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
литье, но это то, о чем следует позаботиться.
Очень приятный материал! Спасибо! Никогда не использовал метод DrawString раньше! Также я замечаю, что у вас есть метод MeasureString, который делает меня чрезвычайно любопытным. Не могли бы вы продемонстрировать мне способ использования MeasureString для динамического соответствия размера шрифта в панели (например, он бы выбрал размер шрифта, который позволил бы заполнить как можно больше, не переполняя текст?) Я смущен, насколько точно играет, и если это будет возможно. – CodeCamper
В принципе, вам нужно создать экземпляр шрифтов разных размеров и измерить желаемое значение. Затем проверьте размер строки и размер панели и сделайте это, пока она все еще подходит для панели Увеличите размер шрифта и первый раз, когда я переполняю, используйте последний, который установлен. –
Это действительно здорово. После игры с этим я смогу интегрировать свой оригинальный дизайн в это. намного проще, я не думаю, что когда-либо буду использовать ярлык в любой из моих программ ... – CodeCamper
- 1. Какой самый простой способ написать приложение для справочника для iPhone?
- 2. Какой самый простой способ написать экран ожидания с Delphi?
- 3. Какой самый простой способ написать kafka из искрового потока
- 4. Самый простой способ написать программу преобразования единиц
- 5. Самый простой способ написать булевскую анимацию?
- 6. Какой самый идиоматический способ Clojure написать это?
- 7. Какой самый простой способ выполнить несколько файлов
- 8. Какой самый простой способ сделать быстрый сбой?
- 9. Какой самый простой способ сохранить объекты Java?
- 10. Какой самый простой способ установки PHP
- 11. Какой самый простой способ использовать подключенный сканер?
- 12. Какой самый простой способ перенаправить неподдерживаемые браузеры?
- 13. Какой самый простой способ декодирования данных base64?
- 14. Какой самый простой способ скопировать объект ArrayBuffer?
- 15. Какой самый простой способ проверить шлюз?
- 16. Какой самый простой способ получить SAS?
- 17. Android: какой самый простой способ подписать APK?
- 18. Какой самый простой способ добавить изображение в мое приложение GWT
- 19. Какой самый простой/самый чистый способ получить MessageID отправленного письма?
- 20. Какой самый элегантный способ написать цикл for в Python?
- 21. Какой самый простой способ заполнить пробелы в списке чисел?
- 22. Самый простой способ загрузить файл?
- 23. Какой самый простой способ всегда округлить число в SQL Server 2005?
- 24. Какой самый простой способ получить веб-запрос в код C#?
- 25. Какой самый простой способ записи содержимого переменной на страницу?
- 26. Какой самый простой способ получить содержимое веб-страницы через PHP?
- 27. Какой самый быстрый и простой способ создать новый управляемый объект?
- 28. Какой самый простой способ конвертировать BMP в PDF в ASP.net
- 29. Самый простой способ, чтобы написать NSData в файл
- 30. Самый простой способ конвертировать число в годы и месяцы
Вы можете подписаться на событие 'Paint' панели и нарисовать его непосредственно. –
Сейчас я пытаюсь сделать код максимально лаконичным. У меня есть 100 панелей, и я назначил их всех на одно и то же событие, поэтому через отправителя я могу динамически заставить их вести себя одинаково. Не могли бы вы опубликовать ответ, демонстрирующий наиболее сжатый способ рисования текста в центре панели, который я могу повторить в цикле for на 100 панелях, например. Тогда, конечно, я планирую изменить этот текст на одно событие щелчка. – CodeCamper