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

Вниз

Полная перерисовка окна   Найти похожие ветки 

 
leron ©   (2009-09-28 20:08) [0]

При ресайзе, несмотря на полную перерисовку окна в обработчике onpaint, перерисовывается только правая и нижняя часть. Подскажит, полажуйста, как сделать так, чтобы форма перерисовывалась целиком?


 
Юрий Зотов ©   (2009-09-28 20:16) [1]

Ответ тривиальный - надо написать код перерисовки так, чтобы он не мешал форме перерисовываться целиком.

Если бы еще его видеть, этот код, то можно было бы и что-то более конкретное посоветовать...


 
leron ©   (2009-09-28 20:16) [2]

procedure TForm1.FormPaint(Sender: TObject);
var
 width, height: integer;
 Rect: TRect;
begin
height:= self.ClientHeight;
width:= self.ClientWidth;

Rect.Left:=0; Rect.Top:=0;
Rect.Right:= width; Rect.Bottom:= height;
self.Canvas.Brush.Color:= clWhite;
self.Canvas.FillRect(Rect);

Rect.Top:=height div 2 - 50; Rect.Bottom:= height div 2 + 50;
self.Canvas.Brush.Color:= clBlack;
self.Canvas.FillRect(Rect);

Rect.Top:= height div 2 - 45; Rect.Bottom:= height div 2 + 45;
self.Canvas.Brush.Color:= clSkyBlue;
self.Canvas.FillRect(Rect);

Rect.Top:= height div 2 - 25; Rect.Bottom:= height div 2 + 25;
self.Canvas.Brush.Color:= clBlue;
self.Canvas.FillRect(Rect);
end;


 
leron ©   (2009-09-28 20:17) [3]

Ответ тривиальный - надо написать код перерисовки так, чтобы он не мешал форме перерисовываться целиком.

Скажу честно, не очень понял.


 
Юрий Зотов ©   (2009-09-28 20:32) [4]

> leron ©   (28.09.09 20:17) [3]

Добавьте еще два обработчика событий:

procedure TForm1.FormCreate(Sender: TObject); // OnCreate
begin
 DoubleBuffered := True
end;

procedure TForm1.FormResize(Sender: TObject); // OnResize
begin
 Invalidate
end;


 
leron ©   (2009-09-28 20:33) [5]

Проблема разрешилась:
procedure TForm1.FormResize(Sender: TObject);
begin
self.Repaint;
end;


Теперь другой вопрос. Что же тогда происходило, когда я этого не добавлял? Вызывался обработчик onpaint, но выводились только те пиксели, которые лежат в только что появившейся области?


 
leron ©   (2009-09-28 20:35) [6]

procedure TForm1.FormResize(Sender: TObject); // OnResize
begin
Invalidate
end;

Спасибо, работает. Пошел гуглить про invalidate


 
Юрий Зотов ©   (2009-09-28 20:52) [7]

> leron ©   (28.09.09 20:33) [5]

1. Repaint вызывает принудительную перерисовку, а Invalidate только дает запрос на нее - система сама решает, когда окно нужно перерисовать. И пусть себе решает, она сделает все правильно, не нужно ее грузить принудиловкой.

2. С DoubleBuffered будет меньше моргать.

> Что же тогда происходило, когда я этого не добавлял? Вызывался
> обработчик onpaint, но выводились только те пиксели, которые лежат в
> только что появившейся области?

Да. Так устроена перерисовка окон в Windows - чтобы меньше рисовать. Посмотрите описание функции InvalidateRect в справке по WinAPI.


 
Юрий Зотов ©   (2009-09-28 20:54) [8]

> leron ©   (28.09.09 20:33) [5]

Не нужно везде писать Self, это только лишняя долбежка по клаве. Self и так подразумевается по умолчанию.


 
faiwer ©   (2009-09-29 11:43) [9]

Юрий Зотов "self." выводит список свойств и полей :D Очень удобно когда на форме более 200 компонент ;)


 
{RASkov} ©   (2009-09-29 11:48) [10]

> [9] faiwer ©   (29.09.09 11:43)

попробуй нажать CTRL+SPACE на пустом месте, где дожен быть self и увидишь тоже самое...


 
faiwer ©   (2009-09-29 11:52) [11]

{RASkov}, о, работает. шикарно ) tnx



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
1-1208019148
TIF
2008-04-12 20:52
2009.11.15
Свойство DropDownCount в ComboBox по Vista


2-1254305859
Fr
2009-09-30 14:17
2009.11.15
Кнопка в TWebBrowser


1-1224850134
SteadyGo
2008-10-24 16:08
2009.11.15
Отключение прокрутки компанента ScrollBox в начальное положение


15-1252835080
Kerk
2009-09-13 13:44
2009.11.15
[FreeBSD] Too many open files


2-1254139608
dplz
2009-09-28 16:06
2009.11.15
Прозрачный color на label е, возможно?