Seite 1 von 1

Bunte Schrift im DC

Verfasst: Montag 24. September 2007, 10:21
von nkoehring
Hi mal wieder...

ich haette ja so total Lust ein eigenes Widget zu basteln. Das ist auch soweit alles kein Problem, bis auf eine kleine Sache:

Ich Zeichne das Widget komplett per DC (erstmal Zeichne ich per MemoryDC ein Bitmap, dass ich dann beim Paint-Event gepuffert auf das Control malen lasse).

Text schreiben ist ja nun auch garkein Problem, geht alles toll und einfach... aber nur eine Sache nicht: Die Schriftfarbe!

Wie kann ich die Schriftfarbe einstellen? Ich will doch nicht nur schwarz auf das Widget schreiben. Ich hab aber nun auch keine Lust, extra Fancy-Text oder sowas zu verwenden. Geht das nicht einfacher?

Zur allgemeinen Veranschaulichung, hier meine Methode create_bitmap:

Code: Alles auswählen

    def create_bitmap(self):
        bmp = wx.EmptyBitmap(*self.GetClientSize())
        print bmp.GetSize()
        dc = wx.MemoryDC(bmp)
        dc.SetPen(wx.Pen("white"))
        dc.SetFont(wx.FFont(10, wx.FIXED))
        dc.Clear()
        dc.DrawRectangle(0, 0, bmp.GetWidth()-2, bmp.GetHeight()-2)
        gradient = wx.Bitmap("gradient.bmp")
        gradient.SetHeight(bmp.GetSize().y-2)
        i=0
        while i < bmp.GetWidth()-2:
            dc.DrawBitmap(gradient, i+1, 1)
            i+=1
        dc.DrawText(self.label, 2, 2)
        dc.SelectObject(wx.NullBitmap)
        return bmp
Gruesse
NKoehring

PS: foregroundcolour und was es da noch so alles gibt, funktioniert nicht...

Re: Bunte Schrift im DC

Verfasst: Montag 24. September 2007, 14:51
von gerold
nkoehring hat geschrieben:Die Schriftfarbe
Hallo nkoehring!

Das funktioniert mit dem GraphicsContext:

Code: Alles auswählen

    def create_bitmap(self):
        bmp = wx.EmptyBitmap(*self.GetClientSize())
        dc = wx.MemoryDC(bmp)
        
        gc = wx.GraphicsContext_Create(dc)
        gc.SetPen(wx.Pen(wx.WHITE, 1, style = wx.TRANSPARENT))
        
        gc.SetBrush(gc.CreateLinearGradientBrush(0, 0, 200, 80, wx.BLUE, wx.GREEN))
        gc.DrawRectangle(0, 0, 200, 50)
        
        font = dc.GetFont()
        font.SetPointSize(18)
        font.SetWeight(wx.BOLD)
        gc.SetFont(font, "yellow")
        gc.DrawText("Hallo Welt", 10, 10)
        
        dc.SelectObject(wx.NullBitmap)
        return bmp
Bild

mfg
Gerold
:-)

Verfasst: Montag 24. September 2007, 17:41
von nkoehring
Ah klasse... das funktioniert einwandfrei. Mal wieder ein großes Dankeschoen Gerold!

Da haette ich gleich noch eine kleine Frage: Gibt es einen einfachen Weg, die Hoehe und Breite einer Zeichenkette herauszufinden?

Also ich setze zB wx.FFont(8, wx.FIXED) und moechte dann wissen, wie hoch und breit der Text X genau wird...

Verfasst: Montag 24. September 2007, 19:17
von gerold
nkoehring hat geschrieben:Gibt es einen einfachen Weg, die Hoehe und Breite einer Zeichenkette herauszufinden?
Hallo nkoehring!

gc.GetTextExtent()
gc.GetFullTextExtent()
oder
dc.GetTextExtent()
dc.GetFullTextExtent()

lg
Gerold
:-)

EDIT:

Die gc-Beispiele machen bei mir Probleme. Vielleicht muss man vorher irgendeine Schrift zuweisen, aber das probiere ich jetzt nicht aus, da es ja über den DeviceContext (dc) wunderbar funktioniert.

Verfasst: Montag 24. September 2007, 22:34
von nkoehring
aha... na das soll einer aus den Methodennamen mal rauslesen ^^

EDIT: ...aber es funktioniert irgendwie nicht. Er meinte, ein MemoryDC hat diese Methode nicht...

Verfasst: Montag 24. September 2007, 23:30
von gerold
nkoehring hat geschrieben:EDIT: ...aber es funktioniert irgendwie nicht. Er meinte, ein MemoryDC hat diese Methode nicht...
Verschrieben?

Also die liebe PyShell verrät:

Code: Alles auswählen

wx.DC.GetTextExtent()
Die Namen wurden mit TAB automatisch ergänzt. Ein Verschreiber ist in diesem Fall ausgeschlossen.

EDIT:

Und hier noch ein Test mit der PyShell:

Code: Alles auswählen

>>> import wx
>>> bmp = wx.EmptyBitmap(100, 100)
>>> dc = wx.MemoryDC(bmp)
>>> dc.GetTextExtent("asdf")
(28, 16)
>>>
lg
Gerold
:-)

Verfasst: Dienstag 25. September 2007, 10:52
von nkoehring
lach... jetzt weiß ich meinen Fehler: GetTextExtend! Naja, ich gelobe Besserung, ehrlich ;) Danke!