Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Заливка Канвы при запуске программы


Автор: NosfBlazE 12.3.2010, 20:11
Есть простенькая программка, которая представляет собой Форму, на которую кинут PaintBox.
Пытаюсь при запуске программы сразу же залить PaintBox и что-нибдуь на нем нарисовать.

Код

procedure TMainForm.FormShow(Sender: TObject);
begin

        MainForm.PaintBox1.Canvas.Brush.Color:=clWhite;
        MainForm.PaintBox1.Canvas.Pen.Color := clBlack;
        MainForm.PaintBox1.Canvas.FillRect(clientrect);
        MainForm.PaintBox1.Canvas.Ellipse(38,58,42,62);

end;


Т.е. все просто: на событие onShow главной Формы цепляю все это, но, увы, ничего не происходит. smile
Если же кинуть на форму еще какую-то кнопку и повесить все это на ее клик, то работает как надо. Но я хочу работать с канвой без вмешательства пользователя.))

В чем может быть проблема, может быть, можно как-то по-другому сделать то, что я хочу? В общем, жду совета, а то сам я еще неочень разбираюсь в Делфи.

Автор: Frees 12.3.2010, 20:12
повесь это на OnPaint формы..

Автор: NosfBlazE 12.3.2010, 20:35
С onPaint работает, не спорю smile Просто потом из-за этого события после каких-то изменений с формой/на форме, снова срабатывает onPaint, который затирает все, что было на канве.

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

Автор: Frees 12.3.2010, 20:37
все рисование должно быть в он паинте... что у тебя затирается не пойму, объясни...

Автор: NosfBlazE 12.3.2010, 20:55
Тогда рассказываю более подобно. Пасиб, что хоть слушаете smile

В программе есть ПеинтБокс и кнопки, с помощью которых происходит рисование на этом ПеинтБоксе.
Однако, в процессе работы программы некоторые кнопки делаются активными/неактивными. В этот то момент и срабатывает событие онПеинт главной формы, которое выводит начальную заливку и рисунок нашего ПеинтБокса, что были установлены при запуске программы. И все результаты последующей работы с ПеинтБоксом  затираются.

Автор: Frees 12.3.2010, 21:18
рисуй в Tbitmap а в событии OnPain у PaintBox1 рисуй содержимое  bitmap на канве PaintBox1

Добавлено через 13 минут и 39 секунд
пример

Код

  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    b: TBitmap;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  b.Canvas.Ellipse(0,0,42,62);
  PaintBox1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  b := TBitmap.Create;
  with b do
  begin
     SetSize(Self.Width, self.Height);
     Canvas.Brush.Color:=clWhite;
     Canvas.Pen.Color := clBlack;
     Canvas.FillRect(clientrect);
     Canvas.Ellipse(38,58,42,62);
  end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  b.Free;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0,0, b);
end;

end.

Автор: NosfBlazE 12.3.2010, 21:35
Ясно, спасибо большое. Пойду тогда все переделывать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)