using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace TomWinform.CustomerControl
{
public partial class BorderTextBox : TextBox
{
//设置Rect消息
private const int EM_SETRECT = ;
//获取Rect消息
private const int EM_GETRECT = ;
//粘贴消息
private const int WM_PASTE = 0x0302; private Color borderColor = Color.Black;
private float leftBorderSize = ;
private float rightBorderSize = ;
private float topBorderSize = ;
private float bottomBorderSize = ;
private Padding textPadding = new Padding();
private bool allowReturn = false; [System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr GetWindowDC(IntPtr hWnd);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam); public BorderTextBox()
{
InitializeComponent();
} //画边框
private void DrawBorder(IntPtr hDC)
{
Graphics g = Graphics.FromHdc(hDC); #region 左边框
if (leftBorderSize > )
{
Pen penLeft = new Pen(borderColor, leftBorderSize);
Point[] pointLeft = new Point[];
pointLeft[] = new Point(, );
pointLeft[] = new Point(, this.Width - );
g.DrawLine(penLeft, pointLeft[], pointLeft[]);
}
#endregion #region 右边框
if (rightBorderSize > )
{
Pen penRight = new Pen(borderColor, rightBorderSize);
Point[] pointRight = new Point[];
pointRight[] = new Point(this.Width - , );
pointRight[] = new Point(this.Width - , this.Height - );
g.DrawLine(penRight, pointRight[], pointRight[]);
}
#endregion #region 上边框
if (topBorderSize > )
{
Pen penTop = new Pen(borderColor, topBorderSize);
Point[] pointTop = new Point[];
pointTop[] = new Point(, );
pointTop[] = new Point(this.Width - , );
g.DrawLine(penTop, pointTop[], pointTop[]);
}
#endregion #region 下边框
if (bottomBorderSize > )
{
Pen penBottom = new Pen(borderColor, bottomBorderSize);
Point[] pointBottom = new Point[];
pointBottom[] = new Point(, this.Height - );
pointBottom[] = new Point(this.Width - , this.Height - );
g.DrawLine(penBottom, pointBottom[], pointBottom[]);
}
#endregion
} public void SetTextDispLayout()
{
if (Text == "")
return;
//当允许多行和禁止会车时,Paddin有效
if (this.Multiline && (!this.WordWrap))
{
Rectangle rect = new Rectangle();
SendMessage(this.Handle, EM_GETRECT, (IntPtr), ref rect);
//SizeF size = CreateGraphics().MeasureString(Text, Font);
//rect.Y = (int)(Height - size.Height) / 2 + TextPadding.Top;
rect.Y = textPadding.Top;
rect.X = textPadding.Left;
rect.Height = Height;
rect.Width = Width - textPadding.Right - textPadding.Left;
SendMessage(this.Handle, EM_SETRECT, IntPtr.Zero, ref rect);
}
} protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
} protected override void WndProc(ref Message m)
{
//string str = "";
//bool flag = false;
//int i = 0;
//if (m.Msg == 0x0204)
// i++;
//if (!AllowReturn
// && m.Msg == WM_PASTE
// && System.Windows.Forms.Clipboard.ContainsText())
//{
// str = System.Windows.Forms.Clipboard.GetText();
// System.Windows.Forms.Clipboard.Clear();
// string nstr = str.Replace(char.ConvertFromUtf32((int)Keys.Return), "").Replace(char.ConvertFromUtf32((int)Keys.LineFeed), "");
// System.Windows.Forms.Clipboard.SetText(nstr);
// if (str.Length > 0) flag = true;
//} base.WndProc(ref m);
if (m.Msg == 0xf || m.Msg == 0x133)
{
IntPtr hDC = GetWindowDC(m.HWnd);
if (hDC.ToInt32() == )
return; DrawBorder(hDC); //返回结果
m.Result = IntPtr.Zero;
//释放
ReleaseDC(m.HWnd, hDC);
} //if (flag)
//{
// flag = false;
// System.Windows.Forms.Clipboard.SetText(str);
// str = "";
//}
} #region 属性
[Description("边框颜色"), Category("自定义属性")]
public Color BorderColor
{
get { return borderColor; }
set { borderColor = value; this.Invalidate(); }
}
[Description("左边框宽度"), Category("自定义属性")]
public float LeftBorderSize
{
get { return leftBorderSize; }
set { leftBorderSize = value; this.Invalidate(); }
}
[Description("右边框宽度"), Category("自定义属性")]
public float RightBorderSize
{
get { return rightBorderSize; }
set { rightBorderSize = value; this.Invalidate(); }
}
[Description("上边框宽度"), Category("自定义属性")]
public float TopBorderSize
{
get { return topBorderSize; }
set { topBorderSize = value; this.Invalidate(); }
}
[Description("下边框宽度"), Category("自定义属性")]
public float BottomBorderSize
{
get { return bottomBorderSize; }
set { bottomBorderSize = value; this.Invalidate(); }
}
[/*DisplayName("內邊距")*/Description("文本内边距,当允许多行和禁止回车时有效"), Category("自定义属性")]
public Padding TextPadding
{
get { return textPadding; }
set { textPadding = value; SetTextDispLayout(); }
}
[/*DisplayName("允許回車")*/Description("是否允许回车"), Category("自定义属性")]
public bool AllowReturn
{
get { return allowReturn; }
set { allowReturn = value;this.Invalidate(); }
}
#endregion #region 事件
protected override void OnKeyPress(KeyPressEventArgs e)
{
//如果不允许回车 屏蔽回车 换行键值
if (!AllowReturn
&& ((int)e.KeyChar == (int)Keys.Return || (int)e.KeyChar == (int)Keys.LineFeed))
{
e.Handled = true;
}
base.OnKeyPress(e);
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e); SetTextDispLayout();
}
#endregion }
}

Winform 自定义文本框的更多相关文章

  1. (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  2. Xamarin Android自定义文本框

    xamarin android 自定义文本框简单的用法 关键点在于,监听EditText的内容变化,不同于java中文本内容变化去调用EditText.addTextChangedListener(m ...

  3. wxpython 支持python语法高亮的自定义文本框控件的代码

    在研发闲暇时间,把开发过程中比较重要的一些代码做个珍藏,下面的代码内容是关于wxpython 支持python语法高亮的自定义文本框控件的代码,应该是对大家也有用. import keywordimp ...

  4. WPF 自定义文本框输入法 IME 跟随光标

    本文告诉大家在 WPF 写一个自定义的文本框,如何实现让输入法跟随光标 本文非小白向,本文适合想开发自定义的文本框,从底层开始开发的文本库的伙伴.在开始之前,期望了解了文本库开发的基础知识 本文实现的 ...

  5. (三十)c#Winform自定义控件-文本框(三)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  6. (三十一)c#Winform自定义控件-文本框(四)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. JavaScript 自定义文本框光标——初级版

    文本框(input或textarea)的光标无法修改样式(除了通过color修改光标颜色).但笔者希望个人创建自己的网站时,文本框的光标有属于自己的风格.所以,尝试模拟文本框的光标,设计有自己风格的光 ...

  8. (二十八)c#Winform自定义控件-文本框(一)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  9. winform中文本框的一些案例

    项目中经常看到在输入金额时,会加逗号,最近在复习正则表达式,就联系下,界面如下:

随机推荐

  1. springmvc上传文件踩过的坑

    @RequestMapping("/addTweet") public String addTweet(TweetVO tweetVO, HttpServletRequest re ...

  2. 剑指offer第二版-2.实现单例模式

    面试题2:实现单例模式 题目要求: 设计一个类,只能生成该类的一个实例. /** * 单例模式 * 定义:指实现了特殊模式的类,该类仅能被实例化一次,产生唯一的一个对象 * 应用举例:windows的 ...

  3. Mysql两张表的关联字段不一致

    工作中遇到了一个问题,邮件系统群发失败,后来经过排查查找到了原因 原来是因为mysql中的两张表的关联字段竟然不一致, 表A mysql> desc rm_user_router;+------ ...

  4. Maven(一)Maven 的概念和安装

    Maven 的概念和安装 Maven 是什么 首先 Maven 肯定是一个造福人类的好东西,它可以省去我们构建项目中引入 jar 包时的麻烦,还有利于项目的模块化开发等等等好处.在如今项目中大体都是使 ...

  5. error: 'commit' is not possible because you have unmerged files.

    解决方案: 1.把修改的文件add下,如:git add bidder_mod/src/common/dragon_bidder_data.cc2.git commit

  6. [leetcode] 290. Word Pattern (easy)

    原题 思路: 建立两个哈希表,分别保存: 1 模式 :单词 2 单词 :是否出现过 水题 /** * @param {string} pattern * @param {string} str * @ ...

  7. 使用ASM实现动态代理

    如果对我这段代码感兴趣,直接拷贝测试debug,要不然你不知道我写的是什么鬼,如果有什么问题,可以告诉我. 一.实现动态代理,首先得考虑有应该定义哪些类,根据JDK的动态代理思想,那么它就应该有一个生 ...

  8. 02 | 健康之路 kubernetes(k8s) 实践之路 : 生产可用环境及验证

    上一篇< 01 | 健康之路 kubernetes(k8s) 实践之路 : 开篇及概况 >我们介绍了我们的大体情况,也算迈出了第一步.今天我们主要介绍下我们生产可用的集群架设方案.涉及了整 ...

  9. 前端js性能优化的要点

    1 尽量少使用全局查找,比如全局变量,如果要多次使用,可以将全局变量存为局部变量再使用 eg:function(){ var body=document.body; alert(body): body ...

  10. react开发中的小细节

    目前开始使用react余遇到的问题还不是很多,但还是希望总结一下. react中的属性prop: 在react中组件的父子组件的通信是基于prop的,当然对于底层的东西不是特别了解,但可以说一说它的基 ...