![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избавиться от двойной прорисовке окна [D7, WinXP]
Дмитрий_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.