Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с System::Drawing::Graphics

47K
21 апреля 2010 года
CommanderRUS
17 / / 13.11.2009
Всем привет!

Пишу проект на С++ в Windows Forms в MS Visual Studio 2005

Имеется форма на которой расположена панелька.
На панельке требуется рисовать определенные элементы.
Для рисования использую System::Drawing::Graphics

Рисую следующим образом:
System::Drawing::Graphics ^GraphPanel;
GraphPanel=dr_panel->CreateGraphics();
...

GraphPanel->FillEllipse(Brushes::DarkRed,x-15,y-15,30,30);
Drawing::Font ^TextFont = gcnew Drawing::Font("Arial",10);
GraphPanel->DrawString(n.ToString(),TextFont,Brushes::White,x-6,y-7);

Все замечательно рисуется, но есть проблема:
Если свернуть окно программы и развернуть его, то все нарисованное пропадает, если поверх программы отрыть любое другое окно, то область на которую это окно попадет тоже пропадает. Пример данной проблемы привожу на скрине:



Пытался найти решение в MSDN, не получилось

Буду очень благодарен за помощь!
8.2K
21 апреля 2010 года
bagie2
299 / / 26.10.2008
конечно пропадает.
- нарисовать в битмап, а битмап отобразить на какой-нибудь контрол (PictureBox и т.д.)
- рисовать на WM_PAINT \ или почти оно же, как ниже написал hardcase
- в цикле в отдельном потоке (не самый лучший способ)
и еще есть способы
5
21 апреля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: CommanderRUS

Если свернуть окно программы и развернуть его, то все нарисованное пропадает, если поверх программы отрыть любое другое окно, то область на которую это окно попадет тоже пропадает.


Обрабатывайте событие OnPaint. Оно специально для этого существует. И вообще старайтесь рисовать только в нем, так как при генерировании этого события система передает уже готовый Graphics с установленной областью клиппинга.

8.2K
22 апреля 2010 года
bagie2
299 / / 26.10.2008
hardcase
но если понадобится анимация, например, то wm_paint\OnPaint может и не очень подойти. в остальных случаях именно его. кстати забыл про реализацию OnPaint, это же дотнет :)
5
22 апреля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: bagie2
hardcase
но если понадобится анимация, например, то wm_paint\OnPaint может и не очень подойти

Для начала наверное автору стоит научиться пользоваться OnPaint/Invalidate а также корректно работать с графиксом, который вообще-то реализует IDisposable.

307
22 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Лучше всего рисовать на битмапе, а битмап в онпаинте отрисовывать на форму, или запихнуть его в компонент(для особо ленивых), в таком случае нормально и просто рисовать и анимировать, но сие есть мое скромное мнение, подтвержденное личным опытом!:)
8.2K
22 апреля 2010 года
bagie2
299 / / 26.10.2008
Artem_3A
Дак, да. Я первым пунктом это и написал и тоже не просто так. Просто удобно. Но иногда и в этом нет смысла.
47K
22 апреля 2010 года
CommanderRUS
17 / / 13.11.2009
Большое спасибо всем откликнувшимся!

Цитата:
Для начала наверное автору стоит научиться пользоваться OnPaint/Invalidate а также корректно работать с графиксом, который вообще-то реализует IDisposable.



Буду очень признателен если подскажете где можно почитать. С графикой (да и вообще с отрисовкой элементов) работаю впервые и знания в этой области находятся практически на нуле, поэтому с удовольствием пополню свои знания в этой области)

Так как координаты всех моих фигур (вершины и ребра графа) хранятся в списке, то временно сделал следующим образом: В событии dr_panel_Paint пробегаюсь по всему списку и отрисовываю все фигуры заново (насколько я понял событие Paint и OnPaint элемента различаются, но на данный момент не совсем понятно чем именно, и что лучше использовать)

Предложенный вариант с битмапом нравится больше. Буду очень благодарен если подскажете где можно почитать поподробнее как с ним работать

307
23 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: bagie2
Artem_3A
Дак, да. Я первым пунктом это и написал и тоже не просто так.



так как бэ я тебя одобряю в этом плане и поддерживаю!:)

Цитата: bagie2
Но иногда и в этом нет смысла.




не соглашуть, так как каждый раз перерисовавыть простую фигуру еще сойдет, а вот если там что сложное, то это может заметно ударить по производительности, вычисления и все такое. да и как то не эстетично, что ли... в этом плане даже в Qt рисование вне обработчика пайнтэвента возможно только на пиксмапах, битмапах и прочем.:D

Цитата: CommanderRUS
Предложенный вариант с битмапом нравится больше. Буду очень благодарен если подскажете где можно почитать поподробнее как с ним работать



вот пример:

Код:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Bitmap buffer;
        public Graphics painter;
        public Pen pen;

        public Form1()
        {
            InitializeComponent();

            buffer = new Bitmap(600, 600);
            painter = Graphics.FromImage(buffer);
            pen = new Pen(Color.Red);

            painter.Clear(Color.White);
            painter.DrawEllipse(pen, 20.0f, 40.0f, 60.0f, 100.0f);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gr = this.CreateGraphics();
            gr.DrawImage(buffer, 0.0f, 0.0f);
        }
    }
}


код не очень элегантен, не судите строго, писал на коленке уже почти в дверях.

в основном этого и знания обычного рисования достаточно, как видишь рисование особо не отличается, вне зависимости на форме малюешь или на битмапе.
5
23 апреля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Artem_3A


вот пример:


Зачем создавать графикс, если он и так уже передается?

 
Код:
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gr = e.Graphics;
            gr.DrawImage(buffer, 0.0f, 0.0f);
        }
307
23 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: hardcase
Зачем создавать графикс, если он и так уже передается?



эм... упс... оплошал!:rolleyes:

ЗЫ: писал в попыхах, строго не судите!:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог