Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.25;
Скачать: CL | DM;

Вниз

Мастера столкнулся с такой проблемой   Найти похожие ветки 

 
Style ©   (2004-02-05 11:37) [0]

Унаследовался от TCustomControl, описал единственную абстрактную процедуру Paint, так вот почему на Resize компонента, происходит какаято непонятная очистка и короче появляется явное мерцание именно при изменении размера контрола? Проверял другие компоненты унаследованные от TCustomControl из вкладки Samples, точно такая же проблемма к примеру ColorGrid.
В то же время TDrawGrid - не моргает, а TDBGrid мерцает но не очень сильно... Как его устранить - это мерцание?


 
panov ©   (2004-02-05 11:42) [1]

Ну как обычно - знаешь, наверное, в какой строке ошибка бывает?


 
_none_ ©   (2004-02-05 11:50) [2]

to [Style] doublebuffered := true; controlstyle := controlstyle + [csopaque];


 
Style ©   (2004-02-05 11:58) [3]

Ну возмите к примеру TColorGrid кинте его на форуму, выделите кго мышью затем зажмите клавишу Shift и курсор вниз к примеру и увидите явное мерцание.
Вот интересно почему у многих компонентов оно присудствует?
А например у TDrawGrid его нет.

Если например я делаю doublebuffered := true то мерцание исчезает, но вот у TDrawGrid нет флага DoubleBuffered по уммолчанию и у наследников вроде тоже TCustomGrid -> TCustomControl.. дык он и не мерцает.


 
Style ©   (2004-02-05 12:20) [4]

Ну к примеру такой код
унаследуюсь от TWinControl, затем опишу то же самое что содержит TCustomControl, только добавлю еще некую абстрактную Канву которая уже будет создаваться у наследника моего класса:

TAbstractControl = class(TWinControl)
private
FCanvas: TCanvas;

procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

procedure SetCanvas(Canvas: TCanvas); virtual; abstract;
function GetCanvas: TCanvas; virtual; abstract;

{ Private declarations }
protected
procedure PaintWindow(DC: HDC); override;
property Canvas: TCanvas read FCanvas;

property AbstractCanvas: TCanvas read GetCanvas write SetCanvas;
{ Protected declarations }
public
procedure Paint;

constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

{ Public declarations }
published
{ Published declarations }
end;

//***********************//

TMyControl = class(TAbstractControl)
private
FBackCanvas: TCanvas;

{ Private declarations }
protected
property BackCanvas: TCanvas read FBackCanvas;

{ Protected declarations }
public

constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

{ Public declarations }
published
{ Published declarations }
end;

//***********************//

constructor TAbstractControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csOpaque];
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;

destructor TAbstractControl.Destroy;
begin
FCanvas.Free;
inherited Destroy;
end;

procedure TAbstractControl.Paint;
begin
BitBlt(Canvas.Handle,0,0,Width,Height,AbstractCanvas.Handle,0,0,SRCCOPY);
end;

procedure TAbstractControl.WMPaint(var Message: TWMPaint);
begin
ControlState := ControlState + [csCustomPaint];
inherited;
ControlState := ControlState - [csCustomPaint];
end;

procedure TAbstractControl.PaintWindow(DC: HDC);
begin
FCanvas.Lock;
try
FCanvas.Handle := DC;
try
TControlCanvas(FCanvas).UpdateTextFlags;
Paint;
finally
FCanvas.Handle := 0;
end;
finally
FCanvas.Unlock;
end;
end;

//***********************//

constructor TMyControl.Create(AOwner: TComponent);
begin
inherited Create(Aowner);
FBackCanvas := TCanvas.Create;
SetCanvasSize;
end;

destructor TMyControl.Destroy;
begin
BackCanvas.Free;
inherited Destroy;
end;

procedure TMyControl.SetCanvas(Canvas: TCanvas);
begin
FBackCanvas.Assign(Canvas);
end;

function TMyControl.GetCanvas: TCanvas;
begin
result := FBackCanvas;
end;

procedure TMyControl.SetCanvasSize;
begin
//Инициализируем канву
end;


Ну думаю смысл понятен, т.е. doublebuffered здесь не нужен вообще, дык чего же так все мерцает?? Всего-то выполняется один BitBlt;

Вот к примеру если убрать inherited здесь..

procedure TAbstractControl.WMPaint(var Message: TWMPaint);
begin
ControlState := ControlState + [csCustomPaint];
// inherited;
ControlState := ControlState - [csCustomPaint];
end;

то будет явно видно как Происходит закраска Окна контрола цветом Brush.

Блин ну как ее отключить.


 
_none_ ©   (2004-02-05 12:28) [5]

надо перехватить wm_erasebackground,
это делается так:
controlstyle := controlstyle + [csopaque];
либо отловом сообщения


 
Style ©   (2004-02-05 12:37) [6]

Я же написал там :(

ControlStyle := ControlStyle + [csOpaque];

На счет wm_erasebackground спасибо, ща попробую.


 
Style ©   (2004-02-05 12:48) [7]

Все спасибо просто нужно было перехватить wm_EraseBkgnd и
ничего там неделать.


 
_none_ ©   (2004-02-05 12:52) [8]

to [Style] ну ошибся с написанием -)


 
Nous Mellon ©   (2004-02-05 13:03) [9]


> TDrawGrid нет флага DoubleBuffered по уммолчанию и у наследников
> вроде тоже TCustomGrid -> TCustomControl.. дык он и не мерцает.

Не до конца разобрался в твоей ситуевине, но могу сказать что если например TIMage часто меняет свое изображение и к примеру лежит на панели то чтобы не мигало флаг doublebuffered надо оправдивить у самой панели а у имага сего флага нет..


 
MBo ©   (2004-02-05 13:10) [10]

>Nous Mellon
>флаг doublebuffered надо оправдивить у самой панели
О чем недвусмысленно написано в хелпе по DoubleBuffered


 
Style ©   (2004-02-05 13:11) [11]

Но в моем случае - я сам делаю этот DoubleBuffered :)


 
Nous Mellon ©   (2004-02-05 13:23) [12]


> Но в моем случае - я сам делаю этот DoubleBuffered :)

А зачем велосипед изобретать? Если конечно имеется возможность этого не делать
> О чем недвусмысленно написано в хелпе по DoubleBuffered

А я написал двусмысленно? :)


 
Style ©   (2004-02-05 13:29) [13]

Nous Mellon ©
->
Да нет просто интересно, вместо BackCanvas можно будет подставлять любую другую канву, к примеру DIB.Canvas. К тому же в компоненте всегда будут доступны два буфера.
Это небольшой эксперемент.


 
Nous Mellon ©   (2004-02-05 13:31) [14]


> Это небольшой эксперемент.

Пытливый ум :)



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

Текущий архив: 2004.02.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
4-80353
Kinderr
2003-12-20 15:42
2004.02.25
Диалог


1-79763
@G
2004-02-11 17:52
2004.02.25
Защита файла


3-79622
Rule
2004-02-01 21:22
2004.02.25
Нада создать скриптом базу данных на локальной машине


1-79857
Builder
2004-02-09 23:13
2004.02.25
Формы в dlls


1-79754
RUS
2004-02-12 09:58
2004.02.25
Определение завершения процесса?