using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Linq;
|
using System.Text;
|
using System.Windows.Forms;
|
|
namespace DPumpHydr.WinFrmUI.WenSkin.Controls
|
{
|
[DefaultEvent("TextChanged")]
|
[DefaultBindingProperty("Text")]
|
public class WenLineTextBox : WenControl
|
{
|
public WenLineTextBox() : base()
|
{
|
textBox = new TextBox()
|
{
|
BorderStyle = BorderStyle.None,
|
Anchor = AnchorStyles.Left | AnchorStyles.Right,
|
};
|
|
//鼠标移动
|
textBox.MouseLeave += TextBox_MouseLeave;
|
textBox.MouseEnter += TextBox_MouseEnter;
|
this.MouseLeave += TextBox_MouseLeave;
|
this.MouseEnter += TextBox_MouseEnter;
|
|
this.MouseMove += WenLineTextBox_MouseMove;
|
|
textBox.LostFocus += TextBox_LostFocus;
|
textBox.GotFocus += TextBox_GotFocus;
|
|
//创建消息 NativeWindow
|
textBox.HandleCreated += TextBox_HandleCreated;
|
textBox.HandleDestroyed += TextBox_HandleDestroyed;
|
|
//鼠标点击事件
|
this.MouseClick += WenLineTextBox_MouseClick;
|
|
this.SizeChanged += WenLineTextBox_SizeChanged;
|
this.Controls.Add(textBox);
|
|
//初始化颜色
|
BackColor = Color.FromArgb(37, 37, 38);
|
BorderColor = Color.FromArgb(63, 63, 70);
|
HotColor = Color.FromArgb(0, 122, 204);
|
ForeColor = Color.FromArgb(241, 241, 241);
|
WateTextColor = Color.FromArgb(153, 153, 153);
|
|
PasswordChar = '\0';
|
}
|
|
#region 私有属性
|
private Color hotColor;
|
private Color borderColor;
|
private bool isMouseOver;
|
private string wateText;
|
private Color wateTextColor;
|
private bool buttonImageMouseOver;
|
private HeaderNativeWindow headerNativeWindow;
|
private Image buttonImage;
|
|
private TextBox textBox { get; set; }
|
private bool IsMouseOver { get => isMouseOver; set { isMouseOver = value; this.Invalidate(); } }
|
|
private bool ButtonImageMouseOver { get => buttonImageMouseOver; set { buttonImageMouseOver = value; this.Invalidate(); } }
|
#endregion
|
|
#region 公用属性
|
|
[Category("Wen颜色"), Description("背景颜色")]
|
[DefaultValue(typeof(Color), "37, 37, 38")]
|
public new Color BackColor
|
{
|
get => base.BackColor;
|
set
|
{
|
value = value == Color.Transparent ? Color.FromArgb(37, 37, 38) : value;
|
base.BackColor = value;
|
textBox.BackColor = value;
|
}
|
}
|
|
[Category("Wen颜色"), Description("前景颜色")]
|
[DefaultValue(typeof(Color), "241, 241, 241")]
|
public new Color ForeColor
|
{
|
get => base.ForeColor;
|
set
|
{
|
value = value == Color.Transparent ? Color.FromArgb(37, 37, 38) : value;
|
base.ForeColor = value;
|
textBox.ForeColor = value;
|
}
|
}
|
|
[Category("Wen颜色"), Description("热点颜色或者鼠标在控件颜色")]
|
[DefaultValue(typeof(Color), "0,122,204")]
|
public Color HotColor { get => this.hotColor; set { this.hotColor = value; this.Invalidate(); } }
|
|
[Category("Wen颜色"), Description("获得或设置控件的边框颜色")]
|
[DefaultValue(typeof(Color), "63,63,70")]
|
public Color BorderColor { get => this.borderColor; set { this.borderColor = value; this.Invalidate(); } }
|
|
[Category("Wen颜色"), Description("提示字符颜色")]
|
[DefaultValue(typeof(Color), "153,153,153")]
|
public Color WateTextColor { get => this.wateTextColor; set { this.wateTextColor = value; this.Invalidate(); } }
|
|
|
[Category("Wen设计"), Description("当文本类容为空的时候提示内容")]
|
[DefaultValue(null)]
|
public string WateText { get => wateText; set { wateText = value; this.Invalidate(); } }
|
|
[Category("Wen设计"), Description("尾部按钮图标")]
|
[DefaultValue(null)]
|
public Image ButtonImage
|
{
|
get => buttonImage;
|
set
|
{
|
buttonImage = value;
|
WenLineTextBox_SizeChanged(null, EventArgs.Empty);
|
this.Invalidate();
|
}
|
}
|
#endregion
|
|
#region TextBox 属性
|
|
[Category("Wen设计"), Description("文本内容")]
|
[DefaultValue(null)]
|
[Localizable(true)]
|
public new string Text { get => textBox.Text; set => textBox.Text = value; }
|
|
[Category("Wen设计"), Description("可编辑状态")]
|
[DefaultValue(false)]
|
public bool ReadOnly { get => textBox.ReadOnly; set => textBox.ReadOnly = value; }
|
|
[Category("Wen设计"), Description("文本格式")]
|
public new Font Font { get => textBox.Font; set { textBox.Font = value; base.Font = value; } }
|
|
[Category("Wen设计"), Description("密码掩盖字符")]
|
[DefaultValue('\0')]
|
public char PasswordChar { get => textBox.PasswordChar; set => textBox.PasswordChar = value; }
|
#endregion
|
|
#region 委托
|
|
[Category("Wen"), Description("图标按钮点击事件")]
|
public event EventHandler ButtonClick;
|
|
#endregion
|
|
#region 创建消息 TextBox 消息拦截重绘
|
|
private void TextBox_HandleDestroyed(object sender, EventArgs e)
|
{
|
if (headerNativeWindow != null)
|
{
|
headerNativeWindow = null;
|
}
|
}
|
|
private void TextBox_HandleCreated(object sender, EventArgs e)
|
{
|
if (headerNativeWindow == null)
|
{
|
headerNativeWindow = new HeaderNativeWindow(this);
|
}
|
}
|
|
private class HeaderNativeWindow : NativeWindow
|
{
|
private readonly WenLineTextBox owner;
|
readonly IntPtr header;
|
public HeaderNativeWindow(WenLineTextBox owner)
|
{
|
this.owner = owner;
|
header = owner.textBox.Handle;
|
base.AssignHandle(header);
|
}
|
protected override void WndProc(ref Message m)
|
{
|
base.WndProc(ref m);
|
if (m.Msg == 0xf || m.Msg == 0x133)
|
{
|
using Graphics g = Graphics.FromHwnd(m.HWnd).SetGDIHigh();
|
//当文本为空,提示文本不为空,水印TextBox
|
if (string.IsNullOrEmpty(owner.Text) && !string.IsNullOrEmpty(owner.WateText))
|
{
|
using Brush b = new SolidBrush(owner.WateTextColor);
|
g.DrawString(owner.WateText, owner.Font, b, new Rectangle(0, 0, owner.textBox.Width, owner.textBox.Height), ControlHelper.StringConters);
|
}
|
}
|
}
|
}
|
|
#endregion
|
|
#region 鼠标移动 点击,获得焦点 失去事件
|
private void TextBox_LostFocus(object sender, EventArgs e)
|
{
|
this.Invalidate();
|
}
|
|
private void TextBox_MouseEnter(object sender, EventArgs e)
|
{
|
IsMouseOver = true;
|
}
|
|
private void TextBox_MouseLeave(object sender, EventArgs e)
|
{
|
IsMouseOver = false;
|
ButtonImageMouseOver = false;
|
}
|
private void TextBox_GotFocus(object sender, EventArgs e)
|
{
|
this.Invalidate();
|
}
|
|
//鼠标点击
|
|
private void WenLineTextBox_MouseClick(object sender, MouseEventArgs e)
|
{
|
Rectangle recImageBack = new Rectangle(this.Width - textBox.Height - 10, 0, textBox.Height + 10, this.Height);
|
if (recImageBack.Contains(e.Location) && e.Button == MouseButtons.Left && ButtonImage != null)
|
{
|
ButtonClick?.Invoke(this, e);
|
}
|
}
|
|
//鼠标所在位置
|
private void WenLineTextBox_MouseMove(object sender, MouseEventArgs e)
|
{
|
Rectangle recImageBack = new Rectangle(this.Width - textBox.Height - 10, 0, textBox.Height + 10, this.Height);
|
if (recImageBack.Contains(e.Location) && ButtonImage != null && !ButtonImageMouseOver)
|
{
|
ButtonImageMouseOver = true;
|
}
|
else if (!recImageBack.Contains(e.Location) && ButtonImageMouseOver)
|
{
|
ButtonImageMouseOver = false;
|
}
|
}
|
#endregion
|
|
private void WenLineTextBox_SizeChanged(object sender, EventArgs e)
|
{
|
textBox.Width = ButtonImage == null ? Width - 4 : Width - 16 - textBox.Height;
|
textBox.Location = new Point(2, 5);
|
}
|
|
#region 重写事件 保持控件高度
|
|
//保持控件宽度
|
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
|
{
|
base.SetBoundsCore(x, y, width, textBox.Height + 8, specified);
|
}
|
|
#endregion
|
|
#region 重绘 画外框
|
|
protected override void WenOnPaint(Graphics g, Rectangle rec, PaintEventArgs e)
|
{
|
base.WenOnPaint(g, rec, e);
|
Rectangle reck = new Rectangle(0, 0, Width - 1, Height - 1);
|
|
if (IsMouseOver || textBox.Focused)
|
g.DrawRectangle(new Pen(HotColor), reck);
|
else
|
g.DrawRectangle(new Pen(BorderColor), reck);
|
|
if (ButtonImage != null)
|
{
|
Rectangle recImage = new Rectangle(this.Width - textBox.Height - 6, 4, textBox.Height, textBox.Height);
|
if (ButtonImageMouseOver)
|
{
|
Rectangle recImageBack = new Rectangle(this.Width - textBox.Height - 10, 0, textBox.Height + 10, this.Height);
|
g.FillRectangle(new SolidBrush(this.HotColor), recImageBack);
|
}
|
g.DrawImage(ButtonImage, recImage);
|
}
|
}
|
#endregion
|
}
|
}
|