Winform 自定义文本框
- 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 自定义文本框的更多相关文章
- (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- Xamarin Android自定义文本框
xamarin android 自定义文本框简单的用法 关键点在于,监听EditText的内容变化,不同于java中文本内容变化去调用EditText.addTextChangedListener(m ...
- wxpython 支持python语法高亮的自定义文本框控件的代码
在研发闲暇时间,把开发过程中比较重要的一些代码做个珍藏,下面的代码内容是关于wxpython 支持python语法高亮的自定义文本框控件的代码,应该是对大家也有用. import keywordimp ...
- WPF 自定义文本框输入法 IME 跟随光标
本文告诉大家在 WPF 写一个自定义的文本框,如何实现让输入法跟随光标 本文非小白向,本文适合想开发自定义的文本框,从底层开始开发的文本库的伙伴.在开始之前,期望了解了文本库开发的基础知识 本文实现的 ...
- (三十)c#Winform自定义控件-文本框(三)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (三十一)c#Winform自定义控件-文本框(四)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- JavaScript 自定义文本框光标——初级版
文本框(input或textarea)的光标无法修改样式(除了通过color修改光标颜色).但笔者希望个人创建自己的网站时,文本框的光标有属于自己的风格.所以,尝试模拟文本框的光标,设计有自己风格的光 ...
- (二十八)c#Winform自定义控件-文本框(一)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- winform中文本框的一些案例
项目中经常看到在输入金额时,会加逗号,最近在复习正则表达式,就联系下,界面如下:
随机推荐
- vue-cli · Failed to download repo vuejs-templates/webpack: self signed certificate in certificate chain
vue init webpack <Project name> 报错: vue-cli · Failed to download repo vuejs-templates/webpack: ...
- STM32F0_HAL库驱动描述——基于F1的USART串口IT中断实现解析
从原子F103 HAL库基础串口例程来看HAL程序结构: 从main函数开始,首先是HAL库两个函数的初始化: HAL_Init(): Stm32_Clock_Init(RCC_PLL_MUL9); ...
- DataNode的工作机制
DataNode的工作机制 一个数据块在DataNode以文件的形式在磁盘上保存,分为两个文件,一个是数据本身, 一个是元数据信息(包括数据的长度,校验和,时间戳) 1.DataNode启动后,向Na ...
- Java IO部分面试题
1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 1. Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 2. Byte是计算机操作数据 ...
- php 排序和置顶功能实现
(1)排序操作思路 一般来说都是按照发布时间排序.时间戳大的靠前,所以用倒序desc,而不是asc (2)置顶操作思路: 点击置顶时,修改数据库addtime字段值为当前时间即可.因为排序是按照时间戳 ...
- python课堂整理16---内置函数
1. abs :求绝对值 print(abs(-1)) 2. all()传入一个可迭代对象,对该对象进行bool值运算,若都为True 就返回True,有一个为假,就返回False print(all ...
- zabbix3.4汉化
1.管理员用户登入zabbix页面,更改语言为Chinese(zh_CN),点击Update 2.解决zabbix页面中文乱码 2.1在windows的C:\Windows\Fonts找到字体文件si ...
- Python装饰器 (转)
多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身. #多个装饰器 import time def deco01(func): def wrapper(*args, ** ...
- 【MySQL】java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column
问题原因: 输入内容包含特殊字符,MySQL 中的列不支持. 解决方法 多数是修改 MySQL 的数据库和表结构,CHARSET 改为 utf8mb4,但本人测试还是不能传入 emoji. 后来在代码 ...
- spring boot 学习笔记之前言----环境搭建(如何用Eclipse配置Maven和Spring Boot)
本篇文档来源:https://blog.csdn.net/a565649077/article/details/81042742 1.1 Eclipse准备 (1) 服务器上安装JDK和Mav ...