Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Пропадает нарисованное


Автор: Валерия 23.10.2007, 21:58
Код

Pen P1 = new Pen(Color.White, 1);
Graphics grfx = pictureBox1.CreateGraphics();
grfx.DrawLine(P1, 0, 300, 800, 300);

Когда я сворачиваю окно а потом сново разворачиваю, или сдвигаю за экран - линии (или части) уже нет.
Почему, и как исправить?

Автор: Bogdan1024 24.10.2007, 00:20
Нужно рисовать в обработчике события формы OnPaint.

Автор: HAL707 24.10.2007, 16:35
Лучше кинуть на формочку какой-нибудь ImageBox и рисовать на графиксе имаджа.
Graphics grx = Graphics.FromImage(<твой имажд>);
В этом случае ничего пропадать не будет.

Автор: VisualProgrammerNET 26.10.2007, 12:24
Цитата(HAL707 @  24.10.2007,  16:35 Найти цитируемый пост)
Лучше кинуть на формочку какой-нибудь ImageBox и рисовать на графиксе имаджа.

Не лучше. перегруженный OnPaint - лучшее, что можно придумать. Быстрее, и не замусоривается память всякими, в обшем-то ненужными, контролами. Если перерисовывать нужно какие-то отдельные куски картинки, то всегда можно помудрить с флагами.

Автор: HAL707 26.10.2007, 12:34
Цитата

Не лучше.

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

Автор: VisualProgrammerNET 26.10.2007, 12:53
Цитата(HAL707 @  26.10.2007,  12:34 Найти цитируемый пост)
Если на перерисовку уходит много вычислений

В смысле? 

Допустим, я щас пишу курсовую по банальному Волновому алгоритму нахождения пути. У меня поле из 2000 клеточек, где пользователь сам строит лабиринт, устанавливает начало пути и куда надо прийти. Вычисления все производятся до перерисовки, а не во время. То есть мы устанавливаем для каждой клеточки, как она должна выглядеть, а потом просто вызываем invalidate() и на форме всё быстренько перерисовывается, где-то за четверть секунды.

Автор: HAL707 26.10.2007, 13:14
В прямом.
Просто некоторые делают так:
void pverride OnPaint(...)
{
Graphcs grx = e.Graphics;
drx.DrawLine(....);
//еще куча оперция рисования (иногда очень сложных)
}

Получается - при каждом вызове события перерисовки (при сворачивании - разворачивании формы) выполняется кучи одних и тех же опрераций. Спрашивается - зачем?
Можно один раз взять графикс имджа ПикчеБокса и ОДИН РАЗ нарисовать на нем.

Автор: VisualProgrammerNET 26.10.2007, 13:47
Ммм... вот именно, что если надо ОДИН РАЗ нарисовать что-то, что меняться не будет, тогда да. В большинстве случаев нужно постоянно что-то менять, перерисовывать. А так да, вот у меня КАЖДЫЙ РАЗ при вызове invalidate() рисуется 2000 квадратиков, плюс тысяча надписей и прочего, за минимальный промежуток времени, как видишь. 

Плюс, если тебе например надо сделать какую-нибудь рамку, т.е. 4 линии по периметру формы - тут боксами рисовать вообще глупо.

Автор: Валерия 9.12.2007, 03:07
Не получается.
Если я делаю картинку на фон какую-то, то когда вывожу за пределы экрана и возвращаю обратно - картинка остается, а часть нарисованного стирается.
Если делаю OnPaint то вообще работает через раз, иногда просто затирает вообще всё.

Автор: Experimenter 9.12.2007, 10:19
Валерия, код прикладывай к сообщениям, тогда вероятность того, что твою ошибку найдут, резко возрастет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)