Ich habe einen Plotter für mathematische Funktionen programmiert und möchte nun mit einem Punkt oder einer Linie über den Graph fahren. Dabei soll dieser aber nicht verändert werden. Wie kann ich dieses Problem lösen ? Danke für Eure Antworten
Announcement
Collapse
No announcement yet.
wie kann man einen seperaten Layer programmieren ?
Collapse
X
-
Ich habe mit der Komponente TImage32 rumgebastelt und eine Lösung erarbeitet. Eine einfache Variante dieser Lösung könnt Ihr unten aufgelistet sehen. Das Beispiel zeigt wie auf einem TImage eine Ellipse gezeichnet wird über die dann jeweils eine waagerechte und eine senkrechte rote Linie bewegt werden kann. Die senkrechte und die waagerechte Linie befinden sich jeweils in einem eigenen Layer.
Erstellt wurde der Source mit Delphi 5 unter Verwendung der Komponente TImage32. Diese Komponenten sind erhältlich unter http://sourceforge.net/projects/graphics32 . Nochmals Danke an Dietmar Elsässer.
<PRE>
unit Unit1;
<p>
interface
<p>
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, GR32_Image, GR32, GR32_Layers;
<p>
type
TForm1 = class(TForm)
Image1: TImage32;
procedure FormActivate(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer; Layer: TCustomLayer);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
<p>
var
Form1: TForm1;
<p>
implementation
<p>
{$R *.DFM}
<p>
procedure TForm1.FormActivate(Sender: TObject);
var
ALayer: TBitmapLayer;
L: TFloatRect;
<p>
h: Integer;
w: Integer;
begin
Image1.SetupBitmap;
Image1.BeginUpdate;
Image1.Bitmap.Clear(clWhite);
<p>
h := Image1.Height;
w := Image1.Width;
<p>
//Wir malen einen Kreis
Image1.Bitmap.Canvas.Ellipse(h div 2, w div 2, 70, 20);
<p>
// Einen neuen Layer kreieren...
ALayer := TBitmapLayer.Create(Image1.Layers);
with ALayer do
begin
// In die Mitte setzen
<p>
L.Left := h div 2;
L.Top := 0;
L.Right := L.Left + 1;
L.Bottom := h;
ALayer.Location := L;
<p>
ALayer.Bitmap.Create;
ALayer.Bitmap.SetSize(1,h);
Alayer.Bitmap.DrawMode := dmBlend;
Alayer.Bitmap.MasterAlpha := 180;
ALayer.Bitmap.Clear(clWhite32);
Alayer.Bitmap.VertLineT(0,0,h,clRed32);
end;
<p>
// Einen weiteren Layer kreieren...
ALayer := TBitmapLayer.Create(Image1.Layers);
with ALayer do
begin
// In die Mitte setzen
<p>
L.Left := 0;
L.Top := w div 2;
L.Right := w;
L.Bottom := L.Top + 1;
ALayer.Location := L;
<p>
ALayer.Bitmap.Create;
ALayer.Bitmap.SetSize(w,1);
Alayer.Bitmap.DrawMode := dmBlend;
Alayer.Bitmap.MasterAlpha := 180;
ALayer.Bitmap.Clear(clWhite32);
Alayer.Bitmap.HorzLineT(0,0,w,clRed32);
end;
<p>
Image1.EndUpdate;
end;
<p>
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer; Layer: TCustomLayer);
var
ALayer: TBitmapLayer;
L: TFloatRect;
begin
Image1.BeginUpdate;
L.Left := X;
L.Top := 1;
L.Right := X+1;
L.Bottom := Image1.Height;
ALayer:=TBitmapLayer(Image1.Layers[0]);
ALayer.Location:=L;
<p>
L.Left := 1;
L.Top := Y;
L.Right := Image1.Width;
L.Bottom := Y+1;
ALayer:=TBitmapLayer(Image1.Layers[1]);
ALayer.Location:=L;
<p>
Image1.EndUpdate;
Image1.Invalidate;
end;
<p>
end.
</PRE>
Fragen hierzu beantworte ich gerne.
Josef Göckle
Comment
Comment