Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2011, 19:45   #1
HelenSecuriter
Пользователь
 
Аватар для HelenSecuriter
 
Регистрация: 19.10.2010
Сообщений: 17
По умолчанию обновление рисунка в PaintBox

Доброго времени суток!

Не подскажите, почему, когда рисуешь что-нибудь на PaintBox'e, и затем скрываешь окно, то рисунок исчезает:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Canvas->FillRect(Image1->ClientRect);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (ColorDialog1->Execute())Image1->Canvas->Pen->Color=ColorDialog1->Color;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if (Shift.Contains(ssLeft))Image1->Canvas->LineTo(X,Y);
else Image1->Canvas->MoveTo(X,Y);
}
//---------------------------------------------------------------------------
В коде везде вместо Image1 должно быть PaintBox1
HelenSecuriter вне форума Ответить с цитированием
Старый 28.06.2011, 20:33   #2
Dogmat
Пользователь
 
Регистрация: 12.06.2008
Сообщений: 76
По умолчанию

Потому что происходит перерисовка по событию WM_PAINT, а обработчик OnPaint пуст. Обрабатывайте событие OnPaint.

По нажатию на кнопку рисуем, например, в TBitmap, во время OnPaint узнаем какой регион требуется перерисовать и копируем регион аналогичных размеров из TBitmap в bitmap PaintBox-а.

На основе вашего примера:
Код:
class TForm1 : public TForm
{
//_______________________Unit1.h_______________________//
__published:	// IDE-managed Components
    TPaintBox *PaintBox;
    void __fastcall PaintBoxMouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
    void __fastcall PaintBoxPaint(TObject *Sender);

public:	
    __fastcall TForm1(TComponent* Owner);

protected:

private:
    Graphics::TBitmap *paintBitmap;
};

//_______________________Unit1.cpp_______________________//
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
    TRect paintRect;
    paintRect.Left = 0;
    paintRect.Top = 0;
    paintRect.Right = PaintBox->ClientWidth;
    paintRect.Bottom = PaintBox->ClientHeight;

    paintBitmap = new Graphics::TBitmap;
    paintBitmap->Width = PaintBox->Width;
    paintBitmap->Height = PaintBox->Height;
    paintBitmap->Canvas->Brush->Color = this->Color;
    paintBitmap->Canvas->FillRect(paintRect);
}

void __fastcall TForm1::PaintBoxMouseMove(TObject *Sender,
                                                              TShiftState Shift, int X, int Y)
{
    if (Shift.Contains(ssLeft))
    {
        paintBitmap->Canvas->LineTo(X,Y);
        PaintBox->Repaint();
    }
    else
    {
        paintBitmap->Canvas->MoveTo(X,Y);
    }
}

void __fastcall TForm1::PaintBoxPaint(TObject *Sender)
{
    TRect clipRect = PaintBox->Canvas->ClipRect;

    PaintBox->Canvas->CopyRect(clipRect, paintBitmap->Canvas, clipRect);
}
А это уже из справки:
Код:
virtual void __fastcall Paint(void);

Description

Paint responds to WM_PAINT messages from Windows by initializing the canvas and calling the OnPaint event handler if it is assigned.

Последний раз редактировалось Dogmat; 28.06.2011 в 20:36.
Dogmat вне форума Ответить с цитированием
Старый 29.06.2011, 20:09   #3
HelenSecuriter
Пользователь
 
Аватар для HelenSecuriter
 
Регистрация: 19.10.2010
Сообщений: 17
Радость

Спасибо, буду разбираться!
HelenSecuriter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
paintBox Фобия Помощь студентам 1 13.06.2011 02:08
PaintBox Fintroll Windows Forms 1 11.04.2011 01:01
PaintBox _-Re@l-_ Общие вопросы Delphi 11 23.06.2010 12:54
Paintbox lacost Мультимедиа в Delphi 3 14.01.2009 09:53
paintbox steck Общие вопросы Delphi 5 28.10.2007 16:15