Страница: 1 |
Страница: 1 |
Вопрос: %|
Добавлено: 22.07.10 02:57
Автор вопроса: UnDeAdZak
ё-моё. Либо я схожу с ума ,либо я идиот. Подскажите в чём фишка:
значит из одного события хочу прорисовать на форме картнку:
private void This_Hide(PaintEventArgs e)
{
if (Pol == 0 | Pol == 1)
{
this.Width = 20;
}
else if (Pol == 2 | Pol == 3)
{
this.Height = 20;
}
this.TopMost = true;
Bitmap pic = new Bitmap(Application.StartupPath + "\\Files\\Name_pan.png");
if (Pol == 0)
{
e.Graphics.DrawImage(pic, new Rectangle(0, 20, this.Width, 100));
}
else if (Pol == 1)
{
e.Graphics.DrawImage(pic, new Rectangle(0, 0, this.Width, 100));
}
else if (Pol == 2)
{
pic.RotateFlip(RotateFlipType.Rotate270FlipNone);
e.Graphics.DrawImage(pic, new Rectangle(20, 0, 100, this.Height));
}
else if (Pol == 3)
{
pic.RotateFlip(RotateFlipType.Rotate90FlipNone);
e.Graphics.DrawImage(pic, new Rectangle(0, 0, 100, this.Height));
}
}
Вызываю его из другого события(клика по меню):
private void скрытьToolStripMenuItem_Click(object sender, EventArgs e)
{
hid = true;
This_Hide(new PaintEventArgs(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height)));
}
Однако! дело в том, что перед прорисовкой картинки мне надо очистить форму, и по определённым соображениям просто e.Graphics.Clear(Color.Red);
я использовать не могу, т.к. задний фон формы прозрачный.
В итоге я просто прописываю this.Invalidate();, не имея ничего в Form1_Paint(). НО! Если перерисовку формы не делать, то всё работает на ура. Однако как только я влепляю её( без разницы куда - в код рисовки(перед прорисовкой изображения), или в код вызова прорисовки) Перестаёт происходить рисование картинки!!! Т.е. вместо того чтобы на форме появилась картинка, она остаётся обсолютно пустой. Подскажите пожалуйста, почему.
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #1
Добавлено: 22.07.10 11:18
e.Graphics.Clear(Color.Transparent);
Бо?
Номер ответа: 2
Автор ответа:
UnDeAdZak
Вопросов: 80
Ответов: 476
Профиль | | #2
Добавлено: 22.07.10 11:31
V??U??t Уже пробовал. Не бо. Форма тупо заливается чёрным цветом(
может я не правельно форму прозрачной делаю?
Так??? Или я чтото важное упустил?
Номер ответа: 3
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #3
Добавлено: 22.07.10 12:27
e.Graphics.Clear(BackColor);
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 22.07.10 14:49
Хрень ты сделал.. полную..
Ты не понимаешь того, что любое твое действие (клик в меню, движение мыши над формой,закрытие пункта меню.. абсолютно ВСЕ, что происходит в пределах формы) вызывает OnPaint в котором у тебя ничего нет. и все твои художества тупо затираются! И Создавать свой собственный PaintEventArgs - это ваще бред.. Все рисования на форме должны производиться(или вызываться) ТОЛЬКО в OnPaint/OnPaintBackground и никак иначе
Номер ответа: 5
Автор ответа:
UnDeAdZak
Вопросов: 80
Ответов: 476
Профиль | | #5
Добавлено: 22.07.10 14:55
EROSЯ знаю, но дело в том, что моя программа в Form1_Paint имеет очень много действий, в следствие чего, я надеялся разбить паинт на части для выполнения, т.к. часть действий можно пропустить(если это делать в целом коде(а там порядка 200-300строк)то программа только ещщё больше замедлится, а событие Paint у меня вызывается часто.
Номер ответа: 6
Автор ответа:
UnDeAdZak
Вопросов: 80
Ответов: 476
Профиль | | #6
Добавлено: 22.07.10 15:11
V??U??t Спасибо большое! Я както и не подумал про цвет заднего плана. Прозрачный попробовал, цвет прозрачности формы - попробовал, а цвет заднего плана - забыл=(.
Спасибо огромное!
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 22.07.10 15:18
В Paint не должно быть никаких действий кроме отрисовки.. Ты должен понимать, что любые дейсвтия с формой,например this.Width = 20;, вызывают OnPaint (который снова все затирает). Поэтому все действия рассчеты и прочая хрень должны быть ВНЕ события Paint! А внутри оставь только логику.. типа этой
Т.е. тупо проверка какой то переменной, и какие то действия по отрисовке если они необходимы. Все значения переменных устанавливай снаружи Paint.. Например по клику на меню установил нужную ширину,задал значение Pol=стопицот, а затем вызвал Invalidate или Refresh.. Это вызовет событие OnPaint в котором ты проверишь значение Pol и отрисуешь что надо..
Это правильный подход.. но вызывать эти части надо из OnPaint,передав им родной PaintEventArgs.. например так
В любом случае логика приложения должна быть такая
1. Производишь нужные расчеты
2. Устанавливаешь значения переменным
3. Вызываешь Invalidate();
а в OnPaint проверил что надо,если условие верное, то вызывает нужную процедуру например DrawBorder(e);
вот как то так...
Номер ответа: 8
Автор ответа:
UnDeAdZak
Вопросов: 80
Ответов: 476
Профиль | | #8
Добавлено: 23.07.10 22:33
Спасибо большое,EROS, как показала практика подход с
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
 rawBorder(e);
 rawText(e);
 rawEtc(e);
}
Оказался правильнее, а так-же избавил от нескольких других проблем.
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 23.07.10 22:53
ну так дедушка EROS плохого не посоветует..
Номер ответа: 10
Автор ответа:
UnDeAdZak
Вопросов: 80
Ответов: 476
Профиль | | #10
Добавлено: 24.07.10 12:35
Я 100% точно угадал ответ