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

Вниз

Нужно рисовать схему. Канва мигает   Найти похожие ветки 

 
mOOx ©   (2005-12-25 15:22) [0]

Добрый день.

Задача: Нужно релизовать рисовалку схем (типа как в ERWin и ему подобных). Рисую просто на канве формы. При движении картинки все страшно мигает. В принципе не критично, но хотелось бы более приятно.
Посоветуйте, как это дело можно ускорить.


 
Fay ©   (2005-12-25 15:26) [1]

2 mOOx ©   (25.12.05 15:22)

А если добавить пустую
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
?


 
mOOx ©   (2005-12-25 15:37) [2]

Обязательног попробую. Просто кода под руками сейчас нет :(.

Маленький вопрос. Я когда-то слышал, что можно установить DoubleBuffered=true и мигание должно уменьшиться. Вроду установил, но все равно тоже. Так вот вопрос: а на что влияет этот buffered?


 
Fay ©   (2005-12-25 15:43) [3]

2 mOOx ©   (25.12.05 15:37) [2]
Открой Controls и иши по DoubleBuffered


 
з. танька   (2005-12-25 16:36) [4]


> mOOx ©   (25.12.05 15:37) [2]

ресуй в объекте tbitmap а потом копируй содержимое в картинку. мигать почти не будет. а есле на форме рисовать вместо имейджа - вообще замечательно.


 
Eraser ©   (2005-12-26 01:11) [5]


> Fay ©   (25.12.05 15:26) [1]

Спасапет, но не всегда.

> mOOx ©   (25.12.05 15:22)

см. з. танька   (25.12.05 16:36) [4], только "копирование" осуществляй в OnPaint, инициируй вызов с пом. InvalidateRect.


 
Eraser ©   (2005-12-26 01:11) [6]


> Eraser ©   (26.12.05 01:11) [5]

Спасапет = спасает


 
Lamer@fools.ua ©   (2005-12-26 09:08) [7]

>а на что влияет этот buffered?

Прорисовка формы и её контролов осуществляется во временном bitmap"е, а потом одной достаточно быстрой операцией этот временный bitmap выводится на экран (читать: в видеопамять).


 
Deka ©   (2005-12-26 11:37) [8]

unit Unit1;

////////////////////////////////////////////////////////////////////////////////
//Written by Dr Steve Evans (steve@lociuk.com)                                //
//You can use this code however you like providing the above credits remain   //
////////////////////////////////////////////////////////////////////////////////
//Flicker free graphics with zoom and pan functions.                          //
////////////////////////////////////////////////////////////////////////////////

interface

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

type TNode = record
    X,Y: Double;
    Scr: TPoint;
end;

type TTriangle = record
   v1,v2,v3: Integer;
end;

type
 TForm1 = class(TForm)
   ToolBar1: TToolBar;
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   Button5: TButton;
   Button6: TButton;
   procedure FormCreate(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
   procedure Button6Click(Sender: TObject);
 private
   { Private declarations }
    Nodes: array of TNode;          //an array to hold some geometric points
    Triangles: array of TTriangle;  //an array to hold some traingles
    Buffer : TBitmap;  //the buffer
    OriginX: Integer;  //used to control panning position
    OriginY: Integer;
    Zoom: Double;      //used to control the zoom
    AxisDX: Double;    //used to control centre of zoom
    AxisDY: Double;
    function ScalePoint(xp,yp: Double): TPoint;
    procedure ClearBackPage;
    procedure FlipBackPage;
    procedure RenderAll;
    procedure CalculatePoints;
    procedure DrawMesh;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
val: Single;
begin
 DoubleBuffered:=True;

 Buffer := TBitmap.Create;
 Buffer.Height := 200;
 Buffer.Width := 200;
 Zoom:= 0.5;
 AxisDX:=2;  //mesh is 4 units wide in x direction, therefore centre of zoom is 2 (halfway)
 AxisDY:=-2; //ditto above but for y direction
 OriginX:=500;
 OriginY:=350;

 //set up some geometry (a mesh) to draw later
 SetLength(Nodes,9);
 Nodes[0].X:=0; Nodes[0].Y:=-0;
 Nodes[1].X:=2; Nodes[1].Y:=-0;
 Nodes[2].X:=4; Nodes[2].Y:=-0;
 Nodes[3].X:=0; Nodes[3].Y:=-2;
 Nodes[4].X:=2; Nodes[4].Y:=-2;
 Nodes[5].X:=4; Nodes[5].Y:=-2;
 Nodes[6].X:=0; Nodes[6].Y:=-4;
 Nodes[7].X:=2; Nodes[7].Y:=-4;
 Nodes[8].X:=4; Nodes[8].Y:=-4;

 SetLength(Triangles,8);
 Triangles[0].v1:=1; Triangles[0].v2:=5; Triangles[0].v3:=4;
 Triangles[1].v1:=1; Triangles[1].v2:=2; Triangles[1].v3:=5;
 Triangles[2].v1:=2; Triangles[2].v2:=5; Triangles[2].v3:=6;
 Triangles[3].v1:=2; Triangles[3].v2:=6; Triangles[3].v3:=3;
 Triangles[4].v1:=4; Triangles[4].v2:=7; Triangles[4].v3:=8;
 Triangles[5].v1:=4; Triangles[5].v2:=8; Triangles[5].v3:=5;
 Triangles[6].v1:=8; Triangles[6].v2:=9; Triangles[6].v3:=5;
 Triangles[7].v1:=5; Triangles[7].v2:=9; Triangles[7].v3:=6;
end;

procedure TForm1.RenderAll;
begin
 ClearBackPage;     //clear the bitmap buffer
 CalculatePoints;   //do some calculations on my geometry
 DrawMesh;          //draw my geometry to the buffer
 FlipBackPage;      //copy the buffer to the forms canvas
end;

procedure TForm1.ClearBackPage;
begin
 with Buffer do
 begin
 Height:=Form1.Height;
 Width:=Form1.Width;
 Canvas.Brush.Color := clWhite;
 Canvas.FillRect(Rect(0,0,Form1.Width,Form1.Height));
 end;
end;

procedure TForm1.CalculatePoints;
var
i: Integer;
begin
 i:=0;
 while i<= High(Nodes) do
 begin
   Nodes[i].Scr:=ScalePoint(Nodes[i].X,Nodes[i].Y);
   Inc(i);
 end;
end;

procedure TForm1.DrawMesh;
var
i: Integer;
begin
 Buffer.Canvas.Brush.Color:=clYellow;

 i:=0;
 while i<= High(Triangles) do
 begin
  Buffer.Canvas.Polygon ( [ Nodes[Triangles[i].v1-1].Scr,
                            Nodes[Triangles[i].v2-1].Scr,
                            Nodes[Triangles[i].v3-1].Scr ] );
  Inc(i);
 end;
end;

procedure TForm1.FlipBackPage;
var
 ARect : TRect;
begin
 ARect.Left:=0;
 ARect.Top:=0;
 ARect.Right:=Form1.Width;
 ARect.Bottom:=Form1.Height;
 Form1.Canvas.CopyRect(ARect, Buffer.Canvas, ARect);
end;

function TForm1.ScalePoint(xp,yp: Double): TPoint;
begin
 Result.X:=OriginX + Round((xp-AxisDX) *   200*Zoom);
 Result.Y:=OriginY + Round((yp-AxisDy) * - 200*Zoom);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 RenderAll;
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
 Zoom:=Zoom*1.1;
 Refresh;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Zoom:=Zoom*0.9;
 Refresh;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 OriginX:=OriginX-5;
 Refresh;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 OriginX:=OriginX+5;
 Refresh;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 OriginY:=OriginY-5;
 Refresh;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 OriginY:=OriginY+5;
 Refresh;
end;

end.


 
Deka ©   (2005-12-26 11:52) [9]

Немного длинновато и файла проекта не хватает, но я думаю что это не проблема. Есть простор для оптимизации, а главное - дейстительно не мерцает! Использую этот прием во всех проектах со сложной отрисовкой.



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

Форум: "Основная";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.04 c
15-1136703230
Vitaliy14
2006-01-08 09:53
2006.01.29
Фильтрация изображений


3-1133430299
atruhin
2005-12-01 12:44
2006.01.29
Помогите оптимизировать запрос. Firebird


8-1122894253
all_
2005-08-01 15:04
2006.01.29
Получение свойств файла


4-1132257397
pohil
2005-11-17 22:56
2006.01.29
Работа с PE-заголовками


15-1136505135
BiggieSmalls
2006-01-06 02:52
2006.01.29
Проследить запрос серийного номера тома





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский