Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пропадает нарисованное, CreateGraphics() 
:(
    Опции темы
Валерия
Дата 23.10.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: 1
Всего: 8



Код

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

Когда я сворачиваю окно а потом сново разворачиваю, или сдвигаю за экран - линии (или части) уже нет.
Почему, и как исправить?
PM MAIL   Вверх
Bogdan1024
Дата 24.10.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 3
Всего: 13



Нужно рисовать в обработчике события формы OnPaint.


--------------------
user posted image
PM MAIL   Вверх
HAL707
Дата 24.10.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.9.2007

Репутация: 1
Всего: 4



Лучше кинуть на формочку какой-нибудь ImageBox и рисовать на графиксе имаджа.
Graphics grx = Graphics.FromImage(<твой имажд>);
В этом случае ничего пропадать не будет.
PM MAIL   Вверх
VisualProgrammerNET
Дата 26.10.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



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

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


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
HAL707
Дата 26.10.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.9.2007

Репутация: 1
Всего: 4



Цитата

Не лучше.

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

PM MAIL   Вверх
VisualProgrammerNET
Дата 26.10.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



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

В смысле? 

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


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
HAL707
Дата 26.10.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.9.2007

Репутация: 1
Всего: 4



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

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


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



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

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

Это сообщение отредактировал(а) VisualProgrammerNET - 26.10.2007, 13:48


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Валерия
Дата 9.12.2007, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: 1
Всего: 8



Не получается.
Если я делаю картинку на фон какую-то, то когда вывожу за пределы экрана и возвращаю обратно - картинка остается, а часть нарисованного стирается.
Если делаю OnPaint то вообще работает через раз, иногда просто затирает вообще всё.
PM MAIL   Вверх
Experimenter
Дата 9.12.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 4
Всего: 17



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

Это сообщение отредактировал(а) Experimenter - 9.12.2007, 10:20


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1205 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.