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. 项目心得——mybatisplus注解

    最近在做的项目中使用了mybatisplus,遇到了一些小问题,特此记录. 1.在sql查询后返回的数据中,会存在一些实体类中本没有的字段: 遇到这个问题时,我理所当然的就去实体类中添加了这个字段,但 ...

  2. R035---偷个懒,用UiPath录制电脑操作过程,迅速实现流程自动化

    ​一.缘起 UiPath可以录制你操作电脑的过程,从而实现自动化. 目前有点鸡肋,因为有些操作过程无法录制,例如: 键盘快捷键 修改键 右键点击 鼠标悬停 即便如此,录制功能有时候还是可以用一下,特别 ...

  3. .md 文件格式

    # .md 文件怎么编写 > 整理一套常用操作,自己来使用 > ## 标题 >> 写法: \# 这是一个一级标题 \## 这是一个二级标题 \### 这是一个三级标题 \### ...

  4. 2019牛客多校第一场 E-ABBA(dp)

    ABBA 题目传送门 解题思路 用dp[i][j]来表示前i+j个字符中,有i个A和j个B的合法情况个数.我们可以让前n个A作为AB的A,因为如果我们用后面的A作为AB的A,我们一定也可以让前面的A对 ...

  5. 《VR入门系列教程》之18---Oculus代码剖析

    代码剖析 原文作者:Tony Parisi     那么,Unity究竟是如何支持Oculus VR运行的?首先,我们来看看Unity场景是如何构建的.在Unity集成开发包中有一个相机预设体,这个预 ...

  6. Aspnet Mvc 前后端分离项目手记(四)vue项目的搭建(一)(iview)

    一项目创建 1,搭建vue-cli脚手架(依赖npm) 没有安装npm的同学,请先使用npm install -g vue-cli ,然后再进行这一步 安装的过程中有几项 ? Project name ...

  7. 解决eclipse oxygen+java 10+Tomcat的Could not create the Java virtual machine问题

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     这个坑我遇到了两次了,所以就写下来以防自己再遇 ...

  8. Linux中tree无法正常显示中文的解决方法

    tree命令以树状图列出目录的内容. 命令 tree -L n 的时候往往是无法正常显示中文的 先开始我以为是tree命令对中文是不支持的,后来百度了一下,网上有几个解决办法 安装新的tree可以解决 ...

  9. 配置没有问题,虚拟机Ubuntu系统ifconfig没有网卡信息

    如果没有问题,前几天都好好的,突然出现这个问题 sudo ifconfig etho up 其中eth0是我的网卡名称

  10. Netty+WebSocket 获取火币交易所数据项目

    Netty+WebSocket 获取火币交易所时时数据项目 先附上项目项目GitHub地址 spring-boot-netty-websocket-huobi 项目简介 本项目使用 SpringBoo ...