Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как избавиться от двойной прорисовке окна [D7, WinXP]


Страницы:   1 2

Дмитрий_05 ©   (2005-08-21 18:20:00) 

Проблема заключается в следующем... У меня на Form.Canvas рисуется изображение... При программном изменении размера окна форма перерисовывается, а потом приходится еще раз перерисовывать. Получается так, что при уменьшении Form.Left, изображение сначала прыгает влево, а потом рисуется как надо...:

var
BMPMain: TBitmap;

procedure TForm1.WMEraseBkGnd(var Msg: TWMERASEBKGND);
begin
BitBlt(Msg.DC, 0, 0, Form1.ClientWidth, Form1.ClientHeight, BMPMain.Canvas.Handle, 0, 0, SRCCOPY);
Msg.Result := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
...
BoundsRect := WRect;
GenerateBMPMain; //функция генерирует изображение под размеры окна
Form1.Invalidate; //перерисовываем форму, точнее рисуем сгенерированное изображение на Form.Canvas
end;


Как бы мне от этого избавиться?


KilkennyCat   (2005-08-23 00:30:00) [21]

ок.

добавил еще

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
 AnimateWindow(Handle, 50, AW_BLEND or AW_HIDE);
 AnimateWindow(Handle, 50, AW_BLEND);
 FormResize(Sender);
end;


Опять все нормально, ничего не прыгает, ничего не исчезает...


Дмитрий_05   (2005-08-23 00:18:00) [22]

исчезает почему-то при использовании функции AnimateWindow...


KilkennyCat   (2005-08-22 23:40:00) [23]

кинул на форму тулбар, и как хранитель картинки TImage (visible=false).

написал следующее:

procedure TForm1.FormResize(Sender: TObject);
begin
stretchblt(canvas.Handle,0,0,width,height,image1.Canvas.Handle,0,0,640,480,srccopy);
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
 left := 20;
 width := 500;
 FormResize(sender);
end;

procedure TForm1.ToolButton3Click(Sender: TObject);
begin
 height := 800;
 top := 40;
 FormResize(sender);
end;


Ничего не прыгает, ничего не исчезает...


Турист   (2005-08-22 23:19:00) [24]

Турист   (21.08.05 23:05) [7]


Дмитрий_05   (2005-08-22 22:59:00) [25]

Ау!


Дмитрий_05   (2005-08-22 11:41:00) [26]

P.S. Вот когда наведешь курсором на кнопку, когда она исчезнет, где она должна быть, кнопка появляется...


Дмитрий_05   (2005-08-22 11:39:00) [27]

Немного переделал, вроде нормально сейчас... А чтоб вообще не прыгало сделал с исчезновением и появлением формы. Но теперь у меня почему-то кнопки(TButton) стали пропадать при изменении размера окна, почему? Сделал я вот как:

procedure TForm1.FormPaint(Sender: TObject);
begin
BitBlt(Form1.Canvas.Handle, 0, 0, WRect.Right, WRect.Bottom, BMPMain.Canvas.Handle, 0, 0, SRCCOPY);
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
...
AnimateWindow(Form1.Handle, 50, AW_BLEND or AW_HIDE); //форма исчезает
GenerateBMPMain;
Form1.Invalidate;
BoundsRect := WRect;
AnimateWindow(Form1.Handle, 50, AW_BLEND); //форма появляется
end;


Турист   (2005-08-21 23:05:00) [28]

>Дмитрий_05  
Без тестового кода, демонстрирующего проблему, как-то сложно


Дмитрий_05   (2005-08-21 22:02:00) [29]

Всеравно "прыгает" изображение при программном изменении размера окна, когда Form.Leftизменяется в меньшую сторону... Получается так, когда форма поменяет размер, т.е. BoundsRect := WRect;выполнитля, и т.к. Form.Leftуменьшится то изображение какое было нарисуется с новыми координатами... а потом когда выполнится FormResizeперерисовывается еще раз, но уже нормально...
Сделал так:

procedure TForm1.Button1Click(Sender: TObject);
begin
...
BoundsRect := WRect;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
BitBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, BMPMain.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
GenerateBMPMain;
Repaint;
end;

А вот как сделать чтобы не прыгало ума не приложу...


Дмитрий_05   (2005-08-21 21:39:00) [30]

У меня изображение немного по другому создается, которое надо нарисовать на форме... Stretch не поможет...


Alexander Panov   (2005-08-21 19:13:00) [31]

втоматически будт перерисованы только области, которые либо были перекрыты до этого, либо появившиеся области клиентскогй области, появившиеся в результате измененияя размеров окна.


KilkennyCat   (2005-08-21 18:49:00) [32]


> [1] Alexander Panov ©   (21.08.05 18:33)


Разве ресайз не вызовет перерисовку автоматически?


Юрий Зотов   (2005-08-21 18:40:00) [33]

> Дмитрий_05   (21.08.05 18:20)

Выкиньте все (включая GenerateBMPMain) и напишите StretchBlt в обработчике события OnPaint. Больше ничего не надо.


Alexander Panov   (2005-08-21 18:33:00) [34]

Прорисовка на канве формы должна быть в  OnRepaint:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormPaint(Sender: TObject);
   procedure FormResize(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
begin
   with TForm(Sender) do
   begin
       Canvas.Brush.Color := clGreen;

       Canvas.Ellipse(
           20,
           20,
           TForm(Sender).ClientWidth-20,
           TForm(Sender).Clientheight-20);
   end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
   Repaint;
end;

end.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо