Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Grafikprogrammierung: Frage (https://www.delphipraxis.net/27269-grafikprogrammierung-frage.html)

hansklok 6. Aug 2004 19:39


Grafikprogrammierung: Frage
 
Im Buch "Delphi 7-Grundlagen & Profiwissen" ist in Kapitel 15 erklärt, dass es sich als ungünstig erweist, wenn man ein Grafikprogramm größeren Umfangs gestalten will & dazu die in der TCanvas Unit Standart eingestellte Stiftart Cosmetic Pen verwendet. Unterdessen wird auf die Stiftart Geometric Pen mit folgender Syntax hingwiesen:

Delphi-Quellcode:
function ExtCreatePen(PenStyle: DWord; Width: DWORD; const Brush: TLogBrush; StyleCount: DWORD; Style: Pointer): HPen;
Diese Syntax stellt die Pen Eigenschaft so um, dass Linien, die gezeichnet werden nicht mehr mit abgerundeten Ecken erstellt werden, sonder mit rechteckigen Ecken. Könnt ihr mir bitte den Quelltext geben, wenn im OnCreate Ereigniss des Formulars die Pen-Eigenschaft Cosmetic Pen auf Geometric Pen umgestellt wird?

Danke

Union 6. Aug 2004 21:27

Re: Grafikprogrammierung: Frage
 
Zitat:

Zitat von hansklok
Im Buch "Delphi 7-Grundlagen & Profiwissen" ist in Kapitel 15 erklärt, dass es sich als ungünstig erweist, wenn man ein Grafikprogramm größeren Umfangs gestalten will & dazu die in der TCanvas Unit Standart eingestellte Stiftart Cosmetic Pen verwendet. Unterdessen wird auf die Stiftart Geometric Pen mit folgender Syntax hingwiesen:

Delphi-Quellcode:
function ExtCreatePen(PenStyle: DWord; Width: DWORD; const Brush: TLogBrush; StyleCount: DWORD; Style: Pointer): HPen;
Diese Syntax stellt die Pen Eigenschaft so um, dass Linien, die gezeichnet werden nicht mehr mit abgerundeten Ecken erstellt werden, sonder mit rechteckigen Ecken. Könnt ihr mir bitte den Quelltext geben, wenn im OnCreate Ereigniss des Formulars die Pen-Eigenschaft Cosmetic Pen auf Geometric Pen umgestellt wird?

Den Pen kannst Du wie folgt einstellen:
Delphi-Quellcode:
...
const
  PenStyle = PS_Geometric or PS_Solid
var
  LogBrush: TLOGBRUSH;
begin  
  LogBrush.lbStyle := BS_Solid;
  LogBrush.lbColor := Pen.Color;
  LogBrush.lbHatch := 0;

  with Form1.Canvas do
  begin
    Pen.Handle := ExtCreatePen(PenStyle, Pen.Width, LogBrush, 0, nil);
  end;
end;
Du kannst auch mit den diversen PS_* Attributen experimentieren. Aber Achtung, bestimmte Kombinationen laufen nicht unter Win95!

nailor 6. Aug 2004 22:24

Re: Grafikprogrammierung: Frage
 
gibt win95 noch in der freien wildbahn?

Union 6. Aug 2004 22:35

Re: Grafikprogrammierung: Frage
 
Zitat:

Zitat von nailor
gibt win95 noch in der freien wildbahn?

Du wirst lachen, es gibt sogar noch DOSen! :zwinker:

nailor 6. Aug 2004 22:36

Re: Grafikprogrammierung: Frage
 
das hat auch eher noch ne daseinsberechtigung als win95

hansklok 8. Aug 2004 17:14

Re: Grafikprogrammierung: Frage
 
Ich habe nun alles ausprobiert & trotzdem sagt der mir undefinierter Bezeichner Pen. Warum?

Union 8. Aug 2004 17:56

Re: Grafikprogrammierung: Frage
 
Zitat:

Zitat von hansklok
Ich habe nun alles ausprobiert & trotzdem sagt der mir undefinierter Bezeichner Pen. Warum?

Sorry, es muss heißen:
Code:
LogBrush.lbColor := Form1.Canvas.Pen.Color;
Wenn Du die Stiftfarbe des Formulars übernehmen willst, ansonsten natürlich jede beliebige Farbe.

hansklok 8. Aug 2004 18:04

Re: Grafikprogrammierung: Frage
 
Jetzt habe ich noch ein Problem. Wenn ich das Canvas der Form verwende und die Stiftbreite auf 50 einstelle, dann wird auch eine sehr dicke Linie gezeichnet, so dass man sieht, dass die nicht nur ein Pixel breit ist. Wenn ich nun in das Create Ereignis der Form den leicht umgeänderten Quelltext:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
const
  PenStyle = PS_Geometric or PS_Solid;
var
  LogBrush: TLOGBRUSH;
begin  
  LogBrush.lbStyle := BS_Solid;
  LogBrush.lbColor := Form1.Image1.Canvas.Pen.Color;
  LogBrush.lbHatch := 0;
  with Form1.Image1.Canvas do
  begin
    Pen.Handle := ExtCreatePen(PS_Geometric+PS_Dash+PS_Endcap_Square+PS_Join_Round, 50, LogBrush, 0, nil);
  end;
end;
Dann sage ich dem Programm noch folgendes:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image1.Canvas.MoveTo(x, y);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Image1.Canvas.LineTo(X, Y);
end;
und trotzdem malt der die Linie nur ein Pixel breit, warum?

Union 8. Aug 2004 18:40

Re: Grafikprogrammierung: Frage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe Deinen Source exakt kopiert, hier die komplette Unit:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const
  PenStyle = PS_Geometric or PS_Solid;
var
  LogBrush: TLOGBRUSH;
begin
  LogBrush.lbStyle := BS_Solid;
  LogBrush.lbColor := Form1.Image1.Canvas.Pen.Color;
  LogBrush.lbHatch := 0;
  with Form1.Image1.Canvas do
  begin
    Pen.Handle := ExtCreatePen(PS_Geometric+PS_Dash+PS_Endcap_Square+PS_Join_Round, 50, LogBrush, 0, nil);
  end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image1.Canvas.MoveTo(x, y);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Image1.Canvas.LineTo(X, Y);
end;

end.
Und das Ergebnis sieht so aus (also schon eine fette Line wenn Du mich fragst):

hansklok 9. Aug 2004 18:06

Re: Grafikprogrammierung: Frage
 
Sorry, war ein Fehler von meiner Seite aus, hatte ein Stück Quelltext vergessen. Nun ergibt sich für mich gleich die nächste Frage. Gibt es irgendeine Möglichkeit für alle Zeichenelemente (Ellipse, Rectangle, RoundRect etc.) eine Art Kantenglättung beim Zeichnen durchzuführen, da die Linien immer noch relativ pixelig sind?

Gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz