Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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 Уже пробовал. Не бо. Форма тупо заливается чёрным цветом(
может я не правельно форму прозрачной делаю?
  1.             
  2. this.TransparencyKey = this.BackColor;


Так??? Или я чтото важное упустил?

Ответить

Номер ответа: 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! А внутри оставь только логику.. типа этой
  1.  
  2.             if (Pol == 0)
  3.             {
  4.                 e.Graphics.DrawImage(pic, new Rectangle(0, 20, this.Width, 100));
  5.             }


Т.е. тупо проверка какой то переменной, и какие то действия по отрисовке если они необходимы. Все значения переменных устанавливай снаружи Paint.. Например по клику на меню установил нужную ширину,задал значение Pol=стопицот, а затем вызвал Invalidate или Refresh.. Это вызовет событие OnPaint в котором ты проверишь значение Pol и отрисуешь что надо..
надеялся разбить паинт на части для выполнения

Это правильный подход.. но вызывать эти части надо из OnPaint,передав им родной PaintEventArgs.. например так
  1.  
  2.         protected override void OnPaint(PaintEventArgs e)
  3.         {
  4.             base.OnPaint(e);
  5.             DrawBorder(e);
  6.             DrawText(e);
  7.             DrawEtc(e);
  8.         }
  9.  
  10.         private void DrawBorder(PaintEventArgs e)
  11.         {
  12.             /* you code here.. */
  13.         }
  14.  
  15.         private void DrawText(PaintEventArgs e)
  16.         {
  17.             /* you code here.. */
  18.         }
  19.  
  20.         private void DrawEtc(PaintEventArgs e)
  21.         {
  22.             /* you code here.. */
  23.         }
  24.  


В любом случае логика приложения должна быть такая
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);
            ;DrawBorder(e);
            ;DrawText(e);
            ;DrawEtc(e);
        }
 

Оказался правильнее, а так-же избавил от нескольких других проблем.

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 23.07.10 22:53
ну так дедушка EROS плохого не посоветует..

Ответить

Номер ответа: 10
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #10 Добавлено: 24.07.10 12:35
Я 100% точно угадал ответ %)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам