
17.03.2015, 19:58
|
 |
Начинающий
|
|
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
|
|
При рисовании по событию OnResize программа зависает. Эту проблему решает процедура Sleep. Можете ещё что-нибудь порекомендовать или использование процедуры Sleep то что надо?
Код:
unit Unit1;
// Form1.Anchors = [akLeft,akTop,akRight,akBottom]
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Unit2;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Thread1 := TThread1.Create
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Thread1.Suspended := False; // запускаем итерацию рисования
Sleep(10)
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
BitBlt(Form1.PaintBox1.Canvas.Handle, 0, 0, Bitmap1.Width, Bitmap1.Height,
Bitmap1.Canvas.Handle, 0, 0, SrcCopy) // копируем изображение из Bitmap1 в PaintBox1
end;
end.
Код:
unit Unit2;
interface
uses
System.Classes, Vcl.Graphics;
type
TThread1 = class(TThread)
protected
procedure Execute; override;
end;
var
Thread1: TThread1;
Bitmap1: TBitmap;
implementation
uses
Unit1;
procedure TThread1.Execute;
begin
Bitmap1.Canvas.Lock; // блокируем холст от других потоков
repeat
Bitmap1.SetSize(Form1.PaintBox1.Width, Form1.PaintBox1.Height); // определяем размер изображения (создаём его)
Form1.PaintBox1Paint(Nil); // передаём изображение в PaintBox1
Thread1.Suspended := True // приостанавливаем поток
until Thread1.Terminated
end;
initialization
Bitmap1 := TBitmap.Create
finalization
Bitmap1.Canvas.Unlock; // разблокируем холст
Bitmap1.Free
end.
|