[Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Danilo »

STARGÅTE hat geschrieben:ich glaube irgendwo gelesen zu haben, das man sogar bei GDI+ die Einheit angegeben kann, in der die Befehle arbeiten sollen.
Dort müsste dann alles auf Pixel und nicht auf Punkte gestellt werden.
Genau das habe ich gemacht, überall UnitPixel genommen. Scheint wohl nicht zu stimmen.

Code: Alles auswählen

enum Unit
{
    UnitWorld,      // 0 -- World coordinate (non-physical unit)
    UnitDisplay,    // 1 -- Variable -- for PageTransform only
    UnitPixel,      // 2 -- Each unit is one device pixel.
    UnitPoint,      // 3 -- Each unit is a printer's point, or 1/72 inch.
    UnitInch,       // 4 -- Each unit is 1 inch.
    UnitDocument,   // 5 -- Each unit is 1/300 inch.
    UnitMillimeter  // 6 -- Each unit is 1 millimeter.
};
Wenn Du Vorschläge hast, her damit. Ich wechsle aber nicht täglich das Thema,
sondern arbeite erstmal die Grundsachen ab. Jetzt steht bei mir gerade noch nicht
Drucker an. Ist ja noch nicht fertig.
Und heute brauche ich erstmal einen Tag Pause. Gehe nebenbei noch arbeiten. ;)

Wäre schön wenn noch paar mehr Leute mithelfen, es kommt ja dann allen zugute.

Aus MSDN:

Code: Alles auswählen

VOID Example_SetPageScale(HDC hdc)
  {
     Graphics graphics(hdc);
  
     // Set the world transformation.
     graphics.TranslateTransform(4.0f, 1.0f);
  
     // Set the page transformation.
     graphics.SetPageUnit(UnitMillimeter);
     graphics.SetPageScale(10.0f);
  
     Pen pen(Color(255, 0, 0, 0), 0.0f);
     graphics.DrawRectangle(&pen, 0, 0, 3, 2);
  }
Das halte ich schon für sinnvoller, z.b. in Millimetern oder Inch auf einem
Drucker zu zeichnen. Dann kann ich beispielsweise sagen 100 mal 100
und erhalte dann auf jedem Drucker wirklich eine Box von 10cm x 10cm.
Ansonsten muß man halt mit GetPageUnit und GetPageScale selbst umrechnen
oder mit gScale den Inhalt vom Bildschirm zum Drucker skalieren.
Zuletzt geändert von Danilo am 12.07.2011 11:53, insgesamt 1-mal geändert.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

UnitPixel ist auch richtig, denn für Stiftdicke stimmt es ja, aber das KoordinatenSystem, also die Größenangaben bei LineXY usw. die sind nicht konvertiert.

Und eigentlich könnte man sich auch PureLusts Vorschlag sparen mit dem GetDeviceCaps_().

Denn wenn ich in Pixeln arbeite will, dann muss meine Font ja auf einem Drucker kleiner werden, als auf dem Bildschirm.
Aber durch das einbauen von PureLusts Zeile sind nun alle Texte beim Drucker (mehr dpi, größeres FontSize) größer als Linien- oder Kreisdicken ... weil Fonts dann in Points arbeiten.

Das heißt das muss wieder raus und durch ein einheitliches Einheitensystem ersetzt werden.
Wenn Du Vorschläge hast, her damit. Ich wechsle aber nicht täglich das Thema,
sondern arbeite erstmal die Grundsachen ab. Jetzt steht bei mir gerade noch nicht
Drucker an. Ist ja noch nicht fertig.
Und heute brauche ich erstmal einen Tag Pause. Gehe nebenbei noch arbeiten.

Wäre schön wenn noch paar mehr Leute mithelfen, es kommt ja dann allen zugute.
Das sehe ich ein, aber gerade dieses "von allen Seiten" wird was reingestreut (wie auch von mir) führt gerade zu solchen Fehlern, das Sachen überhaupt nicht mehr zusammen passen.
Ich für meinen Teil, werde mal das mit den Einheiten versuchen zu lösen, sodass es dann gSetUnit(#UnitMillimeter) gibt und dann wirkich alle Befehle auch damit arbeiten.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Danilo »

STARGÅTE hat geschrieben:Das sehe ich ein, aber gerade dieses "von allen Seiten" wird was reingestreut (wie auch von mir) führt gerade zu solchen Fehlern, das Sachen überhaupt nicht mehr zusammen passen.
Ich für meinen Teil, werde mal das mit den Einheiten versuchen zu lösen, sodass es dann gSetUnit(#UnitMillimeter) gibt und dann wirkich alle Befehle auch damit arbeiten.
Du willst es ja scheinbar alles unbedingt jetzt sofort, dann mußt Du es eben machen. :)

Ich kann nicht hexen, aber gebe mir zumindest Mühe. Man, ich bin schon 34! :D
Wenn Du eine Weile warten kannst, dann schaue ich mir auch das genau an
und versuche alle Wünsche möglich zu machen.
Ich schreibe ja nicht einfach so mal 20 Funktionen, sondern muß mir auch ein
System ausdenken, wie das alles ordentlich zusammen paßt und was es für
Nebenwirkungen haben kann etc.

Ist ja bei mir nicht auch so, dass Du 5 Jahre auf eine Wunscherfüllung warten mußt,
siehe Shearing und so... ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

Meine Hinweise waren auch nicht so zu verstehen, dass ich es jetzt brauche (hab ich auch nirgends geschrieben)
Sonden es sollte einfach nur auf eine lange Liste kommen, um nicht in Vergessenheit zu kommen.

Denn:
Ich schreibe ja nicht einfach so mal 20 Funktionen, sondern muß mir auch ein
System ausdenken, wie das alles ordentlich zusammen paßt und was es für
Nebenwirkungen haben kann etc.
genau das, scheinst du aber nicht umzusetzten, denn in den letzten Tagen ging mir das irgendwie zu schnell.
Das ist kein Vorwurf, sonden ehr ein Hinweis für uns beide! Denn ich reagiere nur auf die Neuerungen und zeige Fehler und Schwachstellen.

Wenn du unterstützung brauchst, dann wäre es nett, wenn du uns bestimmte Gebiete nennst, an denen wir arbeiten sollen/dürfen, damit wir uns nicht gegenseitig den Code zerschreiben.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Falko »

Vielleicht könnte man einiges aus Flype's Source übernehmen.

http://www.purearea.net/pb/download/use ... diplus.zip

Ich hatte damals schon damit einiges probiert, bin aber nicht so
richtig weiter gekommen. Darum bin ich echt froh, das Danilo hier
den großen Schritt gemacht hat, eine komplexere GDI-PBI zu
programmieren. :allright:

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Danilo »

Wäre nett wenn ihr mal etwas testen könnt.

Print Test: http://www.mediafire.com/download.php?a5vtdqx73849prm

Der Test zeigt ein Fenster mit dem Text "gDrawing".
Um den Text ist eine Box.
Direkt darunter (an der oberen Box dran) ist eine Box von 10x10cm mit einer Linie durch.
Daneben steht die Auflösung in DPI.

Die untere Box (mit dem Strich durch) sollte am Bildschirm ca. 10x10cm sein -
es gibt aber beim Display evtl. kleinere Abweichungen von 2-3mm.

Wenn man das Fenster schließt kommt ein PrintDialog und man
kann das gleiche Bild nun auf seinem Drucker ausgeben.
Auf dem Papier sollte dann die untere Box auch genau 10x10cm sein,
unabhängig von der DPI-Einstellung des Druckers.

Auf dem Papier sollte es wie auf dem Bildschirm aussehen (außer andere DPI).
WYSIWYG, bis auf kleine Abweichungen am Bildschirm.
Voraussetzung beim drucken:
Ganz normal auf A4-Seite, keine Seitenskalierung (z.b. Borderless oder so)
durch die Druckereinstellungen.

Das muß überall auf dem Papier 10x10cm sein. Und die Liniebreite der
Box genau 1mm.

Danke an alle Tester! :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Falko »

Bestätigt.
600x600 DPI , Box ist 10x10 cm und Linie genau 1mm dick. Top :allright:
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Christian H »

Falko hat geschrieben:Bestätigt.
600x600 DPI , Box ist 10x10 cm und Linie genau 1mm dick. Top :allright:
Bei mir Exakt das gleich.
Am Monitor geringe Abweichung nach oben.
Gruß Christian
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

Test funktioniert leider ganz:
Hier die Resultate:
gDrawing() Print Test 600.pdf
gDrawing() Print Test 150.pdf
Die Abmessungen stimmen, aber die Dicken sind falsch.
(erzeugt mit FreePDF)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von SoS »

Danilo hat geschrieben:Man, ich bin schon 34! :D
Ja,viele vergessen das ältere Herren keine D-Züge sind. :lol:

Zum Test
Mein Drucker Canon iP4500 angeschlossen an der Fritzbox liefert mir bei 600 DPI genau das
was ich im Fenster sehe. Ich habe die Stärken nicht nachgemessen aber meine Augen sagen
mir, die sind alle gleich stark und etwar 1mm . :allright:
Antworten