FBIagent
Erfahrenes Mitglied
Guten Tag,
ich habe mir eine Erweiterung für die normale TextBox aus .NET geschrieben, die es mir erlaubt
einen Text in der Mitte des Controls zu rendern, falls die TextBox keinen Text enthält.
Es funktioniert auch alles prima, nur hat die Erweiterung einen kleinen Schönheitsfehler:
Sobalt in der TextBox kein Text mehr enthalten ist und in den UserPaint style gewechselt wird,
wird der Hintergrund in weis gerendert wenn ich auf die Textfläche klicke. Sobald ich den bereich
des Textes mit dem Mauszeiger wieder verlasse ist wieder alles in Ordnung.
Dabei ist zu sagen, das nicht der gedammte Hintergrund in weis gerendert wird(siehe Anhang).
Könnt ihr mir einen Tipp geben wie ich das unterbinden könnte?
Grüße,
FBIagent
ich habe mir eine Erweiterung für die normale TextBox aus .NET geschrieben, die es mir erlaubt
einen Text in der Mitte des Controls zu rendern, falls die TextBox keinen Text enthält.
Es funktioniert auch alles prima, nur hat die Erweiterung einen kleinen Schönheitsfehler:
Sobalt in der TextBox kein Text mehr enthalten ist und in den UserPaint style gewechselt wird,
wird der Hintergrund in weis gerendert wenn ich auf die Textfläche klicke. Sobald ich den bereich
des Textes mit dem Mauszeiger wieder verlasse ist wieder alles in Ordnung.
Dabei ist zu sagen, das nicht der gedammte Hintergrund in weis gerendert wird(siehe Anhang).
C#:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
namespace TS3QueryClient
{
public partial class TextBoxEx : TextBox
{
[Localizable(true)]
[Bindable(true)]
[Description("Text displayed when the text box is empty")]
[Category("Appearance")]
[Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public String HintText
{
get { return _hintText; }
set { _hintText = value; Invalidate(); }
}
[Description("Color of HintText")]
[Category("Appearance")]
public Color HintTextColor
{
get { return _hintTextBrush.Color; }
set { _hintTextBrush = new SolidBrush(value); Invalidate(); }
}
private String _hintText = "";
private SolidBrush _hintTextBrush = new SolidBrush(Color.Silver);
private SolidBrush _backBrush = null;
private Font _oldFont = null;
public TextBoxEx()
{
TextChanged += TextChangedFunc;
}
protected override void OnCreateControl()
{
base.OnCreateControl();
_backBrush = new SolidBrush(BackColor);
_oldFont = Font;
TextChangedFunc(null, null);
}
protected override void OnFontChanged(EventArgs e)
{
base.OnFontChanged(e);
_oldFont = Font;
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
if (_backBrush.Color != BackColor)
_backBrush.Color = BackColor;
pevent.Graphics.FillRectangle(_backBrush, ClientRectangle);
}
protected override void OnPaint(PaintEventArgs pevent)
{
// draw hint for the textbox if it is empty (center/center)
SizeF backSize = pevent.Graphics.MeasureString(_hintText, Font);
PointF drawPt = new PointF(ClientSize.Width / 2 - backSize.Width / 2, ClientSize.Height / 2 - backSize.Height / 2);
pevent.Graphics.DrawString(_hintText, Font, _hintTextBrush, drawPt);
}
private void TextChangedFunc(object sender, EventArgs e)
{
if (TextLength == 0)
{
SetStyle(ControlStyles.UserPaint, true);
}
else
{
SetStyle(ControlStyles.UserPaint, false);
// in some cases without this the text will be rendered in system default font
Font = _oldFont;
}
Invalidate();
}
}
}
Könnt ihr mir einen Tipp geben wie ich das unterbinden könnte?
Grüße,
FBIagent