Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Вниз

Событие OnPaint для компонентов   Найти похожие ветки 

 
Alex_C   (2014-02-18 18:03) [0]

Берем пустую форму. В памяти на битмапе рисуем что-то. Далее на событие формы 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 и рисуем на панели так же как и на форме - есть мерцание. Причем при мерцании "вылазит" цвет формы.

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


 
MBo ©   (2014-02-18 18:30) [1]

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


 
Alex_C   (2014-02-18 18:36) [2]

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


 
sniknik ©   (2014-02-18 18:43) [3]

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


 
Alex_C   (2014-02-18 18:46) [4]

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


 
brother ©   (2014-02-18 18:46) [5]

> inherited;

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


 
Alex_C   (2014-02-18 18:51) [6]

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


 
Andy BitOff ©   (2014-02-18 23:51) [7]

Не вижу никакого мелькания. Причем даже если 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


 
brother ©   (2014-02-19 07:52) [8]

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

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

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


 
icWasya ©   (2014-02-19 09:47) [9]

Лучше так

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.045 c
15-1416469605
alexdn
2014-11-20 10:46
2015.09.10
Фотохостинг


11-1217501243
KOLBOSS
2008-07-31 14:47
2015.09.10
EnumAllKeys


2-1395057166
Вова
2014-03-17 15:52
2015.09.10
Работа функции CharInSet


15-1417080359
alexdn
2014-11-27 12:25
2015.09.10
Приложение для андроид


15-1418506204
Юрий
2014-12-14 00:30
2015.09.10
С днем рождения ! 14 декабря 2014 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский