Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

перерисовка TCustomControl

13K
24 мая 2006 года
skypark
7 / / 04.11.2005
Помогите кто знает.
Что-то не разберусь с перерисовкой перекрытых объектов.
Вот создал свой компонент типа

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 вызывается, и в нём написано, что прорисовывать нужно всю панель целиком, почемуто прорисовывается не вся панель, а только та её часть, которая была закрыта.
А мне нужно, чтобы прорисовывалась вся панель! Как этого добиться?
12K
26 мая 2006 года
phoenix_87
20 / / 01.02.2006
Цитата:
Originally posted by skypark

....
НО если панель обновлять не полность (например если я её сверху частично перекрыл другим окном, а потом открыл), то хотя метод Paint вызывается, и в нём написано, что прорисовывать нужно всю панель целиком, почемуто прорисовывается не вся панель, а только та её часть, которая была закрыта.
А мне нужно, чтобы прорисовывалась вся панель! Как этого добиться?



Все верно, винда всегда перерисовует те области, которые отмечены для перерисовки. Если мы например, перекрываем часть окна, то она в последствии и помечается как область на перерисовку, не всё окно. А в твоем методе Paint просто вызывается стандартный метод (который также подчиняется этим законам) и прорисовуется несколько линий.
Следовательно нужно просто пометить все окно, как область, требующую перерисовку.
Это API-шная функция InvalidateRgn или InvalidateRect - там в параметрах должен быть хэндл окна (тут MyPanel.Handle) и указатель на координаты самой области. Глянь справку, по-моему если вместо него поставить nil - это равносильно всему доступному пространству окна.

13K
05 июня 2006 года
skypark
7 / / 04.11.2005
[QUOTE=phoenix_87]
Следовательно нужно просто пометить все окно, как область, требующую перерисовку.
Это API-шная функция InvalidateRgn или InvalidateRect - там в параметрах должен быть хэндл окна (тут MyPanel.Handle) и указатель на координаты самой области. Глянь справку, по-моему если вместо него поставить nil - это равносильно всему доступному пространству окна.[/QUOTE]

А где нужно вызывать эту функцию?
Если это делать в методе Paint, то винда зацикливается на прорисовке.
А где тогда нужно задавать это окно для прорисовки?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог