Проблема с System::Drawing::Graphics
Пишу проект на С++ в 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, не получилось
Буду очень благодарен за помощь!
- нарисовать в битмап, а битмап отобразить на какой-нибудь контрол (PictureBox и т.д.)
- рисовать на WM_PAINT \ или почти оно же, как ниже написал hardcase
- в цикле в отдельном потоке (не самый лучший способ)
и еще есть способы
Если свернуть окно программы и развернуть его, то все нарисованное пропадает, если поверх программы отрыть любое другое окно, то область на которую это окно попадет тоже пропадает.
Обрабатывайте событие OnPaint. Оно специально для этого существует. И вообще старайтесь рисовать только в нем, так как при генерировании этого события система передает уже готовый Graphics с установленной областью клиппинга.
но если понадобится анимация, например, то wm_paint\OnPaint может и не очень подойти. в остальных случаях именно его. кстати забыл про реализацию OnPaint, это же дотнет :)
но если понадобится анимация, например, то wm_paint\OnPaint может и не очень подойти
Для начала наверное автору стоит научиться пользоваться OnPaint/Invalidate а также корректно работать с графиксом, который вообще-то реализует IDisposable.
Дак, да. Я первым пунктом это и написал и тоже не просто так. Просто удобно. Но иногда и в этом нет смысла.
Буду очень признателен если подскажете где можно почитать. С графикой (да и вообще с отрисовкой элементов) работаю впервые и знания в этой области находятся практически на нуле, поэтому с удовольствием пополню свои знания в этой области)
Так как координаты всех моих фигур (вершины и ребра графа) хранятся в списке, то временно сделал следующим образом: В событии dr_panel_Paint пробегаюсь по всему списку и отрисовываю все фигуры заново (насколько я понял событие Paint и OnPaint элемента различаются, но на данный момент не совсем понятно чем именно, и что лучше использовать)
Предложенный вариант с битмапом нравится больше. Буду очень благодарен если подскажете где можно почитать поподробнее как с ним работать
Дак, да. Я первым пунктом это и написал и тоже не просто так.
так как бэ я тебя одобряю в этом плане и поддерживаю!:)
не соглашуть, так как каждый раз перерисовавыть простую фигуру еще сойдет, а вот если там что сложное, то это может заметно ударить по производительности, вычисления и все такое. да и как то не эстетично, что ли... в этом плане даже в Qt рисование вне обработчика пайнтэвента возможно только на пиксмапах, битмапах и прочем.:D
вот пример:
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);
}
}
}
код не очень элегантен, не судите строго, писал на коленке уже почти в дверях.
в основном этого и знания обычного рисования достаточно, как видишь рисование особо не отличается, вне зависимости на форме малюешь или на битмапе.
вот пример:
Зачем создавать графикс, если он и так уже передается?
{
Graphics gr = e.Graphics;
gr.DrawImage(buffer, 0.0f, 0.0f);
}
эм... упс... оплошал!:rolleyes:
ЗЫ: писал в попыхах, строго не судите!:)