下面的代码:
public class OurTextBox : TextBox
{
public OurTextBox()
: base()
{
this.SetStyle(ControlStyles.UserPaint, true);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen penBorder = new Pen(Color.Gray, 1);
Rectangle rectBorder = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1);
e.Graphics.DrawRectangle(penBorder, rectBorder);
}
}
这是完美的工作,但它不显示文本,直到它获得焦点。
有人能帮帮我吗?怎么了?
4条答案
按热度按时间ej83mcc01#
要更改
TextBox
的边框颜色,您可以重写WndProc
方法并处理WM_NCPAINT
消息。然后使用GetWindowDC
获取控件的窗口设备上下文,因为我们要绘制到控件的非工作区。然后要绘制,从该上下文创建一个Graphics
对象就足够了,然后为控件绘制边框。若要在
BorderColor
属性变更时重新绘制控件,您可以使用RedrawWindow
方法。代码
下面是一个具有
BorderColor
属性的TextBox
。如果该属性值与Color.Transparent
不同,并且BorderStyle
是其默认值Fixed3d
,则该控件使用BorderColor
。第一个
结果
以下是使用不同颜色和不同状态的结果。如下图所示,支持所有状态的边框样式,您可以使用任何颜色的边框:
下载
您可以复制或下载工作示例:
cig3rfwq2#
您还必须手动绘制文本。
或者,你可以尝试使用
e.Graphics.DrawString()
方法,如果TextRenderer
没有给你想要的结果(我总是有更好的结果与这种方法thou).hfsqlsce3#
有几种方法可以做到这一点,但没有一种是理想的。这只是WinForms的本质。然而,你有一些选择。我将总结如下:
实现所需目的的一种方法是在
Panel
中嵌入TextBox
,如下所示。您也可以在不覆写任何控件的情况下执行此动作,但上述方法会更好。当控件取得焦点时,上述方法会绘制边框。如果您想要永久显示边框,请将
FocusedAlways
属性设定为True
。我希望这能帮上忙。
6yjfywim4#
将文本框边框样式设置为None,然后将此代码写入容器窗体“paint”事件