перерисовка TCustomControl
Что-то не разберусь с перерисовкой перекрытых объектов.
Вот создал свой компонент типа
TMyPanel = class (TcustomControl)
protected
procedure Paint; override;
end;
В процедуре Paint просто случайным образом рисую несколько линий.
procedure TMyPanel.Paint;
var
dx,x1,y1:integer;
r:TRect;
begin
inherited Paint;
Randomize;
x1:=round( random(5)+3 );
y1:=round( random(ClientHeight) );
Canvas.MoveTo(x1,y1);
repeat
x1:=x1+round(random(5)+3);
y1:=round( random(ClientHeight) );
Canvas.LineTo(x1,y1);
until (x1>ClientWidth);
end;
Все нормально заcreatил его на форме. Все заработало, компонент прорисовался. Когда окно формы сворачиваю, разворачиваю панель прекрасно перерисовывается.
НО если панель обновлять не полность (например если я её сверху частично перекрыл другим окном, а потом открыл), то хотя метод Paint вызывается, и в нём написано, что прорисовывать нужно всю панель целиком, почемуто прорисовывается не вся панель, а только та её часть, которая была закрыта.
А мне нужно, чтобы прорисовывалась вся панель! Как этого добиться?
Цитата:
Originally posted by skypark
....
НО если панель обновлять не полность (например если я её сверху частично перекрыл другим окном, а потом открыл), то хотя метод Paint вызывается, и в нём написано, что прорисовывать нужно всю панель целиком, почемуто прорисовывается не вся панель, а только та её часть, которая была закрыта.
А мне нужно, чтобы прорисовывалась вся панель! Как этого добиться?
....
НО если панель обновлять не полность (например если я её сверху частично перекрыл другим окном, а потом открыл), то хотя метод Paint вызывается, и в нём написано, что прорисовывать нужно всю панель целиком, почемуто прорисовывается не вся панель, а только та её часть, которая была закрыта.
А мне нужно, чтобы прорисовывалась вся панель! Как этого добиться?
Все верно, винда всегда перерисовует те области, которые отмечены для перерисовки. Если мы например, перекрываем часть окна, то она в последствии и помечается как область на перерисовку, не всё окно. А в твоем методе Paint просто вызывается стандартный метод (который также подчиняется этим законам) и прорисовуется несколько линий.
Следовательно нужно просто пометить все окно, как область, требующую перерисовку.
Это API-шная функция InvalidateRgn или InvalidateRect - там в параметрах должен быть хэндл окна (тут MyPanel.Handle) и указатель на координаты самой области. Глянь справку, по-моему если вместо него поставить nil - это равносильно всему доступному пространству окна.
Следовательно нужно просто пометить все окно, как область, требующую перерисовку.
Это API-шная функция InvalidateRgn или InvalidateRect - там в параметрах должен быть хэндл окна (тут MyPanel.Handle) и указатель на координаты самой области. Глянь справку, по-моему если вместо него поставить nil - это равносильно всему доступному пространству окна.[/QUOTE]
А где нужно вызывать эту функцию?
Если это делать в методе Paint, то винда зацикливается на прорисовке.
А где тогда нужно задавать это окно для прорисовки?