An WPF hatte ich auch schonmal gedacht. Aber bevor ich das mache, liefere ich erstmal ab, was ich habe. Der GUI-Teil ist nämlich gar nicht gefordert gewesen, nur der Parser. Aber ich wollte halt ne visuelle Überprüfung haben ob der auch richtig parst ^^
Wo ich den Artikel "Typography in WPF" so lese...das ist ja richtig gut was da geboten wird. Da kommt anscheinend so ein "WinForms sind tot"-Gedanke hoch 😉
Danke dafür.
Gruß, Rasta
Das Problem ist, dass ich einen Parser + GUI für ein Layoutformat baue.
Sowohl Zeichenhöhe als auch Zeichenabstand wird in Gleitkomma-Millimetern angegeben. Einfach Leerzeichen dazwischenschieben ist viel zu ungenau.
Der TextRenderer scheint aber schon vielversprechend zu sein. Momentan zeichnet er mir noch alles zu klein, woran könnte das liegen? Ich übergebe dem TR das gleiche Font-Objekt wie Graphics.DrawString.
Interpretiert der TR die Angabe "2.34mm" etwa anders? 😉
Danke schonmal, wenns nicht richtig klappt frag ich nochmal.
@herbivore: Das hat mir Google leider auch gesagt. In .NET war ein vernünftiger Schriftsatz scheinbar nicht vorgesehen (bzw. bei DrawString etc.).
Möglicherweise muss ich wirklich aus jedem Wort ein Char-Array machen und jeden Buchstaben einzeln mit dem richtigen Abstand zeichnen. Schaun wa moal...
Gruß, Sascha
Hallo,
gibt es eine Möglichkeit bei Graphics.Drawstring den Zeichenabstand zu verändern?
Weder bei System.Drawing.Font noch bei DrawString hab ich eine Letter-Spacing Eigenschaft gefunden.
Muss ich das selbst coden? Und wenn ja: Wie berechne ich die Breite eines Buchstabens, damit ich diese Breite auf die X-Koordinate aufaddieren kann?
Gruß, Rasta
Hab ich mir doch gedacht 😉
Zu meinem Problem mit dem skalieren...ich werde das jetzt ohne umwandeln lösen. Braucht zwar n bischen Mathematik (nicht gerade meine Stärke), ist aber langfristig vermutlich die bessere Lösung.
Danke schonmal.
Gruß Rasta
Ich hab das nur fürs Verständnis gesagt, ich rechne die Koordinaten einfach um.
Jack: Worin unterscheidet sich Graphics.Transform.Scale zu Graphics.ScaleTransform?
B ist das Property von b.
Ich werde mal das Problem beschreiben, damit vielleicht die Frage klarer rüberkommt:
Ich habe ein XML, in dem Textfelder gespeichert sind:
<Textvariable name="G_D03" posx="45,6" posy="62,6" />
Jetzt soll in eine Picturebox das Attribut "name" geschrieben werden und zwar an der angegebenen Position (wird mal ein Layout-Anzeigeprogramm).
Das Schreiben klappt schon ganz gut, allerdings hängen die Schriften alle ineinander weil die Picturebox ein anderes Koordinatensystem hat wie das XML. Wenn man die Picturebox auf die Größe 85x53 verkleinert stimmts...aber das ist so klein dass man nichts mehr lesen kann.
Jetzt wollte ich einfach ein Bitmap mit 85x53 erstellen und dann auf die volle Größe der Picturebox skalieren. Interpolation und Klötzchenbildung interessieren mich erstmal nicht.
Vielleicht gibts dazu ja noch einen einfacheren Ansatz.
Btw: Das Koordinatensystem des XMLs hat den Nullpunkt in der unteren linken Ecke, die Picturebox leider oben links. Der Nullpunkt bei "DrawString" ist oben links, bei meinem Layout auch unten links. Da werde ich vermutlich ziemlich viel rechnen müssen. Oder gibt es eine Möglichkeit dieses Verhalten zu ändern?
Gruß, Rasta
B.ScaleTransform(0.5F, 0.5F);
B.DrawImage(pictureBox1.Image,new Point(0,0));
B.ScaleTransform(2.0F, 2.0F);
B.DrawString("Horst", new Font("Arial", 10.0F), Brushes.Red,new PointF(20.0F,20.0F));
pictureBox1.Image = b;
So hab ichs gemacht, funktioniert aber immer noch nicht.
Gibt es keine Möglichkeit, einfach die komplette PictureBox zu skalieren? Ich will eigentlich nicht jeden einzelnen String bearbeiten. Einfach alles doppelt so groß, das reicht mir schon.
Hallo,
ich erstelle ein Bitmap mit Text, das ich dann einer PictureBox übergebe.
Allerdings würde ich das ganze jetzt gern skalieren und genau das funktioniert nicht.
Bitmap b = new Bitmap(pictureBox1.Image);
Graphics g = Graphics.FromImage(b);
g.DrawString("Horst", new Font("Arial", 10.0F), Brushes.Red,new PointF(20.0F,20.0F)); //Funktioniert
g.ScaleTransform(1.5F, 1.5F);//Funktioniert nicht
pictureBox1.Image = b;
Das "Horst" erscheint in roter 10pt Schrift, allerdings sollte es durch das skalieren größer sein.
Was mache ich falsch?
Gruß, Rasta
Stimmt, da hab ich Lambda und anonyme Methoden verwechselt. Ich benutze den Kram noch nicht lang 😉
@JunkyXL:
Meinst du z.B. so (ich wusste bis gerade gar nicht, dass man das sogar mehrfach verwenden kann):
Fulltextlist.FindAll(str => str.Contains("*tt=") || str.Contains("*zsl=")
Ihr habt natürlich beide Recht, das war auch der Grund für meinen Post.
Der Code wird allerdings nur einmal aufgerufen (Ganz am Anfang, um nach "tt" und "zsl" aufzutrennen).
tt und zsl sind die Kürzel für TrueType und Unicode-Schriftarten. Das Format was ich parse ist so unglaublich selten dass es sogar bei verschiedenen Maschinen des gleichen Herstellers variiert 😉
Das mit den Breakpoints klappt allerdings nicht. Es wird der ganze Block von oben bis unten rot hinterlegt. Wenn man allerdings dann mit F11 durchgeht, wird jede einzelne Anweisung durchgegangen. Da aber gleich am Anfang ein FindAll auf ne Liste aufgerufen wird die ungefähr 50 Einträge hat, muss man verdammt oft auf F11 hauen bevor das erste if() aufgerufen wird. Das stört mich ein bischen.
EDIT: Hab mich geirrt, innerhalb des Delegaten klappts.
Gruß, Rasta
Hallo,
für einen Parser hab ich gerade folgende "Zeile" geschrieben:
Dictionary<int, Schriftart> Schriftart_List = Fulltextlist.FindAll(
delegate(string str)
{
return str.Contains("*tt=") || str.Contains("*zsl=");
}
).ConvertAll(
delegate(string str)
{
Schriftart schrift;
schrift.Typ = "";
schrift.Name = str.Substring(str.IndexOf('=') + 1, str.IndexOf(' ') - str.IndexOf('=') - 1);
schrift.ganze_zeile = str;
if (str.StartsWith("*tt="))
{
schrift.Typ = "TrueType";
}
else if (str.StartsWith("*zsl="))
{
schrift.Typ = "Unicode";
}
return schrift;
}).ToDictionary(p => Fulltextlist.IndexOf(p.ganze_zeile));
Abgesehen von den Variablennamen (ich programmiere immer eine Methode on-the-fly und machs nachher schön)...mich überkommt der Eindruck dass man den ganzen Kram nicht mehr in einen einzelnen Befehl packen sollte. Ein Nachteil der mir direkt aufgefallen ist: Der Debugger behandelt das Ding als eine Zeile, wodurch man keine Haltepunkte setzen kann.
Wie macht ihr das? Habt ihr eine bestimmte Menge an Befehlen, bis zu denen ihr noch Lambda verwendet und ab der ihr eine Methode schreibt?
Gruß, Sascha