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

前提

入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

如果觉得写的还行,请点个 star 支持一下吧

欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

目录

https://blog.csdn.net/kwwwvagaa/article/details/100586547

准备工作

终于到文本框了,文本框将包含原文本框扩展,透明文本框,数字输入文本框,带边框文本框

本文将讲解带边框文本框,可选弹出键盘样式,继承自控件基类UCControlBase

同时用到了无焦点窗体和键盘,如果你还没有了解,请前往查看

(一)c#Winform自定义控件-基类控件

(十九)c#Winform自定义控件-停靠窗体

(十五)c#Winform自定义控件-键盘(二)

(十四)c#Winform自定义控件-键盘(一)

开始

添加用户控件,命名UCTextBoxEx,继承自UCControlBase

属性

复制代码

  1 private bool m_isShowClearBtn = true;
  2         int m_intSelectionStart = 0;
  3         int m_intSelectionLength = 0;
  4         /// <summary>
  5         /// 功能描述:是否显示清理按钮
  6         /// 作  者:HZH
  7         /// 创建日期:2019-02-28 16:13:52
  8         /// </summary>        
  9         [Description("是否显示清理按钮"), Category("自定义")]
 10         public bool IsShowClearBtn
 11         {
 12             get { return m_isShowClearBtn; }
 13             set
 14             {
 15                 m_isShowClearBtn = value;
 16                 if (value)
 17                 {
 18                     btnClear.Visible = !(txtInput.Text == "\r\n") && !string.IsNullOrEmpty(txtInput.Text);
 19                 }
 20                 else
 21                 {
 22                     btnClear.Visible = false;
 23                 }
 24             }
 25         }
 26 
 27         private bool m_isShowSearchBtn = false;
 28         /// <summary>
 29         /// 是否显示查询按钮
 30         /// </summary>
 31 
 32         [Description("是否显示查询按钮"), Category("自定义")]
 33         public bool IsShowSearchBtn
 34         {
 35             get { return m_isShowSearchBtn; }
 36             set
 37             {
 38                 m_isShowSearchBtn = value;
 39                 btnSearch.Visible = value;
 40             }
 41         }
 42 
 43         [Description("是否显示键盘"), Category("自定义")]
 44         public bool IsShowKeyboard
 45         {
 46             get
 47             {
 48                 return btnKeybord.Visible;
 49             }
 50             set
 51             {
 52                 btnKeybord.Visible = value;
 53             }
 54         }
 55         [Description("字体"), Category("自定义")]
 56         public new Font Font
 57         {
 58             get
 59             {
 60                 return this.txtInput.Font;
 61             }
 62             set
 63             {
 64                 this.txtInput.Font = value;
 65             }
 66         }
 67 
 68         [Description("输入类型"), Category("自定义")]
 69         public TextInputType InputType
 70         {
 71             get { return txtInput.InputType; }
 72             set { txtInput.InputType = value; }
 73         }
 74 
 75         /// <summary>
 76         /// 水印文字
 77         /// </summary>
 78         [Description("水印文字"), Category("自定义")]
 79         public string PromptText
 80         {
 81             get
 82             {
 83                 return this.txtInput.PromptText;
 84             }
 85             set
 86             {
 87                 this.txtInput.PromptText = value;
 88             }
 89         }
 90 
 91         [Description("水印字体"), Category("自定义")]
 92         public Font PromptFont
 93         {
 94             get
 95             {
 96                 return this.txtInput.PromptFont;
 97             }
 98             set
 99             {
100                 this.txtInput.PromptFont = value;
101             }
102         }
103 
104         [Description("水印颜色"), Category("自定义")]
105         public Color PromptColor
106         {
107             get
108             {
109                 return this.txtInput.PromptColor;
110             }
111             set
112             {
113                 this.txtInput.PromptColor = value;
114             }
115         }
116 
117         /// <summary>
118         /// 获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。
119         /// </summary>
120         [Description("获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。")]
121         public string RegexPattern
122         {
123             get
124             {
125                 return this.txtInput.RegexPattern;
126             }
127             set
128             {
129                 this.txtInput.RegexPattern = value;
130             }
131         }
132         /// <summary>
133         /// 当InputType为数字类型时,能输入的最大值
134         /// </summary>
135         [Description("当InputType为数字类型时,能输入的最大值。")]
136         public decimal MaxValue
137         {
138             get
139             {
140                 return this.txtInput.MaxValue;
141             }
142             set
143             {
144                 this.txtInput.MaxValue = value;
145             }
146         }
147         /// <summary>
148         /// 当InputType为数字类型时,能输入的最小值
149         /// </summary>
150         [Description("当InputType为数字类型时,能输入的最小值。")]
151         public decimal MinValue
152         {
153             get
154             {
155                 return this.txtInput.MinValue;
156             }
157             set
158             {
159                 this.txtInput.MinValue = value;
160             }
161         }
162         /// <summary>
163         /// 当InputType为数字类型时,能输入的最小值
164         /// </summary>
165         [Description("当InputType为数字类型时,小数位数。")]
166         public int DecLength
167         {
168             get
169             {
170                 return this.txtInput.DecLength;
171             }
172             set
173             {
174                 this.txtInput.DecLength = value;
175             }
176         }
177 
178         private KeyBoardType keyBoardType = KeyBoardType.UCKeyBorderAll_EN;
179         [Description("键盘打开样式"), Category("自定义")]
180         public KeyBoardType KeyBoardType
181         {
182             get { return keyBoardType; }
183             set { keyBoardType = value; }
184         }
185         [Description("查询按钮点击事件"), Category("自定义")]
186         public event EventHandler SearchClick;
187 
188         [Description("文本改变事件"), Category("自定义")]
189         public new event EventHandler TextChanged;
190         [Description("键盘按钮点击事件"), Category("自定义")]
191         public event EventHandler KeyboardClick;
192 
193         [Description("文本"), Category("自定义")]
194         public string InputText
195         {
196             get
197             {
198                 return txtInput.Text;
199             }
200             set
201             {
202                 txtInput.Text = value;
203             }
204         }
205 
206         private bool isFocusColor = true;
207         [Description("获取焦点是否变色"), Category("自定义")]
208         public bool IsFocusColor
209         {
210             get { return isFocusColor; }
211             set { isFocusColor = value; }
212         }
213         private Color _FillColor;
214         public new Color FillColor
215         {
216             get
217             {
218                 return _FillColor;
219             }
220             set
221             {
222                 _FillColor = value;
223                 base.FillColor = value;
224                 this.txtInput.BackColor = value;
225             }
226         }

复制代码

一些事件

复制代码

  1 void UCTextBoxEx_SizeChanged(object sender, EventArgs e)
  2         {
  3             this.txtInput.Location = new Point(this.txtInput.Location.X, (this.Height - txtInput.Height) / 2);
  4         }
  5 
  6 
  7         private void txtInput_TextChanged(object sender, EventArgs e)
  8         {
  9             if (m_isShowClearBtn)
 10             {
 11                 btnClear.Visible = !(txtInput.Text == "\r\n") && !string.IsNullOrEmpty(txtInput.Text);
 12             }
 13             if (TextChanged != null)
 14             {
 15                 TextChanged(sender, e);
 16             }
 17         }
 18 
 19         private void btnClear_MouseDown(object sender, MouseEventArgs e)
 20         {
 21             txtInput.Clear();
 22             txtInput.Focus();
 23         }
 24 
 25         private void btnSearch_MouseDown(object sender, MouseEventArgs e)
 26         {
 27             if (SearchClick != null)
 28             {
 29                 SearchClick(sender, e);
 30             }
 31         }
 32         Forms.FrmAnchor m_frmAnchor;
 33         private void btnKeybord_MouseDown(object sender, MouseEventArgs e)
 34         {
 35             m_intSelectionStart = this.txtInput.SelectionStart;
 36             m_intSelectionLength = this.txtInput.SelectionLength;
 37             this.FindForm().ActiveControl = this;
 38             this.FindForm().ActiveControl = this.txtInput;
 39             switch (keyBoardType)
 40             {
 41                 case KeyBoardType.UCKeyBorderAll_EN:
 42                     if (m_frmAnchor == null)
 43                     {
 44                         if (m_frmAnchor == null)
 45                         {
 46                             UCKeyBorderAll key = new UCKeyBorderAll();
 47                             key.CharType = KeyBorderCharType.CHAR;
 48                             key.RetractClike += (a, b) =>
 49                             {
 50                                 m_frmAnchor.Hide();
 51                             };
 52                             m_frmAnchor = new Forms.FrmAnchor(this, key);
 53                             m_frmAnchor.VisibleChanged += (a, b) =>
 54                             {
 55                                 if (m_frmAnchor.Visible)
 56                                 {
 57                                     this.txtInput.SelectionStart = m_intSelectionStart;
 58                                     this.txtInput.SelectionLength = m_intSelectionLength;
 59                                 }
 60                             };
 61                         }
 62                     }
 63                     break;
 64                 case KeyBoardType.UCKeyBorderAll_Num:
 65 
 66                     if (m_frmAnchor == null)
 67                     {
 68                         UCKeyBorderAll key = new UCKeyBorderAll();
 69                         key.CharType = KeyBorderCharType.NUMBER;
 70                         key.RetractClike += (a, b) =>
 71                         {
 72                             m_frmAnchor.Hide();
 73                         };
 74                         m_frmAnchor = new Forms.FrmAnchor(this, key);
 75                         m_frmAnchor.VisibleChanged += (a, b) =>
 76                         {
 77                             if (m_frmAnchor.Visible)
 78                             {
 79                                 this.txtInput.SelectionStart = m_intSelectionStart;
 80                                 this.txtInput.SelectionLength = m_intSelectionLength;
 81                             }
 82                         };
 83                     }
 84 
 85                     break;
 86                 case KeyBoardType.UCKeyBorderNum:
 87                     if (m_frmAnchor == null)
 88                     {
 89                         UCKeyBorderNum key = new UCKeyBorderNum();
 90                         m_frmAnchor = new Forms.FrmAnchor(this, key);
 91                         m_frmAnchor.VisibleChanged += (a, b) =>
 92                         {
 93                             if (m_frmAnchor.Visible)
 94                             {
 95                                 this.txtInput.SelectionStart = m_intSelectionStart;
 96                                 this.txtInput.SelectionLength = m_intSelectionLength;
 97                             }
 98                         };
 99                     }
100                     break;
101                 case HZH_Controls.Controls.KeyBoardType.UCKeyBorderHand:
102 
103                     m_frmAnchor = new Forms.FrmAnchor(this, new Size(504, 361));
104                     m_frmAnchor.VisibleChanged += m_frmAnchor_VisibleChanged;
105                     m_frmAnchor.Disposed += m_frmAnchor_Disposed;
106                     Panel p = new Panel();
107                     p.Dock = DockStyle.Fill;
108                     p.Name = "keyborder";
109                     m_frmAnchor.Controls.Add(p);
110 
111                     UCBtnExt btnDelete = new UCBtnExt();
112                     btnDelete.Name = "btnDelete";
113                     btnDelete.Size = new Size(80, 28);
114                     btnDelete.FillColor = Color.White;
115                     btnDelete.IsRadius = false;
116                     btnDelete.ConerRadius = 1;
117                     btnDelete.IsShowRect = true;
118                     btnDelete.RectColor = Color.FromArgb(189, 197, 203);
119                     btnDelete.Location = new Point(198, 332);
120                     btnDelete.BtnFont = new System.Drawing.Font("微软雅黑", 8);
121                     btnDelete.BtnText = "删除";
122                     btnDelete.BtnClick += (a, b) =>
123                     {
124                         SendKeys.Send("{BACKSPACE}");
125                     };
126                     m_frmAnchor.Controls.Add(btnDelete);
127                     btnDelete.BringToFront();
128 
129                     UCBtnExt btnEnter = new UCBtnExt();
130                     btnEnter.Name = "btnEnter";
131                     btnEnter.Size = new Size(82, 28);
132                     btnEnter.FillColor = Color.White;
133                     btnEnter.IsRadius = false;
134                     btnEnter.ConerRadius = 1;
135                     btnEnter.IsShowRect = true;
136                     btnEnter.RectColor = Color.FromArgb(189, 197, 203);
137                     btnEnter.Location = new Point(278, 332);
138                     btnEnter.BtnFont = new System.Drawing.Font("微软雅黑", 8);
139                     btnEnter.BtnText = "确定";
140                     btnEnter.BtnClick += (a, b) =>
141                     {
142                         SendKeys.Send("{ENTER}");
143                         m_frmAnchor.Hide();
144                     };
145                     m_frmAnchor.Controls.Add(btnEnter);
146                     btnEnter.BringToFront();
147                     m_frmAnchor.VisibleChanged += (a, b) =>
148                     {
149                         if (m_frmAnchor.Visible)
150                         {
151                             this.txtInput.SelectionStart = m_intSelectionStart;
152                             this.txtInput.SelectionLength = m_intSelectionLength;
153                         }
154                     };
155                     break;
156             }
157             if (!m_frmAnchor.Visible)
158                 m_frmAnchor.Show(this.FindForm());
159             if (KeyboardClick != null)
160             {
161                 KeyboardClick(sender, e);
162             }
163         }
164 
165         void m_frmAnchor_Disposed(object sender, EventArgs e)
166         {
167             if (m_HandAppWin != IntPtr.Zero)
168             {
169                 if (m_HandPWin != null && !m_HandPWin.HasExited)
170                     m_HandPWin.Kill();
171                 m_HandPWin = null;
172                 m_HandAppWin = IntPtr.Zero;
173             }
174         }
175 
176 
177         IntPtr m_HandAppWin;
178         Process m_HandPWin = null;
179         string m_HandExeName = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "HandInput\\handinput.exe");
180 
181         void m_frmAnchor_VisibleChanged(object sender, EventArgs e)
182         {
183             if (m_frmAnchor.Visible)
184             {
185                 var lstP = Process.GetProcessesByName("handinput");
186                 if (lstP.Length > 0)
187                 {
188                     foreach (var item in lstP)
189                     {
190                         item.Kill();
191                     }
192                 }
193                 m_HandAppWin = IntPtr.Zero;
194 
195                 if (m_HandPWin == null)
196                 {
197                     m_HandPWin = null;
198 
199                     m_HandPWin = System.Diagnostics.Process.Start(this.m_HandExeName);
200                     m_HandPWin.WaitForInputIdle();
201                 }
202                 while (m_HandPWin.MainWindowHandle == IntPtr.Zero)
203                 {
204                     Thread.Sleep(10);
205                 }
206                 m_HandAppWin = m_HandPWin.MainWindowHandle;
207                 Control p = m_frmAnchor.Controls.Find("keyborder", false)[0];
208                 SetParent(m_HandAppWin, p.Handle);
209                 ControlHelper.SetForegroundWindow(this.FindForm().Handle);
210                 MoveWindow(m_HandAppWin, -111, -41, 626, 412, true);
211             }
212             else
213             {
214                 if (m_HandAppWin != IntPtr.Zero)
215                 {
216                     if (m_HandPWin != null && !m_HandPWin.HasExited)
217                         m_HandPWin.Kill();
218                     m_HandPWin = null;
219                     m_HandAppWin = IntPtr.Zero;
220                 }
221             }
222         }
223 
224         private void UCTextBoxEx_MouseDown(object sender, MouseEventArgs e)
225         {
226             this.ActiveControl = txtInput;
227         }
228 
229         private void UCTextBoxEx_Load(object sender, EventArgs e)
230         {
231             if (!Enabled)
232             {
233                 base.FillColor = Color.FromArgb(240, 240, 240);
234                 txtInput.BackColor = Color.FromArgb(240, 240, 240);
235             }
236             else
237             {
238                 FillColor = _FillColor;
239                 txtInput.BackColor = _FillColor;
240             }
241         }
242         [DllImport("user32.dll", SetLastError = true)]
243         private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
244 
245         [DllImport("user32.dll", SetLastError = true)]
246         private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
247         [DllImport("user32.dll", EntryPoint = "ShowWindow")]
248         private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
249         [DllImport("user32.dll")]
250         private static extern bool SetWindowPos(IntPtr hWnd, int hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);
251         private const int GWL_STYLE = -16;
252         private const int WS_CHILD = 0x40000000;//设置窗口属性为child
253 
254         [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
255         public static extern int GetWindowLong(IntPtr hwnd, int nIndex);
256 
257         [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
258         public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);
259 
260         [DllImport("user32.dll")]
261         private extern static IntPtr SetActiveWindow(IntPtr handle);

复制代码

你也许注意到了m_frmAnchor_VisibleChanged事件,当键盘窗体显示的时候,启动手写输入软件(这里用了搜狗的手写),将手写软件窗体包含进键盘窗体中来实现手写功能

完整的代码

// 版权所有  黄正辉  交流群:568015492   QQ:623128629
// 文件名称:UCTextBoxEx.cs
// 创建日期:2019-08-15 16:03:58
// 功能描述:TextBox
// 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;

namespace HZH_Controls.Controls
{
    [DefaultEvent("TextChanged")]
    public partial class UCTextBoxEx : UCControlBase
    {
        private bool m_isShowClearBtn = true;
        int m_intSelectionStart = 0;
        int m_intSelectionLength = 0;
        /// <summary>
        /// 功能描述:是否显示清理按钮
        /// 作  者:HZH
        /// 创建日期:2019-02-28 16:13:52
        /// </summary>        
        [Description("是否显示清理按钮"), Category("自定义")]
        public bool IsShowClearBtn
        {
            get { return m_isShowClearBtn; }
            set
            {
                m_isShowClearBtn = value;
                if (value)
                {
                    btnClear.Visible = !(txtInput.Text == "\r\n") && !string.IsNullOrEmpty(txtInput.Text);
                }
                else
                {
                    btnClear.Visible = false;
                }
            }
        }

        private bool m_isShowSearchBtn = false;
        /// <summary>
        /// 是否显示查询按钮
        /// </summary>

        [Description("是否显示查询按钮"), Category("自定义")]
        public bool IsShowSearchBtn
        {
            get { return m_isShowSearchBtn; }
            set
            {
                m_isShowSearchBtn = value;
                btnSearch.Visible = value;
            }
        }

        [Description("是否显示键盘"), Category("自定义")]
        public bool IsShowKeyboard
        {
            get
            {
                return btnKeybord.Visible;
            }
            set
            {
                btnKeybord.Visible = value;
            }
        }
        [Description("字体"), Category("自定义")]
        public new Font Font
        {
            get
            {
                return this.txtInput.Font;
            }
            set
            {
                this.txtInput.Font = value;
            }
        }

        [Description("输入类型"), Category("自定义")]
        public TextInputType InputType
        {
            get { return txtInput.InputType; }
            set { txtInput.InputType = value; }
        }

        /// <summary>
        /// 水印文字
        /// </summary>
        [Description("水印文字"), Category("自定义")]
        public string PromptText
        {
            get
            {
                return this.txtInput.PromptText;
            }
            set
            {
                this.txtInput.PromptText = value;
            }
        }

        [Description("水印字体"), Category("自定义")]
        public Font PromptFont
        {
            get
            {
                return this.txtInput.PromptFont;
            }
            set
            {
                this.txtInput.PromptFont = value;
            }
        }

        [Description("水印颜色"), Category("自定义")]
        public Color PromptColor
        {
            get
            {
                return this.txtInput.PromptColor;
            }
            set
            {
                this.txtInput.PromptColor = value;
            }
        }

        /// <summary>
        /// 获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。
        /// </summary>
        [Description("获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。")]
        public string RegexPattern
        {
            get
            {
                return this.txtInput.RegexPattern;
            }
            set
            {
                this.txtInput.RegexPattern = value;
            }
        }
        /// <summary>
        /// 当InputType为数字类型时,能输入的最大值
        /// </summary>
        [Description("当InputType为数字类型时,能输入的最大值。")]
        public decimal MaxValue
        {
            get
            {
                return this.txtInput.MaxValue;
            }
            set
            {
                this.txtInput.MaxValue = value;
            }
        }
        /// <summary>
        /// 当InputType为数字类型时,能输入的最小值
        /// </summary>
        [Description("当InputType为数字类型时,能输入的最小值。")]
        public decimal MinValue
        {
            get
            {
                return this.txtInput.MinValue;
            }
            set
            {
                this.txtInput.MinValue = value;
            }
        }
        /// <summary>
        /// 当InputType为数字类型时,能输入的最小值
        /// </summary>
        [Description("当InputType为数字类型时,小数位数。")]
        public int DecLength
        {
            get
            {
                return this.txtInput.DecLength;
            }
            set
            {
                this.txtInput.DecLength = value;
            }
        }

        private KeyBoardType keyBoardType = KeyBoardType.UCKeyBorderAll_EN;
        [Description("键盘打开样式"), Category("自定义")]
        public KeyBoardType KeyBoardType
        {
            get { return keyBoardType; }
            set { keyBoardType = value; }
        }
        [Description("查询按钮点击事件"), Category("自定义")]
        public event EventHandler SearchClick;

        [Description("文本改变事件"), Category("自定义")]
        public new event EventHandler TextChanged;
        [Description("键盘按钮点击事件"), Category("自定义")]
        public event EventHandler KeyboardClick;

        [Description("文本"), Category("自定义")]
        public string InputText
        {
            get
            {
                return txtInput.Text;
            }
            set
            {
                txtInput.Text = value;
            }
        }

        private bool isFocusColor = true;
        [Description("获取焦点是否变色"), Category("自定义")]
        public bool IsFocusColor
        {
            get { return isFocusColor; }
            set { isFocusColor = value; }
        }
        private Color _FillColor;
        public new Color FillColor
        {
            get
            {
                return _FillColor;
            }
            set
            {
                _FillColor = value;
                base.FillColor = value;
                this.txtInput.BackColor = value;
            }
        }
        public UCTextBoxEx()
        {
            InitializeComponent();
            txtInput.SizeChanged += UCTextBoxEx_SizeChanged;
            this.SizeChanged += UCTextBoxEx_SizeChanged;
            txtInput.GotFocus += (a, b) =>
            {
                if (isFocusColor)
                    this.RectColor = Color.FromArgb(78, 169, 255);
            };
            txtInput.LostFocus += (a, b) =>
            {
                if (isFocusColor)
                    this.RectColor = Color.FromArgb(220, 220, 220);
            };
        }

        void UCTextBoxEx_SizeChanged(object sender, EventArgs e)
        {
            this.txtInput.Location = new Point(this.txtInput.Location.X, (this.Height - txtInput.Height) / 2);
        }


        private void txtInput_TextChanged(object sender, EventArgs e)
        {
            if (m_isShowClearBtn)
            {
                btnClear.Visible = !(txtInput.Text == "\r\n") && !string.IsNullOrEmpty(txtInput.Text);
            }
            if (TextChanged != null)
            {
                TextChanged(sender, e);
            }
        }

        private void btnClear_MouseDown(object sender, MouseEventArgs e)
        {
            txtInput.Clear();
            txtInput.Focus();
        }

        private void btnSearch_MouseDown(object sender, MouseEventArgs e)
        {
            if (SearchClick != null)
            {
                SearchClick(sender, e);
            }
        }
        Forms.FrmAnchor m_frmAnchor;
        private void btnKeybord_MouseDown(object sender, MouseEventArgs e)
        {
            m_intSelectionStart = this.txtInput.SelectionStart;
            m_intSelectionLength = this.txtInput.SelectionLength;
            this.FindForm().ActiveControl = this;
            this.FindForm().ActiveControl = this.txtInput;
            switch (keyBoardType)
            {
                case KeyBoardType.UCKeyBorderAll_EN:
                    if (m_frmAnchor == null)
                    {
                        if (m_frmAnchor == null)
                        {
                            UCKeyBorderAll key = new UCKeyBorderAll();
                            key.CharType = KeyBorderCharType.CHAR;
                            key.RetractClike += (a, b) =>
                            {
                                m_frmAnchor.Hide();
                            };
                            m_frmAnchor = new Forms.FrmAnchor(this, key);
                            m_frmAnchor.VisibleChanged += (a, b) =>
                            {
                                if (m_frmAnchor.Visible)
                                {
                                    this.txtInput.SelectionStart = m_intSelectionStart;
                                    this.txtInput.SelectionLength = m_intSelectionLength;
                                }
                            };
                        }
                    }
                    break;
                case KeyBoardType.UCKeyBorderAll_Num:

                    if (m_frmAnchor == null)
                    {
                        UCKeyBorderAll key = new UCKeyBorderAll();
                        key.CharType = KeyBorderCharType.NUMBER;
                        key.RetractClike += (a, b) =>
                        {
                            m_frmAnchor.Hide();
                        };
                        m_frmAnchor = new Forms.FrmAnchor(this, key);
                        m_frmAnchor.VisibleChanged += (a, b) =>
                        {
                            if (m_frmAnchor.Visible)
                            {
                                this.txtInput.SelectionStart = m_intSelectionStart;
                                this.txtInput.SelectionLength = m_intSelectionLength;
                            }
                        };
                    }

                    break;
                case KeyBoardType.UCKeyBorderNum:
                    if (m_frmAnchor == null)
                    {
                        UCKeyBorderNum key = new UCKeyBorderNum();
                        m_frmAnchor = new Forms.FrmAnchor(this, key);
                        m_frmAnchor.VisibleChanged += (a, b) =>
                        {
                            if (m_frmAnchor.Visible)
                            {
                                this.txtInput.SelectionStart = m_intSelectionStart;
                                this.txtInput.SelectionLength = m_intSelectionLength;
                            }
                        };
                    }
                    break;
                case HZH_Controls.Controls.KeyBoardType.UCKeyBorderHand:

                    m_frmAnchor = new Forms.FrmAnchor(this, new Size(504, 361));
                    m_frmAnchor.VisibleChanged += m_frmAnchor_VisibleChanged;
                    m_frmAnchor.Disposed += m_frmAnchor_Disposed;
                    Panel p = new Panel();
                    p.Dock = DockStyle.Fill;
                    p.Name = "keyborder";
                    m_frmAnchor.Controls.Add(p);

                    UCBtnExt btnDelete = new UCBtnExt();
                    btnDelete.Name = "btnDelete";
                    btnDelete.Size = new Size(80, 28);
                    btnDelete.FillColor = Color.White;
                    btnDelete.IsRadius = false;
                    btnDelete.ConerRadius = 1;
                    btnDelete.IsShowRect = true;
                    btnDelete.RectColor = Color.FromArgb(189, 197, 203);
                    btnDelete.Location = new Point(198, 332);
                    btnDelete.BtnFont = new System.Drawing.Font("微软雅黑", 8);
                    btnDelete.BtnText = "删除";
                    btnDelete.BtnClick += (a, b) =>
                    {
                        SendKeys.Send("{BACKSPACE}");
                    };
                    m_frmAnchor.Controls.Add(btnDelete);
                    btnDelete.BringToFront();

                    UCBtnExt btnEnter = new UCBtnExt();
                    btnEnter.Name = "btnEnter";
                    btnEnter.Size = new Size(82, 28);
                    btnEnter.FillColor = Color.White;
                    btnEnter.IsRadius = false;
                    btnEnter.ConerRadius = 1;
                    btnEnter.IsShowRect = true;
                    btnEnter.RectColor = Color.FromArgb(189, 197, 203);
                    btnEnter.Location = new Point(278, 332);
                    btnEnter.BtnFont = new System.Drawing.Font("微软雅黑", 8);
                    btnEnter.BtnText = "确定";
                    btnEnter.BtnClick += (a, b) =>
                    {
                        SendKeys.Send("{ENTER}");
                        m_frmAnchor.Hide();
                    };
                    m_frmAnchor.Controls.Add(btnEnter);
                    btnEnter.BringToFront();
                    m_frmAnchor.VisibleChanged += (a, b) =>
                    {
                        if (m_frmAnchor.Visible)
                        {
                            this.txtInput.SelectionStart = m_intSelectionStart;
                            this.txtInput.SelectionLength = m_intSelectionLength;
                        }
                    };
                    break;
            }
            if (!m_frmAnchor.Visible)
                m_frmAnchor.Show(this.FindForm());
            if (KeyboardClick != null)
            {
                KeyboardClick(sender, e);
            }
        }

        void m_frmAnchor_Disposed(object sender, EventArgs e)
        {
            if (m_HandAppWin != IntPtr.Zero)
            {
                if (m_HandPWin != null && !m_HandPWin.HasExited)
                    m_HandPWin.Kill();
                m_HandPWin = null;
                m_HandAppWin = IntPtr.Zero;
            }
        }


        IntPtr m_HandAppWin;
        Process m_HandPWin = null;
        string m_HandExeName = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "HandInput\\handinput.exe");

        void m_frmAnchor_VisibleChanged(object sender, EventArgs e)
        {
            if (m_frmAnchor.Visible)
            {
                var lstP = Process.GetProcessesByName("handinput");
                if (lstP.Length > 0)
                {
                    foreach (var item in lstP)
                    {
                        item.Kill();
                    }
                }
                m_HandAppWin = IntPtr.Zero;

                if (m_HandPWin == null)
                {
                    m_HandPWin = null;

                    m_HandPWin = System.Diagnostics.Process.Start(this.m_HandExeName);
                    m_HandPWin.WaitForInputIdle();
                }
                while (m_HandPWin.MainWindowHandle == IntPtr.Zero)
                {
                    Thread.Sleep(10);
                }
                m_HandAppWin = m_HandPWin.MainWindowHandle;
                Control p = m_frmAnchor.Controls.Find("keyborder", false)[0];
                SetParent(m_HandAppWin, p.Handle);
                ControlHelper.SetForegroundWindow(this.FindForm().Handle);
                MoveWindow(m_HandAppWin, -111, -41, 626, 412, true);
            }
            else
            {
                if (m_HandAppWin != IntPtr.Zero)
                {
                    if (m_HandPWin != null && !m_HandPWin.HasExited)
                        m_HandPWin.Kill();
                    m_HandPWin = null;
                    m_HandAppWin = IntPtr.Zero;
                }
            }
        }

        private void UCTextBoxEx_MouseDown(object sender, MouseEventArgs e)
        {
            this.ActiveControl = txtInput;
        }

        private void UCTextBoxEx_Load(object sender, EventArgs e)
        {
            if (!Enabled)
            {
                base.FillColor = Color.FromArgb(240, 240, 240);
                txtInput.BackColor = Color.FromArgb(240, 240, 240);
            }
            else
            {
                FillColor = _FillColor;
                txtInput.BackColor = _FillColor;
            }
        }
        [DllImport("user32.dll", SetLastError = true)]
        private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
        [DllImport("user32.dll", EntryPoint = "ShowWindow")]
        private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
        [DllImport("user32.dll")]
        private static extern bool SetWindowPos(IntPtr hWnd, int hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);
        private const int GWL_STYLE = -16;
        private const int WS_CHILD = 0x40000000;//设置窗口属性为child

        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        public static extern int GetWindowLong(IntPtr hwnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

        [DllImport("user32.dll")]
        private extern static IntPtr SetActiveWindow(IntPtr handle);
    }
}
namespace HZH_Controls.Controls
{
    partial class UCTextBoxEx
    {
        /// <summary> 
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码

        /// <summary> 
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UCTextBoxEx));
            this.txtInput = new HZH_Controls.Controls.TextBoxEx();
            this.imageList1 = new System.Windows.Forms.ImageList();
            this.btnClear = new System.Windows.Forms.Panel();
            this.btnKeybord = new System.Windows.Forms.Panel();
            this.btnSearch = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            // 
            // txtInput
            // 
            this.txtInput.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
            this.txtInput.BorderStyle = System.Windows.Forms.BorderStyle.None;
            this.txtInput.DecLength = 2;
            this.txtInput.Font = new System.Drawing.Font("微软雅黑", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
            this.txtInput.InputType = TextInputType.NotControl;
            this.txtInput.Location = new System.Drawing.Point(8, 9);
            this.txtInput.Margin = new System.Windows.Forms.Padding(3, 3, 10, 3);
            this.txtInput.MaxValue = new decimal(new int[] {
            1000000,
            0,
            0,
            0});
            this.txtInput.MinValue = new decimal(new int[] {
            1000000,
            0,
            0,
            -2147483648});
            this.txtInput.MyRectangle = new System.Drawing.Rectangle(0, 0, 0, 0);
            this.txtInput.Name = "txtInput";
            this.txtInput.OldText = null;
            this.txtInput.PromptColor = System.Drawing.Color.Gray;
            this.txtInput.PromptFont = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
            this.txtInput.PromptText = "";
            this.txtInput.RegexPattern = "";
            this.txtInput.Size = new System.Drawing.Size(309, 24);
            this.txtInput.TabIndex = 0;
            this.txtInput.TextChanged += new System.EventHandler(this.txtInput_TextChanged);
            // 
            // imageList1
            // 
            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
            this.imageList1.Images.SetKeyName(0, "ic_cancel_black_24dp.png");
            this.imageList1.Images.SetKeyName(1, "ic_search_black_24dp.png");
            this.imageList1.Images.SetKeyName(2, "keyboard.png");
            // 
            // btnClear
            // 
            this.btnClear.BackgroundImage = global::HZH_Controls.Properties.Resources.input_clear;
            this.btnClear.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
            this.btnClear.Cursor = System.Windows.Forms.Cursors.Default;
            this.btnClear.Dock = System.Windows.Forms.DockStyle.Right;
            this.btnClear.Location = new System.Drawing.Point(227, 5);
            this.btnClear.Name = "btnClear";
            this.btnClear.Size = new System.Drawing.Size(30, 32);
            this.btnClear.TabIndex = 4;
            this.btnClear.Visible = false;
            this.btnClear.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnClear_MouseDown);
            // 
            // btnKeybord
            // 
            this.btnKeybord.BackgroundImage = global::HZH_Controls.Properties.Resources.keyboard;
            this.btnKeybord.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
            this.btnKeybord.Cursor = System.Windows.Forms.Cursors.Default;
            this.btnKeybord.Dock = System.Windows.Forms.DockStyle.Right;
            this.btnKeybord.Location = new System.Drawing.Point(257, 5);
            this.btnKeybord.Name = "btnKeybord";
            this.btnKeybord.Size = new System.Drawing.Size(30, 32);
            this.btnKeybord.TabIndex = 6;
            this.btnKeybord.Visible = false;
            this.btnKeybord.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnKeybord_MouseDown);
            // 
            // btnSearch
            // 
            this.btnSearch.BackgroundImage = global::HZH_Controls.Properties.Resources.ic_search_black_24dp;
            this.btnSearch.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
            this.btnSearch.Cursor = System.Windows.Forms.Cursors.Default;
            this.btnSearch.Dock = System.Windows.Forms.DockStyle.Right;
            this.btnSearch.Location = new System.Drawing.Point(287, 5);
            this.btnSearch.Name = "btnSearch";
            this.btnSearch.Size = new System.Drawing.Size(30, 32);
            this.btnSearch.TabIndex = 5;
            this.btnSearch.Visible = false;
            this.btnSearch.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnSearch_MouseDown);
            // 
            // UCTextBoxEx
            // 
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
            this.BackColor = System.Drawing.Color.Transparent;
            this.ConerRadius = 5;
            this.Controls.Add(this.btnClear);
            this.Controls.Add(this.btnKeybord);
            this.Controls.Add(this.btnSearch);
            this.Controls.Add(this.txtInput);
            this.Cursor = System.Windows.Forms.Cursors.IBeam;
            this.IsShowRect = true;
            this.IsRadius = true;
            this.Name = "UCTextBoxEx";
            this.Padding = new System.Windows.Forms.Padding(5);
            this.Size = new System.Drawing.Size(322, 42);
            this.Load += new System.EventHandler(this.UCTextBoxEx_Load);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UCTextBoxEx_MouseDown);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.ImageList imageList1;
        public TextBoxEx txtInput;
        private System.Windows.Forms.Panel btnClear;
        private System.Windows.Forms.Panel btnSearch;
        private System.Windows.Forms.Panel btnKeybord;
    }
}

用处及效果

 

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星 星吧

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值