Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-79877
Leech
2004-02-10 12:03
2004.02.25
нужна структура наподобие массивов....


9-79530
Дмитрий Белькевич
2003-08-04 04:06
2004.02.25
Как найти расстояние от точки до эллипса?


1-79880
Тфьу
2004-02-10 11:29
2004.02.25
Как создать свою кнопку в тулбаре виндоуса (Не трее, а тулбаре!)


4-80372
Jack
2003-12-10 17:57
2004.02.25
Странности с хуком


14-80254
asp
2004-02-04 16:07
2004.02.25
Internet на работе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский