AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Zeichnen auf Canvas und ZOrder bzw. Übermalen
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichnen auf Canvas und ZOrder bzw. Übermalen

Ein Thema von EWeiss · begonnen am 2. Apr 2015 · letzter Beitrag vom 2. Apr 2015
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#11

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:16
Wenn ich eine Linie zeichne und einen Kreis darüber lege sollte die Linie überdeckt werden.

Geht wohl nicht mit Board mitteln
Freilich geht das.
daher bin ich auf GDI+ ausgewichen.
Hat sich also erledigt.
Auch gut.
Uli Gerhardt
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:18
Zitat:
Freilich geht das.
Nö! nicht mit Canvas.

Zitat:
Auch gut.
Richtig.

gruss
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#13

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:22
Zitat:
Freilich geht das.
Nö! nicht mit Canvas.
Doch!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin

  Image1.Canvas.Font.Color := clblack;
  Image1.Canvas.Pen.Color := clblack;
  Image1.Canvas.MoveTo(0,0);
  Image1.Canvas.LineTo(100,100);

  Image1.Canvas.Brush.Style:= bsSolid;
  Image1.Canvas.Brush.Color := clLime;
  Image1.Canvas.Pen.Width := 5;

  Image1.Canvas.Ellipse(30,30,70,70);

end;
Der Kreis liegt über der Linie und die Linie ist definitiv nicht im Bereich des Kreises sichtbar, sondern wird komplett verdeckt.

Also doch ein moglicher Fehler in DrawEllipseFromCenter.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:25
Zitat:
Also doch ein moglicher Fehler in DrawEllipseFromCenter.
Sorry aber du nervst..

Delphi-Quellcode:
procedure TGraph.DrawEllipseFromCenter(Canvas: TCanvas; XOffset: integer;
  YOffset: integer; RadiusOfCircle: Integer);
Var
  R: TRect;
begin

  R.Top := YOffset - RadiusOfCircle;
  R.Left := XOffset - RadiusOfCircle;
  R.Bottom := YOffset + RadiusOfCircle;
  R.Right := XOffset + RadiusOfCircle;
  Canvas.Ellipse(R);
end;
Fehler? LOL

gruss
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:44
Hallo Emil, wer zuletzt malt malt zuletzt, das trifft auch für Brush.Style zu (Siehe Setter von TBrush).

Delphi-Quellcode:
    // ergibt bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK;
    Bitmap.Canvas.Brush.Style := bsClear;

    // ergibt bsSolid;
    Bitmap.Canvas.Brush.Style := bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK; // ***
Color und Style beeinflussen sich auch gegenseitig.

Geändert von Bjoerk ( 2. Apr 2015 um 11:48 Uhr) Grund: Ergänzt
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:56
Hallo Emil, wer zuletzt malt malt zuletzt, das trifft auch für Brush.Style zu (Siehe Setter von TBrush).

Delphi-Quellcode:
    // ergibt bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK;
    Bitmap.Canvas.Brush.Style := bsClear;

    // ergibt bsSolid;
    Bitmap.Canvas.Brush.Style := bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK; // ***
Color und Style beeinflussen sich auch gegenseitig.
Danke!
Verstehe aber nicht wo ich es einsetzen soll.
Funktioniert einfach nicht.

Zuerst wird PrepareScale aufgerufen aus der Draw function.
Delphi-Quellcode:
procedure TGraph.PrepareScale;
var
  gray: Integer;
begin

  If ScaleMax = 0 Then
    ScaleMax := 1;

  Aspect := Bitmap.Width / Bitmap.Height;

  yMin := -ScaleMax;
  yMax := ScaleMax;
  xMin := -ScaleMax * Aspect;
  xMax := ScaleMax * Aspect;

  Bo := 20;
  BoLeft := Bo;
  BoTop := Bo;
  BoRight := Bo;
  BoBottom := Bo;

  Fact;

  Bitmap.Canvas.brush.Color := $00E0FFFF;
  // Hintergrund löschen
  Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);

  if HelpIsOn then
    DrawHelp;

  gray := 200;
  gray := RGB(gray, gray, gray);
  Bitmap.Canvas.Pen.Color := gray;

  // Koordinatenkreuz
  Bitmap.Canvas.MoveTo(xxc(xMin), yyc(0));
  Bitmap.Canvas.LineTo(xxc(xMax), yyc(0));
  Bitmap.Canvas.MoveTo(xxc(0), yyc(yMin));
  Bitmap.Canvas.LineTo(xxc(0), yyc(yMax));

  // Brush löschen
  Bitmap.Canvas.Brush.Style:= bsClear;

  // Kreis zeichnen
  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x0), yyc(Physics.y0), trunc(xFact * Physics.L0));

  Bitmap.Canvas.Pen.Color := clblack;
  //Rechteck von links oben nach rechts unten
  Bitmap.Canvas.Rectangle(xxc(xMin), yyc(yMin), xxc(xMax), yyc(yMax));
end;
dann die Draw selbst.
Delphi-Quellcode:
procedure TGraph.Draw;
begin

  Bitmap.Canvas.Font.Color := clblack;

  PrepareScale;

  // Pendel Linie
  If Physics.D <> 0 then
  begin
    Bitmap.Canvas.Pen.Color := clblack;
    Bitmap.Canvas.MoveTo(xxc(Physics.x0), yyc(Physics.y0));
    Bitmap.Canvas.LineTo(xxc(Physics.x1), yyc(Physics.y1));
  end;

  // Pendel Center Punkt
  Bitmap.Canvas.Brush.Style:= bsclear;
  Bitmap.Canvas.Pen.Width := 3;
  Bitmap.Canvas.Pen.Mode := pmMergePenNot;

  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x0), yyc(Physics.y0), round(Physics.r0 * xFact));

  // Pendel (Ball)
  Bitmap.Canvas.brush.Color := clred;
  Bitmap.Canvas.Pen.Width := 2;
  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));

  Bitmap.Canvas.Pen.Width := 1;

  // vom Bitmap auf das Canvas kopieren
  BitBlt(PaintFrame.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
end;

pmMergeNotPen > Combination of canvas background color and inverse of pen Color.
Sorgt dafür das der gro0e Graue Kreis überdeckt wird.
Was soll da falsch sein (oder vergessen) das es nicht geht.

gruss

Geändert von EWeiss ( 2. Apr 2015 um 12:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#17

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:56
Zitat:
Freilich geht das.
Nö! nicht mit Canvas.
Ich hab deinen Code mal in eine lauffähige Form gebracht und sehe Kreise über Strichen:
Delphi-Quellcode:
procedure DrawEllipseFromCenter(Canvas: TCanvas; XOffset: integer; YOffset: integer; RadiusOfCircle: Integer);
var
  R: TRect;
begin
  R.Top := YOffset - RadiusOfCircle;
  R.Left := XOffset - RadiusOfCircle;
  R.Bottom := YOffset + RadiusOfCircle;
  R.Right := XOffset + RadiusOfCircle;
  Canvas.Ellipse(R);
end;

procedure TForm2.PaintFramePaint(Sender: TObject);
var
  Bitmap: TBitmap;
const
  Physics_x0 = 100;
  Physics_x1 = 200;
  Physics_y0 = 100;
  Physics_y1 = 200;
  Physics_r0 = 30;
  Physics_r1 = 40;
  xFact = 1;

  function xxc(x: Integer): Integer;
  begin
    Result := x;
  end;

  function yyc(y: Integer): Integer;
  begin
    Result := y;
  end;

begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.SetSize(PaintFrame.ClientWidth, PaintFrame.ClientHeight);

    Bitmap.Canvas.Font.Color := clblack;
    Bitmap.Canvas.Pen.Width := 1;
    //PrepareScale;

    // Linie an der das Pendel (Ball) hängt
    Bitmap.Canvas.Pen.Color := clblack;
    Bitmap.Canvas.MoveTo(xxc(Physics_x0), yyc(Physics_y0));
    Bitmap.Canvas.LineTo(xxc(Physics_x1), yyc(Physics_y1));

    Bitmap.Canvas.Brush.Style := bsSolid;
    Bitmap.Canvas.brush.Color := clblack;
    Bitmap.Canvas.Pen.Width := 5;
    // Center Punkt
    DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics_x0), yyc(Physics_y0), round(Physics_r0 * xFact));

    // Ball
    Bitmap.Canvas.brush.Color := clred;
    Bitmap.Canvas.Pen.Width := 2;
    DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics_x1), yyc(Physics_y1), round(Physics_r1 * xFact));

    // vom Bitmap auf das Canvas kopieren
    BitBlt(PaintFrame.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
  finally
    Bitmap.Free;
  end;
end;
(PaintFrame ist dabei eine TPaintBox) Also irgendwie zeigst du uns nicht das Relevante.
Uli Gerhardt
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 12:04
Zitat:
Also irgendwie zeigst du uns nicht das Relevante.
Hab meinen Beitrag nochmal editiert.

gruss
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 12:21
Zitat:
Danke! Verstehe aber nicht wo ich es einsetzen soll. Funktioniert einfach nicht. [..]
Ich will damit sagen, daß wenn man Color bzw. Style angibt, noch lange nicht sichergestellt ist, daß das auch so auf dem Canvas ankommt.

Bei deiner Skizze sieht es ja so aus als ob der Kreis quasi mit bsClear gezeichnet wäre? Lass mal den Pen.Mode weg.

Delphi-Quellcode:
procedure TBrush.SetColor(Value: TColor);
var
  BrushData: TBrushData;
begin
  if (Value <> Color) or ((Style = bsClear) and (Style <> bsSolid)) then
  begin
    GetData(BrushData);
    BrushData.Color := Value;
    if BrushData.Style = bsClear then
      BrushData.Style := bsSolid;
    SetData(BrushData);
  end;
end;

procedure TBrush.SetStyle(Value: TBrushStyle);
var
  BrushData: TBrushData;
begin
  if (Value <> Style) or ((Value = bsClear) and (Color <> clWhite)) then
  begin
    GetData(BrushData);
    BrushData.Style := Value;
    if BrushData.Style = bsClear then
      BrushData.Color := clWhite;
    SetData(BrushData);
  end;
end;

Geändert von Bjoerk ( 2. Apr 2015 um 12:25 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 12:34
Hallo Bjoerk

Zitat:
Bei deiner Skizze sieht es ja so aus als ob der Kreis quasi mit bsClear gezeichnet wäre? Lass mal den Pen.Mode weg.
Wir haben einen Gewinner
Jetzt funktioniert es.

Aber würde mich trotzdem nochmal interessieren warum Pen.Mode und bsClear sich im Wege stehen (für spätere Projekte).

Danke schön..
Jetzt kann ich 2 Projekte hochladen einmal mit GDI und einmal GDI+
So kann man das mal vergleichen.

gruss

Geändert von EWeiss ( 2. Apr 2015 um 12:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz