Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий_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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.067 c
1-1125497772
Карелин Артем
2005-08-31 18:16
2005.09.25
Константа - массив записей. Как делать?


1-1125328300
nitrino
2005-08-29 19:11
2005.09.25
Unicode


2-1124020715
Андрей Молчанов
2005-08-14 15:58
2005.09.25
Модалное окно с продолжением работы


5-1100244969
Суслик
2004-11-12 10:36
2005.09.25
Runtime package


14-1125585884
Anat
2005-09-01 18:44
2005.09.25
FORTRAN -> DELPHI





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский