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

Вниз

Как избавиться от двойной прорисовке окна   Найти похожие ветки 

 
Дмитрий_05   (2005-08-21 18:20) [0]

Проблема заключается в следующем... У меня на 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;


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


 
Alexander Panov ©   (2005-08-21 18:33) [1]

Прорисовка на канве формы должна быть в  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.


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

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

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


 
KilkennyCat ©   (2005-08-21 18:49) [3]


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


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


 
Alexander Panov ©   (2005-08-21 19:13) [4]

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


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

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


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

Всеравно "прыгает" изображение при программном изменении размера окна, когда 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;

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


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

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


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

Немного переделал, вроде нормально сейчас... А чтоб вообще не прыгало сделал с исчезновением и появлением формы. Но теперь у меня почему-то кнопки(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;


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

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


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

Ау!


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

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


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

кинул на форму тулбар, и как хранитель картинки 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;


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


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

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


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

ок.

добавил еще

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:30) [15]

Вот грубый пример, на форму кинул кнопку и создал на нее событие:

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

Кнопка исчезает... И почему???


 
KilkennyCat ©   (2005-08-23 00:41) [16]

а... понятно.

Используйте SpeedButton.


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

И правда не исчезает...)))


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

А... оказывается этот глюк не только с TButton, а со многими компонентами... У Edit-а и Memo исчезают бордюры, другие еще пока не смотрел... Что-то меня разочаровала эта функция... Есть ли какойнибудь аналог ей?


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

А... оказывается этот глюк не только с TButton, а со многими компонентами... У Edit-а и Memo исчезают бордюры, другие еще пока не смотрел... Что-то меня разочаровала эта функция... Есть ли какойнибудь аналог ей?


 
Defunct ©   (2005-08-23 01:04) [20]

Дмитрий_05

Почему вы всегда со всем соглашаетесь?
Думал спросите:

А в чем отличие спид батона, от обычного батона? :)
А можно вместо батона использовать ну... хлеб например, или булку?

:)


 
KilkennyCat ©   (2005-08-23 01:17) [21]


> [20] Defunct ©   (23.08.05 01:04)


я тоже так думал :)


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

Большая разница... родительские классы разные... у TButton - TButtonControl, а он в свою очередь наследник TWinControl, а у TSpeedButton - TGraphicControl. Вот с TGraphicControl функция вроде как нормально работает, а с TWinControl неочень...(((


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

Я что-то так никак не разберусь почему они исчезают... Есть ли какойнибудь другой способ плавного исчезновения, а потом появления формы?


 
Турист   (2005-08-23 20:32) [24]

>Дмитрий_05   (23.08.05 15:08) [23]

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if FDelta > 0 then begin
   if AlphaBlendValue + FDelta < 255 then
     AlphaBlendValue := AlphaBlendValue + FDelta
   else begin
     AlphaBlendValue := 255;
     FDelta := - FDelta
   end
 end else begin
   if AlphaBlendValue + FDelta > 0 then
     AlphaBlendValue := AlphaBlendValue + FDelta
   else begin
     AlphaBlendValue := 0;
     FDelta := -FDelta
   end
 end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled := True
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FDelta := 10;
 Timer1.Interval := 100;
end;


 
Турист   (2005-08-23 20:35) [25]

AlphaBlend = True


 
KilkennyCat ©   (2005-08-23 23:07) [26]


> [24] Турист   (23.08.05 20:32)


Вау!

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


 
Турист   (2005-08-23 23:16) [27]

>KilkennyCat ©   (23.08.05 23:07) [26]
Поясни, пожалуйста


 
KilkennyCat ©   (2005-08-24 01:30) [28]

Когда нам нужно иметь эффект, мы делаем скриншот области формы, и рабочего стола под формой. Далее форму убиваем, оставляя на ее месте только ее картинку. Любым эффектом меняем ее с картинкой рабочего стола. По окончании эффекта восстанавливаем (или убиваем) форму в нормальное состояние. Идея не нова, даже компонент где-то видел. Преимущество: работа в вин 9х, нет дерганья, как в Вашем варианте (на старых машинах заметно), и особенный плюс - целая гамма эффектов. Посмотрите компонент PicShow: http://www.delphiarea.com/products/picshow/


 
Турист   (2005-08-24 07:26) [29]

>KilkennyCat ©   (24.08.05 01:30) [28]
Вы видимо хорощо в этом разбираетесь, если не затруднит, Ваш вариант, аналогичный Турист   (23.08.05 20:32) [24]

Посмотреть PicShow я могу, только вот не пойму зачем ?


 
KilkennyCat ©   (2005-08-24 08:08) [30]


>  если не затруднит, Ваш вариант

вечером. спать пошел. или днем, если опять нихрена спать не дадут.


 
Дмитрий_05   (2005-08-25 08:10) [31]

KilkennyCat не пропадай...


 
KilkennyCat ©   (2005-08-25 08:50) [32]

:) сейчас, еще немного осталось ;)


 
Дмитрий_05   (2005-08-26 19:51) [33]

KilkennyCat совсем пропал куда-то...(((


 
Дмитрий_05   (2005-08-29 15:08) [34]

KilkennyCat ау!!!



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

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

Наверх




Память: 0.55 MB
Время: 0.047 c
8-1115977682
Артём
2005-05-13 13:48
2005.09.25
BASSPlayer


1-1125766063
KLAUS
2005-09-03 20:47
2005.09.25
ListBox1.Items.Strings


14-1125176295
default
2005-08-28 00:58
2005.09.25
Восстановление прежнего варианта файла


14-1125743451
lookin
2005-09-03 14:30
2005.09.25
Печень просит подаянья....


1-1125579886
All2000
2005-09-01 17:04
2005.09.25
dll и callback