Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690

Вместо отрисовки фигуры форма зачеркивается линиями

04.12.2014, 20:58. Показов 1192. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть простой код на С++ CLI, несколько классов обверток методов класса Graphics для рисования простых фигур:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class Line // класс линия
    {
        public:
        void DrawLine(PaintEventArgs^ e, int leftX, int topX, int leftY, int topY);
    };
 
    void Line::DrawLine(PaintEventArgs^ e, int leftX, int topX, int leftY, int topY)
    {
        e->Graphics->DrawLine(gcnew Pen(Color::Black, 3), leftX, topX, leftY, topY);
    };
 
    public class Ellipse // класс эллипс
    {
        public:
        void DrawEllipse(PaintEventArgs^ e, int X, int Y, int width, int height);
    };
 
    void Ellipse::DrawEllipse(PaintEventArgs^ e, int X, int Y, int width, int height)
    {
        e->Graphics->DrawEllipse(gcnew Pen(Color::Black, 3), X, Y, width, height);
    };
 
    public class Rectangle // класс квадрат
    {
        public:
        void DrawRectangle(PaintEventArgs^ e, int X, int Y, int width, int height);
    };
 
    void Rectangle::DrawRectangle(PaintEventArgs^ e, int X, int Y, int width, int height)
    {
        e->Graphics->DrawRectangle(gcnew Pen(Color::Black, 3), X, Y, width, height);
    };
 
    public class Arc // класс дуга
    {
        public:
        void DrawArc(PaintEventArgs^ e, int X, int Y, int width, int height, int startAngle, int sweepAngle);
    };
 
    void Arc::DrawArc(PaintEventArgs^ e, int X, int Y, int width, int height, int startAngle, int sweepAngle)
    {
        e->Graphics->DrawArc(gcnew Pen(Color::Black, 3), X, Y, width, height, startAngle, sweepAngle);
    };
 
    public class Segment // класс сегмент
    {
        public:
        void DrawLines(PaintEventArgs^ e, array<Point>^ points);
    };
 
    void Segment::DrawLines(PaintEventArgs^ e, array<Point>^ points)
    {
        e->Graphics->DrawLines(gcnew Pen(Color::Black, 3), points);
    };
 
    public class Pie // класс сектор
    {
        public:
        void DrawPie(PaintEventArgs^ e, int X, int Y, int width, int height, int startAngle, int sweepAngle);
    };
 
    void Pie::DrawPie(PaintEventArgs^ e, int X, int Y, int width, int height, int startAngle, int sweepAngle)
    {
        e->Graphics->DrawPie(gcnew Pen(Color::Black, 3), X, Y, width, height, startAngle, sweepAngle);
    };
Далее по коду я передаю параметры в конструкторы этих методов и рисую на форме эти фигуры, но есть но, вместо того, чтобы рисовать мне фигуру, он зачеркивает форму красными линиями и кнопку добавления фигуры на форму, замечу следующее, чтобы передать параметры в класс, я использовал событие Paint главной формы и подписался на этой событие нажатием кнопки добавить, чтобы оно вызывалось каждый раз когда я нажимаю данную кнопку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private: System::Void MainForm_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e)
         {
             if (comboBoxType->Text == "Окружность")
             {
                 Ellipse* ellipse = new Ellipse();
                 ellipse->DrawEllipse(e, Convert::ToInt32(textBoxLeftX->Text), Convert::ToInt32(textBoxTopX->Text), Convert::ToInt32(textBoxLeftY->Text), Convert::ToInt32(textBoxTopY));
                 delete ellipse;
             }
             else if (comboBoxType->Text == "Линия")
             {
                Line* line = new Line();
                line->DrawLine(e, Convert::ToInt32(textBoxLeftX->Text), Convert::ToInt32(textBoxTopX->Text), Convert::ToInt32(textBoxLeftY->Text), Convert::ToInt32(textBoxTopY));
                delete line;
             }
             else if (comboBoxType->Text == "Прямоугольник")
             {
                 Rectangle* rectangle = new Rectangle();
                 rectangle->DrawRectangle(e, Convert::ToInt32(textBoxLeftX->Text), Convert::ToInt32(textBoxTopX->Text), Convert::ToInt32(textBoxLeftY->Text), Convert::ToInt32(textBoxTopY));
                 delete rectangle;
             }
             else if (comboBoxType->Text == "Дуга")
             {
                 Arc* arc = new Arc();
                 arc->DrawArc(e, Convert::ToInt32(textBoxLeftX->Text), Convert::ToInt32(textBoxTopX->Text), Convert::ToInt32(textBoxLeftY->Text), Convert::ToInt32(textBoxTopY), Convert::ToInt32(textBoxStartAngle->Text), Convert::ToInt32(textBoxSweepAngle->Text));
                 delete arc;
             }
             else if (comboBoxType->Text == "Сегмент")
             {
                 array<Point>^ points = { Point(Convert::ToInt32(textBoxLeftX->Text), Convert::ToInt32(textBoxLeftY->Text)), Point(Convert::ToInt32(textBoxTopX->Text), Convert::ToInt32(textBoxTopY->Text)), Point(Convert::ToInt32(textBoxStartAngle->Text), Convert::ToInt32(textBoxSweepAngle->Text)), Point(Convert::ToInt32(textBoxPoint7->Text), Convert::ToInt32(textBoxPoint8->Text)) };
                 Segment* segment = new Segment();
                 segment->DrawLines(e, points);
                 delete segment;
             }
             else if (comboBoxType->Text == "Сектор")
             {
                 Pie* pie = new Pie();
                 pie->DrawPie(e, Convert::ToInt32(textBoxLeftX->Text), Convert::ToInt32(textBoxTopX->Text), Convert::ToInt32(textBoxLeftY->Text), Convert::ToInt32(textBoxTopY), Convert::ToInt32(textBoxStartAngle->Text), Convert::ToInt32(textBoxSweepAngle->Text));
                 delete pie;
             }
         }
Далее сам обработчик нажатия кнопки добавить на форме, который подписан на событие MainForm_Paint:
C++
1
2
3
4
private: System::Void buttonAdd_Click(System::Object^  sender, System::EventArgs^  e)
         {
             Refresh();
         }
Как бороться с данной проблемой подскажите, уже пробовал и Update(), Refresh(), Invalidate() все безуспешно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2014, 20:58
Ответы с готовыми решениями:

Площадь фигуры огр. линиями
Ребят, подскажите пожалуйста, как найти площадь фигуры огр. линиями y = \ln x, y = 2e, x = 0

Площадь фигуры, ограниченной линиями
Здравствуйте. Задание : найти площадь фигуры, ограниченной линиями. y(x)=\frac{1}{x*\sqrt{1+ln(x)}} функция . y=0 y=e^3 x=1 -...

Площадь фигуры, ограниченная линиями
Доброй ночи. Дана фигура, ограниченная линиями, проверьте, пожалуйста, правильно ли я расставила пределы интегрирования: D:...

16
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
04.12.2014, 21:02  [ТС]
Скрин зачеркнутой формы:
Миниатюры
Вместо отрисовки фигуры форма зачеркивается линиями  
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
04.12.2014, 21:06  [ТС]
Подписывался вот так, не знаю правильно ли вообще делал, но не нашел другого способа чтобы использовать событие PaintEventArgs для передачи в конструктор и рисования на форме:
C++
1
this->buttonAdd->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MainForm::MainForm_Paint);
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
04.12.2014, 21:29
Запутано все... Click это клик ... А Paint это рисовать..
Далее вот это непонятно . Кнопка подписана на событии формы ?
C++
1
this->buttonAdd->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MainForm::MainForm_Paint);
Наверно лучше в целом задачу озвучить . мне лично ничего не понятно . Может кто то уловит в этом смысл.
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
04.12.2014, 21:34  [ТС]
MrCold, Хотел сделать так, чтобы при нажатии кнопки рисовались фигуры на форме, задача состояла в том, что бы все это дело использовало классы, пришлось сделать обвертку методов класса Graphics, но потом столкнулся с тем, что нужно было как-то передать параметры в класс в метод чтобы он рисовал фигуры на форме, посмотрел несколько тем в инете и нашел что есть такое событие PaintEventHandler, использовал его за основу чтобы передать его в конструктор класса и рисовать фигуры.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
04.12.2014, 21:38
Говорите одно , написано другое , нет там никакой передачи . Все нормально должно работать .
Обработать только правильно.
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
04.12.2014, 21:44  [ТС]
MrCold, Что и где исправить мне нужно?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
04.12.2014, 22:48
Цитата Сообщение от Midian Посмотреть сообщение
MrCold, Что и где исправить мне нужно?
По моему все очевидно
Цитата Сообщение от MrCold Посмотреть сообщение
Click это клик ... А Paint это рисовать..
C++
1
2
this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MainForm::MainForm_Paint);
this->buttonAdd->Click += gcnew System::EventHandler(this, &MainForm::buttonAdd_Click);
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
04.12.2014, 22:56
Кстати, конструкция работает
Миниатюры
Вместо отрисовки фигуры форма зачеркивается линиями  
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
05.12.2014, 09:19  [ТС]
MrCold, А как выглядит обработчик события на нажатие button1? Как он вызывает отрисовку фигур?

Добавлено через 5 минут
MrCold, Я так понимаю у вас просто идет автозагрузка формы в которой уже вбиты начальные параметры для перадачи в метод и срабатывает событие Paint главной формы, а мне нужно, чтобы это событие вызывалось после того, как я нажму кнопку button1, понимаете?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.12.2014, 10:38
Цитата Сообщение от Midian Посмотреть сообщение
MrCold, А как выглядит обработчик события на нажатие button1?
Ничего кроме вашего кода я не использовал ,
вот же обработчик .
C#
1
2
3
4
private: System::Void buttonAdd_Click(System::Object^  sender, System::EventArgs^  e)
         {
             Refresh();
         }
Нажали на кнопку - обновили форму
(произошло событие Paint формы )

Добавлено через 1 минуту
Цитата Сообщение от Midian Посмотреть сообщение
мне нужно, чтобы это событие вызывалось после того, как я нажму кнопку button1, понимаете?
у вас уже все есть

Добавлено через 12 минут
Кликните здесь для просмотра всего текста

у вас похоже нет понимания, что такое события.
книжки нужно читать. у Шилдта есть про события
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
05.12.2014, 12:28  [ТС]
Вот смотри, прикрепил проект. Что в нем у меня не так?
Вложения
Тип файла: rar ProjectGraphics.rar (4.00 Мб, 5 просмотров)
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.12.2014, 12:56
так , все. добрался до проекта .
вот здесь
C++
1
 Convert::ToInt32(textBoxTopY));
должно быть
C++
1
 Convert::ToInt32(textBoxTopY->Text));
и тому подобное .

Добавлено через 4 минуты
Подписка на события где ?
C++
1
2
3
4
5
6
    MainForm(void)
        {
            InitializeComponent();
            this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MainForm::MainForm_Paint);
            this->buttonAdd->Click += gcnew System::EventHandler(this, &MainForm::buttonAdd_Click);
        }
Добавлено через 36 секунд
дальше все нормально, вроде

Добавлено через 16 секунд
рисуется нормально
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
05.12.2014, 12:57  [ТС]
MrCold, О боже, как я мог так не усмотреть, я просто делал копи паст и не заметил что не скопировал ->Text... Не внимательный я ((((( Спасибо тебе за помощь, все работает.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.12.2014, 13:10
там еще в дизайнере форма не отображается ,
нужно свои классы вынести в отдельный хедер , тогда будет все норм .
В свойствах проекта выставить Поддержка CLR-среды (/clr)

Свой Rectangle обозначать вот так ::Rectangle , что бы не было неоднозначности .
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
05.12.2014, 14:08  [ТС]
MrCold, А вот тут я кстати да, не понял почему когда я выношу свой класс в отдельный файл и прописываю #incude он не видит их тупо. Поэтому я их запилил просто вверху )))))
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
05.12.2014, 14:42

Не по теме:

интернет совсем плохой не могу на форум выйти . целый час не мог загрузить


Добавил отдельный файл Figures.h . Нормально все.
Вложения
Тип файла: zip ProjectGraphics2.zip (7.44 Мб, 8 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.12.2014, 14:42
Помогаю со студенческими работами здесь

Площадь фигуры огр. линиями
y=2+x^3 {x}_{1}=1 {x}_{2}=-1 y=1 Не знаю что делать с y, нужно ли его в интеграл включать? Вообщем помогите чем...

Площадь фигуры, ограниченная 2-мя линиями
Всем привет! Есть задание Фигура получается при пересении 2-х графиков y=ax^2 + bx + c и y=kx Использовать численные методы для...

Пплощадь фигуры, ограниченной линиями.
найти площадь фигур,ограниченную линиями

Площадь фигуры, ограниченной линиями
Прошу помощи) Вычислить площадь фигуры, ограниченной линиями, заданными а) в явном виде; б) параметрически; в) в полярных...

Площадь фигуры ограниченной линиями
Опять я к вам со своими лабораторными.. Помогите пожалуйста, не могу разобраться) Задание: Найти площадь фигуры, ограниченной линиями:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru