13.2. Рисование по событию Paint

Давайте напишем наше первое "Hello World" приложение для работы с графикой.

В этом примере мы выведем великое сообщение "Hello World" в виде графического текста:

   private void Form1_Paint(object sender, PaintEventArgs e)
   {
     const string HELLO_WORLD = "Hello World!!!";
     SizeF messageSize = e.Graphics.MeasureString(HELLO_WORLD, Font);

     PointF p = new PointF((ClientSize.Width - messageSize.Width)/2,
       (ClientSize.Height - messageSize.Height) / 2);

     e.Graphics.DrawString(HELLO_WORLD, Font,
            SystemBrushes.WindowText, p);
   }

Для того чтобы было удобнее работать со строкой текста, я оформил ее в виде константы, потому что обращаться к тексту придется дважды. Если я захочу изменить надпись, то достаточно будет изменить только константу.

Следующим этапом я хочу узнать, какой размер будет занимать надпись на форме. Это мне нужно, чтобы рассчитать положение текста так, чтобы он оказался ровно посередине экрана. Для определения размера текста используется метод MeasureString(). Метод получает два параметра: строку текста и шрифт. В зависимости от типа и размера шрифта, размер текста может очень сильно различаться. В нашем примере в качестве шрифта передается Font, который является свойством текущей формы.

Теперь можно рассчитать позицию текста так, чтобы он расположился точно в центре окна. Расчеты сохраняются в переменной p, которая имеет тип PointF. Этот тип определяет точку левого верхнего угла текста с помощью двух полей: X и Y, которые представляют собой числа с плавающей точкой (вот они нам и встретились).

Последним этапом я отображаю текст. Существует несколько перегруженных вариантов метода рисования текста DrawString(). Я выбрал вариант, который принимает следующие параметры:

  • текст, который нужно отобразить;
  • шрифт;
  • кисть;
  • позицию в виде структуры PointF.

Самое интересное тут — третий параметр. В коде я передаю в нем значение SystemBrushes.WindowText, где SystemBrushes является перечислением, которое состоит из системных цветов. В нашем примере выбран цвет WindowText, которым система по умолчанию рисует текст в окнах.

Запустите пример и убедитесь, что он работает корректно. Теперь попробуйте изменить размер окна. Обратите внимание, что текст не изменяет своей позиции, потому что окно при изменении размера не перерисовывается, и новое положение текста не рассчитывается. Зато если свернуть окно и развернуть, то вот в этот момент окно получит сообщение Paint, и текст снова прорисуется в центре окна, каким бы его размер ни был.

Чтобы исправить проблему перерисовки после изменения размеров окна, можно заставить систему сделать перерисовку. Самый простой способ — создать обработчик события Resize для формы и в нем вызывать метод Invalidate():

   private void Form1_Resize(object sender, EventArgs e)
   {
     Invalidate();
   }

Метод Invalidate() заставляет форму вызвать событие Paint. На самом деле перерисовка окна состоит из двух событий: прорисовки фона и прорисовки содержимого. Мы обрабатываем событие только прорисовки содержимого. Событие прорисовки фона PaintBackground по умолчанию окрашивает фон цветом, который выбран в свойстве BackColor формы.

Предыдущая глава

13.1. Введение в Graphics

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне