打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Winform带序号的输入框,你用过吗

前言

大概是我孤陋寡闻了吧,泡在百度上翻来覆去没找到类似的控件;我想可能大家是不需要,其实,我也不太需要,就是那么突发奇想的,就想写一个这样的控件出来。。。

Bejson访问过吧?Notepad++用过吧?发现一个事情没有?左边都有行数导航。嗯,就是这个东西。没用过?那下面看个图




有用没用?好像没用,又好像有......





开发环境:.NET Framework版本:4.8

开发工具:Visual Studio 2022

 













实现步骤

  1. 先说下实现原理,其实就是两个TextBox控件合并到一起,然后最主要的一点就是保持滚动条同步,这也是最难搞的一点,众所周知,Winform的滚动条死硬死硬的,可自定义化程度是真的低。
  2. 老规矩,创建自定义控件,这里首先需要创建的是右边的输入框,需要提供各种情况下关于滚动条的位置,部分代码如下
protected override void OnMouseMove(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { SetScroll(); } base.OnMouseMove(e); } protected override bool ProcessCmdKey(ref Message m, Keys keyData) { if (keyData == Keys.Left || keyData == Keys.Right || keyData == Keys.Down || keyData == Keys.Up) { SetScroll(); } return base.ProcessCmdKey(ref m, keyData); }
protected override void OnMouseWheel(MouseEventArgs e) { SetScroll(); }
protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); SetScroll(); } private void SetScroll() { if (AsyncScroll != null) { BeginInvoke(new Action(() => { int Pos = GetScrollPos(Handle, SB_VERT); AsyncScroll(Pos); })); GC.Collect(); }
}

  1. 然后再创建一个自定义控件,将左边的设置不可输入等,右边引用上面的控件,并且处理Text值的改变事件以及滚动条改变时跟随

  public partial class NumTextBox : UserControl    {        const int SB_VERT = 1;        const int WM_VSCROLL = 0X0115;        const int SB_THUMBPOSITION = 4;        [DllImport("user32.dll")]        static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);        [DllImport("user32.dll")]        private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);        public override string Text        {            get { return txt_text.Text; }            set { txt_text.Text = value; }        }        public NumTextBox()        {            InitializeComponent();            txt_text.AsyncScroll += pos =>            {                SetScrollPos(txt_num.Handle, SB_VERT, (SB_THUMBPOSITION + 0x10000 * pos), true);                SendMessage(txt_num.Handle, WM_VSCROLL, (IntPtr)(SB_THUMBPOSITION + 0x10000 * pos), IntPtr.Zero);            };        }        protected override void OnLoad(EventArgs e)        {            base.OnLoad(e);            txt_num.BackColor = panel_split.BackColor = Color.WhiteSmoke;        }        private void txt_text_TextChanged(object sender, EventArgs e)        {            txt_num.Clear();            string[] lines = txt_text.Text.Split('\n');            string[] nums = new string[lines.Length];            for (int i = 1; i <= lines.Length; i++)            {                nums[i - 1] = i + "";            }            txt_num.Lines = nums;        }    }
 

实现效果

 



☛☛☛点击此处下载源码☚☚☚


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
抓取扫描枪扫描数据的案例
窗体DataGridView控件中按回车键时,单元格向下移动,如何能改成向右移动
R语言:快速读取txt文件
python逐行读txt文件,并统一每行加字符串
数字字符串转换成浮点型数组(菜鸟级别)
上升下降字符串
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服