Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDIChild и свойства канвы, как обратиться к компонент текущего детя 
:(
    Опции темы
xottab
  Дата 29.2.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет. На лабе задали написать графический редактор MDI. все красиво вроде бы написалось, но вот обнаружилась проблема. Я описал абстрактный класс GObject, кучку его наследников для рисования той или иной фигуры. В дочерней форме создал вектор объектов этого класса. При нажатии кнопки мыши  создаю объект, при движении мыши - рисую его, при отпускании фиксирую. Все норм. но когда в приложении создаю более 2-х дочерних форм, то все рисование начиная с момента создания последней формы происходит в последней форме, даже если рисуешь в первой созданной форме. (причем изображения предыдущих затираются, хотя они сохранены в битмапах) Как это исправить? Вот кусоки кода:
абстрактный класс
Код

// TF - дочерняя форма
struct GObject
{
        virtual void Draw(int X, int Y) = 0;
        virtual void End(int X,int Y) = 0;

        //TColor cl;
};

struct GLine : public GObject
{
   GLine(int X,int Y): x0(X), y0(Y), x1(X), y1(Y) {};

   void Draw(int X,int Y)
   {
      TF->PaintBox1->Canvas->Pen->Mode = pmNotXor;

      TF->PaintBox1->Canvas->MoveTo(x0,y0);
      TF->PaintBox1->Canvas->LineTo(x1,y1);

      TF->PaintBox1->Canvas->MoveTo(x0,y0);
      TF->PaintBox1->Canvas->LineTo(X,Y);
      x1 = X;
      y1 = Y;
   }

   void End(int X,int Y)
   {
      TF->PaintBox1->Canvas->Pen->Mode = pmCopy;
      TF->PaintBox1->Canvas->MoveTo(x0,y0);
      TF->PaintBox1->Canvas->LineTo(X,Y);
      TF->BitMap->Canvas->Brush->Style = bsClear;
      TF->BitMap->Canvas->MoveTo(x0,y0);
      TF->BitMap->Canvas->LineTo(X,Y);
   }
private:
   int x0, x1, y0, y1;
};


события формы
Код


bool f_draw = false;
vector<GObject *> objs;
...

void __fastcall TFdoc::PaintBox1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
...
   if(Fmain->SBLine->Down)
   {
      GObject *gobj = new GLine(X,Y);
      objs.push_back(gobj);
      f_draw = true;
   }
...
}
void __fastcall TFdoc::PaintBox1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
      if(f_draw)
      {
         objs[objs.size()-1]->Draw(X,Y);
      }
}
void __fastcall TFdoc::PaintBox1MouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   if(Fmain->SBLine->Down)
   {
      objs[objs.size()-1]->End(X,Y);
   }
   f_draw = false;
}
...


Это сообщение отредактировал(а) xottab - 29.2.2008, 19:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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