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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Graphics, Paint, OnPaint ... с графикой не очень я дружу ... 
:(
    Опции темы
lioness
Дата 6.11.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Два примера. Должны работать одинаково, а почему с Paint не работает  smile 

Пример с CreateGraphics (работает)
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindAppl_example_1
{
    public partial class Form1 : Form
    {
        bool drawEllipse = false;
        public Form1()
        {

            InitializeComponent();
            
        }

        private void drawEllipseButton_Click(object sender, EventArgs e)
        {
            this.drawEllipse = !this.drawEllipse;
            Graphics g = this.CreateGraphics();
            
                if (this.drawEllipse)
                {
                    g.FillEllipse(Brushes.DarkBlue, this.ClientRectangle);
                }
                else
                {
                    g.FillEllipse(SystemBrushes.Control, this.ClientRectangle);
                }
            
        }
    }
}

Кстати, в книге (Chris Sells...) стояло так: 
Код

using (Graphics g = this.CreateGraphics())
{
//Draw
...
//Erase
}



А зачем был using? Я его убрала - разницы не заметила.

И другой пример (НЕ работает), хотя должно быть то же самое, только с Paint-ом
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindApp_example_2
{
    public partial class Form1 : Form
    {
        bool drawEllipse = false;

        public Form1()
        {
            InitializeComponent();
        }

        void drawEllipseButton_Click(object sender, EventArgs e)
        {
            this.drawEllipse = !this.drawEllipse;

        }

        void drawEllipseButton_Paint(object sender, PaintEventArgs e)
        {
            if (!this.drawEllipse) return;
            Graphics g = e.Graphics;
            g.FillEllipse(Brushes.DarkBlue, this.ClientRectangle);
        }
    }
}


И не рисует он ничего. Я попробовала с горя Refresh().  Хотя оба должны бы работать вроде бы как одинаково  smile 

А OnPaint чем отличается от Paint?  Или это один и тот же void для события по прорисовке?
PM MAIL   Вверх
ivashkanet
Дата 6.11.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Цитата(lioness @  6.11.2006,  18:00 Найти цитируемый пост)
Пример с CreateGraphics (работает)

Кроме случая со сворачиванием/разворачиванием и перекрытия нашей формы другой, да?
Цитата(lioness @  6.11.2006,  18:00 Найти цитируемый пост)
А зачем был using? Я его убрала - разницы не заметила.

А он уничтожает, вызывает его метод Dispose(), объект, который создается в скобках, сразу после конца блока using.
Цитата(lioness @  6.11.2006,  18:00 Найти цитируемый пост)
 void drawEllipseButton_Paint(object sender, PaintEventArgs e)

А drawEllipseButton_Paint зарегистрирован как обработчик для события Paint?
Код
this.Paint += new System.Windows.Forms.PaintEventHandler(this.drawEllipseButton_Paint);

Цитата(lioness @  6.11.2006,  18:00 Найти цитируемый пост)
void drawEllipseButton_Click(object sender, EventArgs e)        
{
     this.drawEllipse = !this.drawEllipse;
}

После изменения свойств влияющих на рисование нужно вызвать перерисовку контрола:
Код

this.Invalidate()

P.S. Во втором случае все равно будут проблеммы с изменение размеров формы  smile 
PM MAIL WWW ICQ   Вверх
lioness
Дата 7.11.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Кроме случая со сворачиванием/разворачиванием и перекрытия нашей формы другой, да?

Ой, ну, конечно, да  smile  

Подписка на событие стоИт, она же автоматически ставится дизайнером. 

Ставила я уже Invalidate и Refresh с горя ставила.  Пример, с Paint-ом  рисует какой-то крошечный кусочек синевого эллипса и то, если мышкой по форме пробежаться.  smile  Как-будто бы  this.ClientRectangle  для Paint-а отличается от ClientRectangle для Graphics. 
PM MAIL   Вверх
mr.DUDA
Дата 7.11.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(lioness @  6.11.2006,  18:00 Найти цитируемый пост)
А зачем был using? Я его убрала - разницы не заметила.

this.CreateGraphics создаёт новый экземпляр Graphics, поэтому его надо освобождать вызовом Dispose, либо заключением в using. В то время как e.Graphics в обработчике события Paint уже содержит существующий объект Graphics, который ещё будет использоваться и освобождаться WinForms после отрисовки - его освобождать не надо.

Цитата(lioness @  6.11.2006,  18:00 Найти цитируемый пост)
А OnPaint чем отличается от Paint?  Или это один и тот же void для события по прорисовке?

OnPaint - виртуальный метод, определённый в классе Control, его задача - сгенерировать событие Paint. Этот метод перекрывают для того, чтобы выполнить какие-то действия до или после всех обработчиков события Paint, либо чтобы вовсе запретить отрисовку по какому-либо условию и так далее. По сути, такие методы как OnBlablabla обеспечивают полиморфизм при генерации событий.


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 7.11.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



lioness, вот твой код 1:1 только добавлен Invalidate(), который работает корректно:
Код

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        bool drawEllipse = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.drawEllipse = !this.drawEllipse;
            this.Invalidate();
        }

        void drawEllipseButton_Paint(object sender, PaintEventArgs e)
        {
            if (!this.drawEllipse) return;

            Graphics g = e.Graphics;
            g.FillEllipse(Brushes.DarkBlue, this.ClientRectangle);
        }
    }
}


Цитата(lioness @  7.11.2006,  12:41 Найти цитируемый пост)
Подписка на событие стоИт, она же автоматически ставится дизайнером. 

В смысле автоматически? Если нажал(-а) выбрал метод на вкладке событий, то да.

 smile Кроме того: drawEllipseButton_Paint --- что-то смахивает на обработчик рисования для кнопки, а не для формы  smile    smile 

P.S. 
Цитата(ivashkanet @  6.11.2006,  22:02 Найти цитируемый пост)
А он уничтожает, вызывает его метод Dispose(), объект, который создается в скобках, сразу после конца блока using.

Да, это я хорошо написал  smile Вот что значит вечер  smile Голова не варила


PM MAIL WWW ICQ   Вверх
lioness
Дата 8.11.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Стоит там уже Validate!  А Paint рисует только кусочек от эллипса и, действительно, только на кнопке, а не на форме. 

По моим понятиям, эти два кода должны делать одинаковую графику, только Paint луччче  smile , поскольку "отслеживает" передвижение формы. И перекрытие рисунка. 
У меня с Paint-ом  давно напряженные отношения.  Всякие "резиновые" линии у меня прыгают без подобных выкрутасов.  

  
PM MAIL   Вверх
ivashkanet
Дата 9.11.2006, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Цитата(lioness @  8.11.2006,  18:56 Найти цитируемый пост)
А Paint рисует только кусочек от эллипса и, действительно, только на кнопке, а не на форме. 

Потому, что drawEllipseButton_Paint зарегистрирован как обработчик прорисовки для КНОПКИ, а не для формы 
P.S. 
Цитата(lioness @  8.11.2006,  18:56 Найти цитируемый пост)
Validate

Так Validate или Invalidate ?
PM MAIL WWW ICQ   Вверх
lioness
Дата 9.11.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Invalidate  smile 

Ну, конечно, для кнопки объявила Paint !  Не нарочно, чессно слово  smile 
Большое русское мерси  smile 
PM MAIL   Вверх
ivashkanet
Дата 9.11.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



lioness, ну слава богу smile 
Не за что smile

P.S. Небольшое замечание: твой рисовальщик будет глючить при изменении размеров формы.
Все потому, что рисунок который был до изменений размера отличается от рисунка после. 
А так как Paint --- очень хитрый метод, то он рисует только то что изменилось smile 
В нашем случае, если мы расширим экран, то он отрисует только ту часть, которая "была добавлена" к форме, считая что старый рисунок соответствует действительности и перерисовывать его не надо.
Чтобы этого избежать нужно либо:
1) использовать статический рисунок, либо после каждого изменения размера формы (от него зависит размер эллипса) нужно вызвать Invalidate() форме  smile 

PM MAIL WWW ICQ   Вверх
koljan
Дата 26.11.2006, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


VIP
**


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

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



люди, извиняйте что в эту тему пишу а не создаю отдельно т.к. вопрос по приведённому выше коду

как только я пишу компилятору не нравится слово partial
Код

public partial class Form1 : System.Windows.Forms.Form

у меня ошибку выдаёт вот такую:
Цитата

Expected class, delegate, enum, interface, or struct




--------------------
PM MAIL ICQ   Вверх
mr.DUDA
Дата 26.11.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



koljan, потому что фреймворк нужен 2.0, похоже что у тебя 1.1 (студия 2003)


--------------------
user posted image
PM MAIL WWW   Вверх
koljan
Дата 29.11.2006, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


VIP
**


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

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



Цитата(mr.DUDA @  26.11.2006,  14:45 Найти цитируемый пост)
потому что фреймворк нужен 2.0, похоже что у тебя 1.1 (студия 2003)

а можно оставить 2003 студию и фреймворк второй поставить ?
не будут они между собой конфликтовать?


--------------------
PM MAIL ICQ   Вверх
ivashkanet
Дата 29.11.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



koljan, с чего же? Но и дружить не будет  smile 
Чтобы разрабатывать под второй FW нужна 2005-ая студия
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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