Entwickler-Ecke

Multimedia / Grafik - DrawString Error


ssb-blume - Sa 30.03.19 12:40
Titel: DrawString Error
Hallo,

ich verzweifele noch!
in einer PictureBox wird ein Raster gezeichnet und in den Schnittstellen ein Kreis. -Alles OK-
Jetzt soll noch ein Text gezeichnet werden, wobei font, brush und point ok sind:

C#-Quelltext
1:
G.DrawString("", drawFont, drawBrush, P);                    

OK!!!! kein Fehler-

Sobald auch nur 1 Buchstabe im Text ist, wird das schöne rote Kreuz gezeichnet (ErrorImage);

Ich finde keinerlei Hinweise im Internet, Ihr seid meine einzige Hoffnung!

Hansi

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Titel geändert ("C#" entfernt und als Tag hinzugefügt).


Th69 - Sa 30.03.19 14:42

Wird das ErrorImage für die gesamte PictureBox angezeigt oder nur dort, wo du den Text zeichnen möchtest?
Zeigst du denn auch über Eigenschaft Image ein Bild an (denn nur, wenn das Laden des Bildes fehlschlägt sollte das ErroImage angezeigt werden)?

Und was für einen Font und Brush verwendest du denn?

PS: Wenn du nur alles selber zeichnest, dann nimm statt der PictureBox besser ein Panel.


ssb-blume - Sa 30.03.19 14:52

lt. MS:
aufruf (paint-ereignis):

C#-Quelltext
1:
2:
3:
4:
5:
6:
private void GM_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
    Rectangle Show = new Rectangle(GM.Location, GM.Size);

    //usw....

Hier ist der Teufel:

C#-Quelltext
1:
G.DrawString(s, drawFont, drawBrush, Pointer p);                    


Fragen beantworten:
1) gesamte Imagebox
2) Font drawFont = new Font("Arial"10.0F, FontStyle.Bold)
3) SolidBrush drawBrush = new SolidBrush(Color.Black);

Wenn die Zeichenkette s leer ist, ist alles OK!!!!!
Zeichenkette s ="ABC": -- ERROR --

der Pointer liegt mit Sicherheit in ImageBox.

Hansi

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Sa 30.03.19 15:31

Was genau meinst du mit "pointer"?
Als 4. Parameter für DrawString wird eine Position (PointF) angegeben.

Ich hatte erst vermutet, daß du einen speziellen Font verwendest und dieser evtl. Probleme macht, aber bei "Arial" sollte dies wohl nicht passieren.

Edit:
Was mir noch einfällt - es könnte auch sein, daß das "ErrorImage" angezeigt wird, wenn innerhalb der Paint-Methode eine Exception auftritt.
Fange diese mal selbst und schau (im Debugger) nach:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private void GM_Paint(object sender, PaintEventArgs e)
{
  try
  {
    // ...
  }
  catch (Exception ex)
  {
    // ... (hier mal Haltepunkt setzen)
  }
}


PS: Ich hatte wohl zeitgleich mit deiner Antwort meinen obigen Beitrag noch mal nacheditiert. Hattest du das schon gelesen?


ssb-blume - Sa 30.03.19 16:38

Ich habe nun den Text aus dem Beispiel von MS genommen. Auch da tritt der Fahler auf, wenn Text nit lee ist
Das Anzeigeelement ist nun auch Panel;

Beim catch wird "falscher Parameter gezeigt", leider nicht welcher. Wird der text auf "" gesetzt, tritt der Fehler nicht auf.

Hier der MS-Text:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
                   String drawString = "Sample Text";

                    // Create font and brush.
                    Font drawFont = new Font("Arial"16);
                    SolidBrush drawBrush = new SolidBrush(Color.Black);

                    // Create point for upper-left corner of drawing.
                    float x = 150.0F;
                    float y = 50.0F;

                    // Set format of string.
                    StringFormat drawFormat = new StringFormat();
                    drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;

                    // Draw string to screen.
                    e.Graphics.DrawString(drawString, drawFont, drawBrush, x, y, drawFormat);


Delete - Sa 30.03.19 16:41

- Nachträglich durch die Entwickler-Ecke gelöscht -


ssb-blume - So 31.03.19 09:02

Ja...

Eine dazwischen geschaltete Variable Graphics G = e.Graphics ist wohl hier der Urheber.

Es ist bloß komisch, dass alle anderen grafischen Elemente (rechteck, linien..) angezeigt werden ohne Fehler.

Vielen Dank also nochmals!

Hansi

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - So 31.03.19 09:35

Das kann nicht die Ursache sein, denn das ist einfach nur eine Referenz (sonst würde kein einziger C#-Code funktionieren).

Daß bei einem leeren String "" kein Fehler passiert, ist einfach nur, weil dann auch nichts gezeichnet wird.

Bzgl. "Falscher Parameter": dann debugge mal die gesamte Paint-Methode und wenn wirklich bei DrawString diese Exception kommt, dann schau dir mal die einzelnen übergebenen Werte (direkt im Debugger Variablen-Fenster) an.

Welche C#-Version (d.h. welches VS) und welche .NET-Version verwendest du denn?

PS: Du solltest alle Ressourcen (wie Font oder Brush) wieder korrekt "disposen", d.h. Dispose() aufrufen oder aber noch besser in eine using-Anweisung packen.

Noch besser ist es, diese Variablen als Klassenmember zu definieren (static readonly), so daß die Ressource-Objekte nicht bei jedem Paint-Aufruf generiert (und wieder gelöscht) werden.


ssb-blume - Mo 01.04.19 09:34

Danke nochmals!

Zitat:
Das kann nicht die Ursache sein, denn das ist einfach nur eine Referenz (sonst würde kein einziger C#-Code funktionieren).

1. ich habe im Quelltext nur geändert: statt G.Drawstring.. e.Graphis.Drawstring... und schon funktioniert es!

Zitat:
PS: Du solltest alle Ressourcen (wie Font oder Brush) wieder korrekt "disposen", d.h. Dispose() aufrufen oder aber noch besser in eine using-Anweisung packen.

2. natürlich , hier war alles nur in einer Routine zusammengefasst wegen besserer kontrolle, -debugging. Sämtliche Parameter wurden im Debug-Modus korrekt angezeigt.

3. VS 2017 Community, Version 15.8.8

Danke nochmals!