GDI+ Font und Transparenz

13/01/2010 - 11:30 von martina gerling | Report spam
Hallo,

ich versuche, Text in einem eigenem Control auf transparenten
Hintergrund anzuzeigen. Der Hintergrund wird auch transparent
gezeichnet, jedoch wird der Text kaum noch lesbar dargestellt.

Folgendes habe ich in dem Control zur Darstellung gesetzt:
DoubleBuffered = true;
ResizeRedraw = true;
SetStyle(
ControlStyles.SupportsTransparentBackColor |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.ResizeRedraw |
ControlStyles.OptimizedDoubleBuffer, true);

So zeichne ich den Text in der Methode OnPaint:
protected override void OnPaint(PaintEventArgs e)
{
Brush backBrush = new SolidBrush(this.BackColor);
Brush foreBrush = new SolidBrush(this.ForeColor);
base.OnPaint(e);
Bitmap bmp = new Bitmap(e.ClipRectangle.Width,
e.ClipRectangle.Height);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(backBrush, e.ClipRectangle);
g.DrawString(Text, this.Font, foreBrush, pos, 0);
e.Graphics.DrawImageUnscaled(bmp, 0, 0);
g.Dispose();
backBrush.Dispose();
foreBrush.Dispose();
}

Leider wird der Text bei transparenten Hintergund sehr schlecht
dargestellt. Gibt es hier noch Möglichkeiten, damit der Text eine
bessere Qualitàt bekommt.

Gruss

Martina
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
13/01/2010 - 22:29 | Warnen spam
Hallo Martina!

Am 13.01.2010 11:30, schrieb martina gerling:
ich versuche, Text in einem eigenem Control auf transparenten
Hintergrund anzuzeigen. Der Hintergrund wird auch transparent
gezeichnet, jedoch wird der Text kaum noch lesbar dargestellt.

[...]
protected override void OnPaint(PaintEventArgs e)
{
Brush backBrush = new SolidBrush(this.BackColor);
Brush foreBrush = new SolidBrush(this.ForeColor);
base.OnPaint(e);
Bitmap bmp = new Bitmap(e.ClipRectangle.Width,
e.ClipRectangle.Height);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(backBrush, e.ClipRectangle);
g.DrawString(Text, this.Font, foreBrush, pos, 0);



Das Problem wird dadurch verursacht, daß standardmàßig der Text wohl mit
ClearType (Subpixeldarstellung) ausgegeben wird. Über die Eigenschaft
'TextRenderingHint' des 'Graphics'-Objektes kannst Du eine geeignetere
Darstellungsmethode auswàhlen (etwa 'SingleBitPerPixelGridFit'. Der Text
erscheint dann allerdings "kantig".

Nebenbei: Zur ganantierten Freigabe der GDI+-Objekte kannst/solltest Du
'Using'-Blöcke benutzen.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen