Autor Beitrag
Nano-Ware
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Mo 09.07.12 17:34 
Hey,

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Mo 09.07.12 17:42 
www.bilsen.com/gdiplus/index.shtml

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

EDIT: Cool habs jetzt so:
ausblenden 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?

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
TomyN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32
Erhaltene Danke: 2

Win10
D5 Std., Turbo-Delphi (w32), Delphi 2010
BeitragVerfasst: 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