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