Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Событие OnPaint для компонентов


Alex_C ©   (2014-02-18 18:03:00) 

Берем пустую форму. В памяти на битмапе рисуем что-то. Далее на событие формы OnPaint при помощи BitBlt. Все отлично - никакого мерцания, если на переднем плане проги будем перемещать другие окна.
Теперь создаем компонет на основе TPanel

type
 TPanelHX = class(TPanel)
 private
   FOnPaint: TNotifyEvent;
 protected
   procedure Paint; override;
 public
   property Canvas;
 published
   property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
 end;

procedure Register;

implementation procedure TPanelHX.Paint;
begin
 inherited;
 if Assigned(fOnPaint) then
   fOnPaint(Self);
end;


Делаем его Client и рисуем на панели так же как и на форме - есть мерцание. Причем при мерцании "вылазит" цвет формы.

Попрос почему и как этого избежать? Вроде все прозрачности убрал...


icWasya   (2014-02-19 09:47:00) [1]

Лучше так

implementation
procedure TPanelHX.Paint;
begin
if Designed in ComponentState or not Assigned(fOnPaint) then
 inherited
else
 fOnPaint(Self);
end;


brother   (2014-02-19 07:52:00) [2]

> так рисуем по событию - там и нет inherited.

Вы издиваетесь??? Вот Ваш код:

> implementation procedure TPanelHX.Paint;
> begin
> inherited;
> if Assigned(fOnPaint) then
>   fOnPaint(Self);
> end;


Andy BitOff   (2014-02-18 23:51:00) [3]

Не вижу никакого мелькания. Причем даже если TPanelHX поменять на TPaintBox
http://112.imagebam.com/download/Yjq4bgoHww8QsrFaLoRhKw/30886/308852913/uuuu.gif

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type

 TPanelHX = class(TPanel)
 private
   FOnPaint: TNotifyEvent;
 protected
   procedure Paint; override;
 public
   property Canvas;
 published
   property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
 end;

 TForm1 = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormCreate(Sender: TObject);
 private
   myPanel: TPanelHX;
   myBmp: TBitmap;
   procedure myPanelOnPaint(Sender: TObject);
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TPanelHX.Paint;
begin
 inherited;
 if Assigned(FOnPaint) then
   FOnPaint(Self);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 myBmp.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 myBmp := TBitmap.Create;
 myBmp.LoadFromFile('BitOff.bmp');
 myPanel := TPanelHX.Create(Self);
 myPanel.Align := alClient;
 myPanel.OnPaint := myPanelOnPaint;
 myPanel.Parent := Self;
end;

procedure TForm1.myPanelOnPaint(Sender: TObject);
begin
 BitBlt(myPanel.Canvas.Handle, 0, 0, myPanel.ClientWidth, myPanel.ClientHeight, myBmp.canvas.handle, 0, 0, SRCCOPY);
end;

end


Alex_C   (2014-02-18 18:51:00) [4]

так рисуем по событию - там и нет inherited.
Вообще момент этот меня интересовал давно - да все как то не до него было. А вот сейчас пробую разные варианты - итог один: рисовать на канве формы. Иначе канва формы перерисовыватся и происходит мерцание. Но ведь есть приложения, где нет мерцания - при чем написаны они на Дельфи - знаит решить эту проблему можно.


Alex_C   (2014-02-18 18:46:00) [5]

Не а :) Это никак не влияет в данном случае - это пробовал в первую очередь.


brother   (2014-02-18 18:46:00) [6]

> inherited;

может убрать? ведь все, что нужно рисуем сами?


sniknik   (2014-02-18 18:43:00) [7]

> как то можно избежать перерисовки формы "на фоне"?
procedure TForm1.FormCreate(Sender: TObject);
begin
 DoubleBuffered:= true;
...


Alex_C   (2014-02-18 18:36:00) [8]

То MBo: выходит... причем если использовать на TPaintBox - мерцание еще больше.
Вообще вопрос такой: как то можно избежать перерисовки формы "на фоне"? Вообще уже 3-й день этот "прикол" анализирую. Видел (правда очень мало) приложений, где мерцания нет вообще - т.е. значит как то можно.


MBo   (2014-02-18 18:30:00) [9]

Видимо, в inheritied Paint происходит перерисовка фона (обработка WM_ERASEBKGND)


Наверх

Титульная страница Поиск, карта сайта Написать письмо