Форум: "Потрепаться";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизМастера столкнулся с такой проблемой Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c