Как вызвать событие paint c
А что, если нужно нарисовать что-то на форме вне обработчика события Paint — например, по нажатию кнопки? Как получить объект Graphics, который станет поверхностью рисования нужного нам элемента управления или формы? Существует несколько способов сделать это, но мы рассмотрим только два, наиболее удобных с моей точки зрения.
Создайте новое приложение, положите на его поверхность кнопку и напишите следующий код, выполняемый по ее нажатию:
Чтобы получить объект для рисования, в этом примере используется статичный метод FromHwnd() класса Graphics. Методу нужно передать свойство Handle окна, объект рисования которого вы хотите получить, а сам объект мы получаем в качестве результата работы метода.
Теперь мы можем рисовать на поверхности объекта рисования. Для примера я рисую прямоугольник с помощью метода DrawRectangle(). Этому методу передаются два параметра: перо (класс Pen), с помощью которого происходит рисование, и размеры в виде структуры Rectangle. С помощью класса Pen мы можем задать цвет и ширину пера (толщину получаемой линии). Мы пока с перьями не разбирались, поэтому я воспользовался системным пером под именем ActiveBorder из перечисления SystemPens. Перечисление SystemPens содержит системные перья, и перо ActiveBorder служит для рисования контуров окон.
В чем недостаток рисования по событию, отличному от события Paint? Непостоянность результата. Запустите пример и попробуйте нажать на кнопку. Прямоугольник появился, и пока вроде бы все прекрасно. А что, если переместить окно? Нарисованный прямоугольник снова на месте. А что, если свернуть окно и развернуть его заново? Наш рисунок исчезнет! До этого система запоминала наше окно и при перемещении окна сама восстанавливала его содержимое. Вы даже можете попытаться перекрыть свое окно другим окном, а потом убрать его, и, вполне вероятно, что прямоугольник снова окажется на своем месте. ОС пытается оптимизировать работу графики и сама восстанавливает рисунок формы. Но это не всегда так.
В этом случае по нажатию кнопки значение переменной bDrawRectangle изменяется на true и вызывается метод Invalidate(), который заставляет форму перерисоваться. По событию Paint прямоугольник рисуется, только если переменная bDrawRectangle установлена в true. Теперь этот прямоугольник никуда не денется, даже если окно восстановят из свернутого состояния.
Да, я же обещал вам показать два способа получения объекта для рисования. Второй способ заключается в использовании метода CreateGraphics() формы:
Этот метод возвращает объект рисования для формы или элемента управления, для которого он был вызван. В данном случае он вызывается для this, а значит, вернет объект рисования текущей формы.
Приветствую друзья. Есть программка для построения графиков. Вариант выбора: интерполяция либо элементарный график.
В чем проблема. Если минимизировать или убрать программу из границ монитора, ну так чтоб графика не было видно, то он исчезает. Вопрос, как восстанавливать график при появлении формы.
Есть событие Paint у формы.
Но правильно использовать его у меня что-то не получается..
Рисую как-то так:
Событие: Отрисовка на форме в Paint
Всем привет, помогите решить вопрос. Мне нужно вызвать событие Paint чтобы происходила отрисовка.
Событие Paint
Здравствуйте! Не могу это объяснить: почему при изменении размеров окна перетаскиванием за правый.
Компонент PictureBox и событие Paint
Всем привет :) Решил программно добавлять BictureBox и следовательно так же добавлять для него.
Событие paint перересовывает готовые фигуры
Народ выручите, я рисую фигуру, она рисуется, но как только я хочу нарисовать другую, старая.
Даценд, да, этот вариант я пробовал но проблема в том, что так она статическая..
Если других вариантов нет придется сделать так, смотреть если график нарисован, то только тогда рисовать его на этом событии. Буду пробовать, спасибо
Diamante,
Ну так и Graphics и Pen реализуют интерфейс IDisposable.
И чтобы гарантировано освободить ресурсы, для объектов этих классов нужен метод Dispose.
Вот здесь хорошо написано.
Даценд, я не про ,IDisposable и Dispose(это и так понятно),я про рисование; создали холст, нарисовали, спустили кисть и ХОЛСТ в унитаз.
Harold, Ну у Вас наверное точек графика МНОГО, вот и тормозит) и OnPaint постоянно вызывается.
Можно сделать вызов OnPaint через определенный интервал и добится компромиса между тормозами и отрисовкой.
Ну это только предположение. Кто его знает как Вы там все реализовали. Код же не показываете.
Добавлено через 6 минут
К стати если у Вас график имеет МНОГО точек и не изменяется (один раз посчитали и точки не меняются), можно сохранить отрисованную картинку и ее уже отрисовывать на форме (но это как запасной вариант и для частного случая).
Здравствуйте!
Подскажите, пожалуйста, как выглядит вызов события Paint.
Нужно это для следующей задачи: считывание данных по таймеру и их последующее отображение, например, в виде графика. Для этого, я так понимаю мне должно понадобиться данное событие. Соответственно, как я понимаю, мне нужно в форме создать таймер и по событию Tick считать данные и вызвать событие Paint. Или я не прав? Вот тут и встает вопрос: как это сделать вручную?
Заранее спасибо.
Как принудительно вызвать событие Paint для формы?
Вопрос один - КАК? Пожалуйста не вбивайте в гугле так как я нихчего не нашёл кроме ведра говна в.
Как сделать перерисовку изображения в обработке условий Paint?
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) < .
Событие Paint
Доброго времени суток! Задача: прорисовывать на объекте TPanel картинку. Код: HDC .
событие Paint
Помогите пожалуйста через событие Paint нарисовать вот такой рисунок. Желательно было если каждая.
Variag, событие Paint происходит при перерисовке элемента управления. Если вам нужно нарисовать график создайте панель, например. Затем создайте объект Timer, на событие Tick пропишите примерно следующее:
Где вместо "А здесь код для рисования графика" пишите методы для рисования.
Например нарисовать линию можно так:
Извините, видимо не совсем внятно выразился. Мне вобщем-то и нужно перерисовывать, насколько я понимаю.
Мне нужно создать что-то типа осциллографа на экране. Считываем массив данных -> рисуем весь массив в виде графика. Считали новый массив -> перерисовали и т.д.
Вроде нашел в msdn функции Invalidate, Update и Refresh. Только не пойму какая из них мне нужна и можно ли применить их для перисовки только одного объекта Picture Box, в котором у меня происходит все рисование, оставив в покое остальную форму.
Paint не рисует. Paint - это событие, происходящее при перерисовании! Чтобы при каждом тике рисовался новый график, нужно:
1). Создать графику
Репутация: нет
Всего: нет
Добавлено через 2 минуты и 3 секунды
в частности мне нужно чтобы после движения мышки оно вызывалось..
I think, there4 I am
Репутация: 4
Всего: 28
Код |
private void Form1_MouseMove(object sender, MouseEventArgs e) Graphics g = CreateGraphics(); Rectangle rec=new Rectangle(); PaintEventArgs es = new PaintEventArgs(g, rec); Form1_Paint(sender, es); > |
Репутация: нет
Всего: нет
Репутация: 2
Всего: 3
дело в том что Form1_Paint - это пользовательская ф-ия, кроме нее к событию может быть привязано еще очень много системных ф-ий. если надо вызвать всех их (т.е. сгенерировать событие) надо юзать метод Invalidate того объекта, который надо перерисовать.
Репутация: нет
Всего: 12
There are two ways to repaint a form and its contents:
You can use one of the overloads of the Invalidate method with the Update method.
You can call the Refresh method, which forces the control to redraw itself and all its children. This is equivalent to setting the Invalidate method to true and using it with Update.
The Invalidate method governs what gets painted or repainted. The Update method governs when the painting or repainting occurs. If you use the Invalidate and Update methods together rather than calling Refresh, what gets repainted depends on which overload of Invalidate you use. The Update method just forces the control to be painted immediately, but the Invalidate method governs what gets painted when you call the Update method.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
[ Время генерации скрипта: 0.1017 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Давайте напишем наше первое "Hello World" приложение для работы с графикой.
Для того чтобы было удобнее работать со строкой текста, я оформил ее в виде константы, потому что обращаться к тексту придется дважды. Если я захочу изменить надпись, то достаточно будет изменить только константу.
Следующим этапом я хочу узнать, какой размер будет занимать надпись на форме. Это мне нужно, чтобы рассчитать положение текста так, чтобы он оказался ровно посередине экрана. Для определения размера текста используется метод MeasureString(). Метод получает два параметра: строку текста и шрифт. В зависимости от типа и размера шрифта, размер текста может очень сильно различаться. В нашем примере в качестве шрифта передается Font, который является свойством текущей формы.
Теперь можно рассчитать позицию текста так, чтобы он расположился точно в центре окна. Расчеты сохраняются в переменной p, которая имеет тип PointF. Этот тип определяет точку левого верхнего угла текста с помощью двух полей: X и Y, которые представляют собой числа с плавающей точкой (вот они нам и встретились).
Последним этапом я отображаю текст. Существует несколько перегруженных вариантов метода рисования текста DrawString(). Я выбрал вариант, который принимает следующие параметры:
- текст, который нужно отобразить;
- шрифт;
- кисть;
- позицию в виде структуры PointF.
Самое интересное тут — третий параметр. В коде я передаю в нем значение SystemBrushes.WindowText, где SystemBrushes является перечислением, которое состоит из системных цветов. В нашем примере выбран цвет WindowText, которым система по умолчанию рисует текст в окнах.
Метод Invalidate() заставляет форму вызвать событие Paint. На самом деле перерисовка окна состоит из двух событий: прорисовки фона и прорисовки содержимого. Мы обрабатываем событие только прорисовки содержимого. Событие прорисовки фона PaintBackground по умолчанию окрашивает фон цветом, который выбран в свойстве BackColor формы.
Читайте также: