Entwickler-Ecke

Multimedia / Grafik - GDI+ Dauernd neue Instanzen


Nano-Ware - Mo 09.07.12 17:34
Titel: GDI+ Dauernd neue Instanzen
Hey,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.FormCreate(Sender: TObject);
begin
  pen := TGPPen.Create(TGPColor.Create(255,0,0,0));
  xx:= 0; YY := 0;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  grafik := TGPGraphics.Create(Canvas.Handle);  // -> immer eine neue Instanz -.- warum, weil sonst ein GDI Fehler kommt
  pen.Color := TGPColor.Create(255,255,255,255); // andere Lösung? Flackert wie die Sau
  grafik.DrawLine(pen,0,0,XX,YY);
  pen.Color :=  TGPColor.Create(255,0,0,0);
  grafik.DrawLine(pen,0,0,X,Y);
  XX := X;
  YY := Y;

end;


Im code steht alles. Ich weiß nicht woran es liegt, aber es flackert, dass man Augenkrebs bekommt.


bummi - Mo 09.07.12 17:39

Male im OnPaint, rufe Invalidate da auf wo neu gemalt werden soll.
TGPGraphics muß ständig neu erzeugt werden weil sich das Canvas.Handle ändert
es muss aber auch wieder freigegeben werden, es sei denn Du hast die Interfaced Version.
DoubleBuffered auf True setzen.


Nano-Ware - Mo 09.07.12 17:42

http://www.bilsen.com/gdiplus/index.shtml

Ich versuche mal das mit dem OnPaint und editiere dann das hier..

EDIT: Cool habs jetzt so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  X1 := X;
  Y1 := Y;
  Invalidate;
  XX := X;
  YY := Y;

end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  grafik := TGPGraphics.Create(Canvas.Handle);  // -> immer eine neue Instanz -.- warum, weil sonst ein GDI Fehler kommt
  grafik.SmoothingMode := SmoothingModeAntiAlias;
  pen.Color :=  TGPColor.Create(255,255,255,255);
  grafik.DrawLine(pen,0,0,X1,Y1);
  pen.Color := TGPColor.Create(255,0,0,0); // andere Lösung? Flackert wie die Sau
  grafik.DrawLine(pen,0,0,XX,YY);


end;


Und es flackert sogar mit Antialiasing nicht mehr. Auf der Seite, von der ich die Lib hab steht, dass Delphi das Objekt selbstständig freigibt. Meine Methode ist jetzt relativ umständlich. Kann man das auch einfacher machen?

Außerdem, warum flackert es hier nicht? :D


EDIT2: Kann es sein, dass Invalidate immer das Canvas löscht?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
procedure TForm1.FormCreate(Sender: TObject);
begin
  pen := TGPPen.Create(TGPColor.Create(255,0,0,0));
  xx:= 0; YY := 0;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  down := true;
  X1 := X;
  Y1 := Y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Invalidate;
  XX := X;
  YY := Y;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  down := false;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  if down then
  begin
  grafik := TGPGraphics.Create(Canvas.Handle);  // -> immer eine neue Instanz -.- warum, weil sonst ein GDI Fehler kommt
  grafik.SmoothingMode := SmoothingModeAntiAlias;
  //pen.Color :=  TGPColor.Create(255,255,255,255);
  //grafik.DrawLine(pen,0,0,X1,Y1);
  pen.Color := TGPColor.Create(255,0,0,0); // andere Lösung? Flackert wie die Sau
  grafik.DrawLine(pen,X1,Y1,XX,YY);
  end;


end;


Denn die Linien sollten eigentlich erhalten bleiben.. o:


bummi - Mo 09.07.12 18:01

Die Informationen was gemalt werden soll musst Du getrennt verwalten, in Deinem Fall langen einfache Arrays.
Wenn Du persistent arbeiten willst legst Du ein TImage auf das Form (align=alClient), die Events(Mouse etc) hängts Du an das Image und als Canvas übergibst Du das Canvas des Images (angefangen haben wahrscheinlich die meisten mit Images oder Bitmaps).
Wenn Du mehr Übung hast und mit komplexeren Formen / Drehung /Zoom / Undo etc. arbeitest wirst Du wieder mit nicht persistenten HDC's arbeiten.


TomyN - Do 19.07.12 07:03

Hi,

sobald die Malaufgabe etwas komplexer wird ist es üblich, auf eine Speicherbitmap/Bild zu malen (hier eine GPBitmap) und diese dann komplett auszugeben.

Tomy