ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
1967
1967
EMPFEHLEN
-
12.02.08 17:21 #1
Hallo zusammen,
ich schlage mich gerade mit dem Problem rum, dass ich einen Text mittels DrawString in eine PictureBox schreibe, ich tue dies, da ich den Text auch rotiert darstellen möchte.
Die PictureBox verwende ich, da ich einen Container zum zeichnen brauchte, sie ist beliebig ersetzbar.
Der Reihe nach:
Ich habe ein neues Windows Steuerelement erstellt, in diesem habe ich ein TableLayoutPanel platziert, welches zum einen meine PictureBox und zum anderen ein DataGridView beinhaltet.
Über eine Eigenschaft wird der Text festgelegt, der in die PictureBox gerendert werden soll.
Außerdem habe ich OnPaint überschrieben (Code folgt), wo ich den Text neu render.
Leider ist der Text nicht immer dargestellt, bzw. nur dann, wenn ein Resize kommt. Wenn die PictureBox aus dem Bildschirm und wieder zurück gezogen wird, ist der Text ebenfalls weg.
Ich suche eine Möglichkeit, den Text permanent dazustellen, wie z.B. in einem Label.
Code 1: Rendern des Textes (ist unvollständig, nur das Wichtigste)
Code csharp:1 2 3 4 5
Graphics g = control.CreateGraphics(); g.Clear(control.Parent.BackColor); //Text ausgeben g.DrawString(text, font, new SolidBrush(Color.Black), 0, 0);
Code 2: OnPaint
RenderText ist die Methode, in der unter anderem Code 1 ausgeführt wird.Code csharp:1 2 3 4
protected override void OnPaint(PaintEventArgs e) { RenderText(columnHeaderBox, _columnHeaderText, RotationAlignment.Normal); }
-
Entweder beim festlegen des Textes die Funktion Invalidate der PictureBox aufrufen oder du zeichnest fest in eine Bitmap.
so ungefähr.PHP-Code:using (Graphics g = Graphics.FromImage(meineBitmap))
{
g.Clear(control.Parent.BackColor);
g.DrawString(text, font, new SolidBrush(Color.Black), 0, 0);
g.Flush();
}
Wobei ich glaub Invalide bleibt dir trotzdem nicht erspart
-
13.02.08 00:44 #3
Die Lösung, eine Bitmap zu verwenden kommt nicht in Frage.
Bzgl. dem Invalidate: das habe ich mal ausprobiert. Und zwar habe ich die es zu folgenden Zeitpunkten aufgerufen, leider ohne Erfolg:
1. Text-Eigenschaft, vor RenderText()
2. In RenderText() nach DrawString()
3. Nachdem alle RenderText()-Operationen durchgeführt wurden in der OnPaint-Methode
By the way:
Interessanterweise habe ich mal ein kleines Control geschrieben, welches eine Linie und einen Text direkt auf das Control zeichnet, dort habe ich ebenfalls mit Invalidate gearbeitet. Hier gibt es keine Probleme.
Das Zeichnen führe ich dort ebenfalls in der OnPaint-Methode durch.
In meinem ersten Post habe ich nicht erwähnt, dass das Control (PictureBox + DataGridView) in einem SplitContainer liegt. Könnte es ggf. daran liegen?
-
Hast du Invalidate im OnPaint Ereignis ausgelöst

Die Funktion muss außerhalb aufgerufen werden, du willst dem Control ja sagen das es sich neu zeichnen soll. (z.B.: wenn eine neue Zelle im Grid ausgewählt wird)
Edit: Alternativ einfach mal Invalidate von SplitContainer (oder dem Panel) aufrufen.
-
13.02.08 20:11 #5
Deshalb fragst du, oder? Das war nur ein Versuch, der logischerweise scheitern musste. Ich rufe Invalidate im set der Eigenschaft auf. In der OnPaint Methode wie gesagt nur meine RenderText-Methode, die eben den String zeichnen soll.
Eigentlich sollte das klappen, ich bin deshalb etwas ratlos. Deshalb habe ich in meinem letzten Post noch auf den splitContainer hingewiesen.
-
Habs gerade gtestet bei mir Funktionierts mit Invalidate auf PictureBox mit SplitCOntainer.
Aber was mit gerade aufgefallen ist
Warum übergibst du der RenderText Funktion nicht direkt das Graphics Objekt von PaintEventArgs?PHP-Code:Graphics g = control.CreateGraphics();
Habs dann mal mit CreateGraphics() probiert wie du es machst und dann hatte ich das gleiche Problem wie du.
Also besser Graphics Objekt von PaintEventArgs verwenden.
-
14.02.08 12:39 #7
Würde ich Graphics Objekt aus den PaintEventArgs verwenden, dann erhalte ich ja den kompletten Zeichenbereich für das Control.
Das ist ja grundsätzlich auch in Ordnung. Nun stelle ich mir nur die Frage, wie ich Location meiner PictureBox auf dem Control erhalte. Da ich diese ja in einem TableLayoutPanel liegen habe, kann ich nicht die Location-Eigenschaft der PictureBox auslesen, diese liefert mir 0; 0. Aus der Sicht des Controls selbst, könnte das aber 100;200 oder was auch immer sein.
Gibt es eine Möglichkeit die Koordinaten der PictureBox auf die absoluten Koordinaten des Controls (des Graphics-Objekt) umzurechnen?
-
das einzige was mir einfält wäre
und dort dann ev. X und Y vom Fenster abziehen.PHP-Code:meinControl.RectangleToScreen(meinControl.Bounds)
Falls du sowas gesucht hast.
Wobei ich immernoch nicht wirklich verstanden hab warum es nicht mit dem anderen Graphics Objekt gehen soll
-
07.03.08 09:10 #9
Nach langer Abstinenz von diesem Thema heute der Rückfall! Habe mich gestern nochmal mit diesen besch.... Graphics-Objekt gekloppt und das blöde Ding behält immer noch nicht seinen gemalten Text.
Interessanterweise musste ich jedoch folgendes festellen: Ich habe mittlerweile einen ToolStrip im Control platziert, sobald man mit Maus über einen der ToolStripButtons fährt (der erhält dann diese Hovermarkierung) wird die OnPaint-Methode aufgerufen und meine Strings gezeichnet. Platziert man wieder ein anderes Fenster etc. über dem Text, dann isser futsch
Sorry, aber langsam bekomm ich das kotzen
(entschuldigt bitte diesen Ausdruck)
-
Wie futsch?
Steht einfach nixs mehr da oder zeigt er ev. noch Teile des anderen Forms an?
Kann mir nur weiterhin vorstellen das Invalidate falsch aufgerufen wird. (und das Graphics Objekt hatte ich ja schon angesprochen
)
Ohne mehr Quelltext wirds ziemlich schwer den Fehler zu finden.
Spyke (www.iv-interactive.de)
-
06.05.08 16:21 #11
- Registriert seit
- Jul 2007
- Beiträge
- 1
Ist vermutlich schon etwas spät für eine Antwort...
Bei mir gibt es einen klaren Zusammenhang: Wenn ich e.Graphics verwende, geht es, wie gewünscht, mit DingsBums.GetGraphics() habe ich den gleichen "Fehler" wie Du.
Ich nutze OnPaint() udn zeichne dort alles neu mit e.Graphics. Aufrufen tue ich die Methode von aussen mit invalidate.
-
control.CreateGraphics()
Sollte schon funktioniert allerdings muss dann auch noch die Flush Methode implementiert werden damit alle Operationen die im Speicher liegen sofort ausgeführt werden.
Allerdings habe ich auch noch nie wirklich so ein Graphics Objekt angefordert.
Wenn dann würde ich empfehle ein Image Objekt zu verwenden und darüber zu zeichnen. Das funktioniert aufjedenfall.
-
Also die simpelste Lösung finde ich zu dem ganzen ist einfach eine Liste zu erstellen, wo man immer die relevanten Daten reinspeichert und immer wieder neuausliest, das klappt bei mir ohne Probleme und man kann sie auch ohne große Schwierigekeiten wieder löschen.
Hoffe ich habe hier nix falsch verstanden
Ähnliche Themen
-
DrawString und JLabel
Von killerkirsche im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 17.06.08, 15:17 -
VB2005: Wie Bitmap-Zeichensatz statt DrawString auf PictureBox.Image anwenden
Von UTA2000 im Forum .NET Grafik und SoundAntworten: 4Letzter Beitrag: 18.08.06, 17:32 -
VB2005: Wie Bitmap-Zeichensatz statt DrawString auf PictureBox.Image anwenden
Von UTA2000 im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 17.08.06, 17:24 -
pictureBox auf PictureBox oder Label
Von shn im Forum .NET Windows FormsAntworten: 1Letzter Beitrag: 31.08.05, 16:37 -
GDI+ und DrawString
Von Norbert Eder im Forum .NET ArchivAntworten: 3Letzter Beitrag: 12.04.04, 20:25





Zitieren
Login





