(三十一)c#Winform自定义控件-文本框(四)-HZHControls
官网
http://www.hzhcontrols.com
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492
目录
https://www.cnblogs.com/bfyx/p/11364884.html
准备工作
终于到文本框了,文本框将包含原文本框扩展,透明文本框,数字输入文本框,带边框文本框
本文将讲解带边框文本框,可选弹出键盘样式,继承自控件基类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 ///5 /// 功能描述:是否显示清理按钮 6 /// 作 者:HZH 7 /// 创建日期:2019-02-28 16:13:52 8 /// 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 /// 29 /// 是否显示查询按钮 30 /// 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 /// 76 /// 水印文字 77 /// 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 /// 118 /// 获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。 119 /// 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 /// 133 /// 当InputType为数字类型时,能输入的最大值 134 /// 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 /// 148 /// 当InputType为数字类型时,能输入的最小值 149 /// 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 /// 163 /// 当InputType为数字类型时,能输入的最小值 164 /// 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事件,当键盘窗体显示的时候,启动手写输入软件(这里用了搜狗的手写),将手写软件窗体包含进键盘窗体中来实现手写功能
完整的代码
1 // 版权所有 黄正辉 交流群:568015492 QQ:623128629 2 // 文件名称:UCTextBoxEx.cs 3 // 创建日期:2019-08-15 16:03:58 4 // 功能描述:TextBox 5 // 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 6 using System; 7 using System.Collections.Generic; 8 using System.ComponentModel; 9 using System.Drawing; 10 using System.Data; 11 using System.Linq; 12 using System.Text; 13 using System.Windows.Forms; 14 using System.Runtime.InteropServices; 15 using System.Diagnostics; 16 using System.Threading; 17 18 namespace HZH_Controls.Controls 19 { 20 [DefaultEvent("TextChanged")] 21 public partial class UCTextBoxEx : UCControlBase 22 { 23 private bool m_isShowClearBtn = true; 24 int m_intSelectionStart = 0; 25 int m_intSelectionLength = 0; 26 ///27 /// 功能描述:是否显示清理按钮 28 /// 作 者:HZH 29 /// 创建日期:2019-02-28 16:13:52 30 /// 31 [Description("是否显示清理按钮"), Category("自定义")] 32 public bool IsShowClearBtn 33 { 34 get { return m_isShowClearBtn; } 35 set 36 { 37 m_isShowClearBtn = value; 38 if (value) 39 { 40 btnClear.Visible = !(txtInput.Text == "\r\n") && !string.IsNullOrEmpty(txtInput.Text); 41 } 42 else 43 { 44 btnClear.Visible = false; 45 } 46 } 47 } 48 49 private bool m_isShowSearchBtn = false; 50 /// 51 /// 是否显示查询按钮 52 /// 53 54 [Description("是否显示查询按钮"), Category("自定义")] 55 public bool IsShowSearchBtn 56 { 57 get { return m_isShowSearchBtn; } 58 set 59 { 60 m_isShowSearchBtn = value; 61 btnSearch.Visible = value; 62 } 63 } 64 65 [Description("是否显示键盘"), Category("自定义")] 66 public bool IsShowKeyboard 67 { 68 get 69 { 70 return btnKeybord.Visible; 71 } 72 set 73 { 74 btnKeybord.Visible = value; 75 } 76 } 77 [Description("字体"), Category("自定义")] 78 public new Font Font 79 { 80 get 81 { 82 return this.txtInput.Font; 83 } 84 set 85 { 86 this.txtInput.Font = value; 87 } 88 } 89 90 [Description("输入类型"), Category("自定义")] 91 public TextInputType InputType 92 { 93 get { return txtInput.InputType; } 94 set { txtInput.InputType = value; } 95 } 96 97 /// 98 /// 水印文字 99 /// 100 [Description("水印文字"), Category("自定义")] 101 public string PromptText 102 { 103 get 104 { 105 return this.txtInput.PromptText; 106 } 107 set 108 { 109 this.txtInput.PromptText = value; 110 } 111 } 112 113 [Description("水印字体"), Category("自定义")] 114 public Font PromptFont 115 { 116 get 117 { 118 return this.txtInput.PromptFont; 119 } 120 set 121 { 122 this.txtInput.PromptFont = value; 123 } 124 } 125 126 [Description("水印颜色"), Category("自定义")] 127 public Color PromptColor 128 { 129 get 130 { 131 return this.txtInput.PromptColor; 132 } 133 set 134 { 135 this.txtInput.PromptColor = value; 136 } 137 } 138 139 /// 140 /// 获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。 141 /// 142 [Description("获取或设置一个值,该值指示当输入类型InputType=Regex时,使用的正则表达式。")] 143 public string RegexPattern 144 { 145 get 146 { 147 return this.txtInput.RegexPattern; 148 } 149 set 150 { 151 this.txtInput.RegexPattern = value; 152 } 153 } 154 /// 155 /// 当InputType为数字类型时,能输入的最大值 156 /// 157 [Description("当InputType为数字类型时,能输入的最大值。")] 158 public decimal MaxValue 159 { 160 get 161 { 162 return this.txtInput.MaxValue; 163 } 164 set 165 { 166 this.txtInput.MaxValue = value; 167 } 168 } 169 /// 170 /// 当InputType为数字类型时,能输入的最小值 171 /// 172 [Description("当InputType为数字类型时,能输入的最小值。")] 173 public decimal MinValue 174 { 175 get 176 { 177 return this.txtInput.MinValue; 178 } 179 set 180 { 181 this.txtInput.MinValue = value; 182 } 183 } 184 /// 185 /// 当InputType为数字类型时,能输入的最小值 186 /// 187 [Description("当InputType为数字类型时,小数位数。")] 188 public int DecLength 189 { 190 get 191 { 192 return this.txtInput.DecLength; 193 } 194 set 195 { 196 this.txtInput.DecLength = value; 197 } 198 } 199 200 private KeyBoardType keyBoardType = KeyBoardType.UCKeyBorderAll_EN; 201 [Description("键盘打开样式"), Category("自定义")] 202 public KeyBoardType KeyBoardType 203 { 204 get { return keyBoardType; } 205 set { keyBoardType = value; } 206 } 207 [Description("查询按钮点击事件"), Category("自定义")] 208 public event EventHandler SearchClick; 209 210 [Description("文本改变事件"), Category("自定义")] 211 public new event EventHandler TextChanged; 212 [Description("键盘按钮点击事件"), Category("自定义")] 213 public event EventHandler KeyboardClick; 214 215 [Description("文本"), Category("自定义")] 216 public string InputText 217 { 218 get 219 { 220 return txtInput.Text; 221 } 222 set 223 { 224 txtInput.Text = value; 225 } 226 } 227 228 private bool isFocusColor = true; 229 [Description("获取焦点是否变色"), Category("自定义")] 230 public bool IsFocusColor 231 { 232 get { return isFocusColor; } 233 set { isFocusColor = value; } 234 } 235 private Color _FillColor; 236 public new Color FillColor 237 { 238 get 239 { 240 return _FillColor; 241 } 242 set 243 { 244 _FillColor = value; 245 base.FillColor = value; 246 this.txtInput.BackColor = value; 247 } 248 } 249 public UCTextBoxEx() 250 { 251 InitializeComponent(); 252 txtInput.SizeChanged += UCTextBoxEx_SizeChanged; 253 this.SizeChanged += UCTextBoxEx_SizeChanged; 254 txtInput.GotFocus += (a, b) => 255 { 256 if (isFocusColor) 257 this.RectColor = Color.FromArgb(78, 169, 255); 258 }; 259 txtInput.LostFocus += (a, b) => 260 { 261 if (isFocusColor) 262 this.RectColor = Color.FromArgb(220, 220, 220); 263 }; 264 } 265 266 void UCTextBoxEx_SizeChanged(object sender, EventArgs e) 267 { 268 this.txtInput.Location = new Point(this.txtInput.Location.X, (this.Height - txtInput.Height) / 2); 269 } 270 271 272 private void txtInput_TextChanged(object sender, EventArgs e) 273 { 274 if (m_isShowClearBtn) 275 { 276 btnClear.Visible = !(txtInput.Text == "\r\n") && !string.IsNullOrEmpty(txtInput.Text); 277 } 278 if (TextChanged != null) 279 { 280 TextChanged(sender, e); 281 } 282 } 283 284 private void btnClear_MouseDown(object sender, MouseEventArgs e) 285 { 286 txtInput.Clear(); 287 txtInput.Focus(); 288 } 289 290 private void btnSearch_MouseDown(object sender, MouseEventArgs e) 291 { 292 if (SearchClick != null) 293 { 294 SearchClick(sender, e); 295 } 296 } 297 Forms.FrmAnchor m_frmAnchor; 298 private void btnKeybord_MouseDown(object sender, MouseEventArgs e) 299 { 300 m_intSelectionStart = this.txtInput.SelectionStart; 301 m_intSelectionLength = this.txtInput.SelectionLength; 302 this.FindForm().ActiveControl = this; 303 this.FindForm().ActiveControl = this.txtInput; 304 switch (keyBoardType) 305 { 306 case KeyBoardType.UCKeyBorderAll_EN: 307 if (m_frmAnchor == null) 308 { 309 if (m_frmAnchor == null) 310 { 311 UCKeyBorderAll key = new UCKeyBorderAll(); 312 key.CharType = KeyBorderCharType.CHAR; 313 key.RetractClike += (a, b) => 314 { 315 m_frmAnchor.Hide(); 316 }; 317 m_frmAnchor = new Forms.FrmAnchor(this, key); 318 m_frmAnchor.VisibleChanged += (a, b) => 319 { 320 if (m_frmAnchor.Visible) 321 { 322 this.txtInput.SelectionStart = m_intSelectionStart; 323 this.txtInput.SelectionLength = m_intSelectionLength; 324 } 325 }; 326 } 327 } 328 break; 329 case KeyBoardType.UCKeyBorderAll_Num: 330 331 if (m_frmAnchor == null) 332 { 333 UCKeyBorderAll key = new UCKeyBorderAll(); 334 key.CharType = KeyBorderCharType.NUMBER; 335 key.RetractClike += (a, b) => 336 { 337 m_frmAnchor.Hide(); 338 }; 339 m_frmAnchor = new Forms.FrmAnchor(this, key); 340 m_frmAnchor.VisibleChanged += (a, b) => 341 { 342 if (m_frmAnchor.Visible) 343 { 344 this.txtInput.SelectionStart = m_intSelectionStart; 345 this.txtInput.SelectionLength = m_intSelectionLength; 346 } 347 }; 348 } 349 350 break; 351 case KeyBoardType.UCKeyBorderNum: 352 if (m_frmAnchor == null) 353 { 354 UCKeyBorderNum key = new UCKeyBorderNum(); 355 m_frmAnchor = new Forms.FrmAnchor(this, key); 356 m_frmAnchor.VisibleChanged += (a, b) => 357 { 358 if (m_frmAnchor.Visible) 359 { 360 this.txtInput.SelectionStart = m_intSelectionStart; 361 this.txtInput.SelectionLength = m_intSelectionLength; 362 } 363 }; 364 } 365 break; 366 case HZH_Controls.Controls.KeyBoardType.UCKeyBorderHand: 367 368 m_frmAnchor = new Forms.FrmAnchor(this, new Size(504, 361)); 369 m_frmAnchor.VisibleChanged += m_frmAnchor_VisibleChanged; 370 m_frmAnchor.Disposed += m_frmAnchor_Disposed; 371 Panel p = new Panel(); 372 p.Dock = DockStyle.Fill; 373 p.Name = "keyborder"; 374 m_frmAnchor.Controls.Add(p); 375 376 UCBtnExt btnDelete = new UCBtnExt(); 377 btnDelete.Name = "btnDelete"; 378 btnDelete.Size = new Size(80, 28); 379 btnDelete.FillColor = Color.White; 380 btnDelete.IsRadius = false; 381 btnDelete.ConerRadius = 1; 382 btnDelete.IsShowRect = true; 383 btnDelete.RectColor = Color.FromArgb(189, 197, 203); 384 btnDelete.Location = new Point(198, 332); 385 btnDelete.BtnFont = new System.Drawing.Font("微软雅黑", 8); 386 btnDelete.BtnText = "删除"; 387 btnDelete.BtnClick += (a, b) => 388 { 389 SendKeys.Send("{BACKSPACE}"); 390 }; 391 m_frmAnchor.Controls.Add(btnDelete); 392 btnDelete.BringToFront(); 393 394 UCBtnExt btnEnter = new UCBtnExt(); 395 btnEnter.Name = "btnEnter"; 396 btnEnter.Size = new Size(82, 28); 397 btnEnter.FillColor = Color.White; 398 btnEnter.IsRadius = false; 399 btnEnter.ConerRadius = 1; 400 btnEnter.IsShowRect = true; 401 btnEnter.RectColor = Color.FromArgb(189, 197, 203); 402 btnEnter.Location = new Point(278, 332); 403 btnEnter.BtnFont = new System.Drawing.Font("微软雅黑", 8); 404 btnEnter.BtnText = "确定"; 405 btnEnter.BtnClick += (a, b) => 406 { 407 SendKeys.Send("{ENTER}"); 408 m_frmAnchor.Hide(); 409 }; 410 m_frmAnchor.Controls.Add(btnEnter); 411 btnEnter.BringToFront(); 412 m_frmAnchor.VisibleChanged += (a, b) => 413 { 414 if (m_frmAnchor.Visible) 415 { 416 this.txtInput.SelectionStart = m_intSelectionStart; 417 this.txtInput.SelectionLength = m_intSelectionLength; 418 } 419 }; 420 break; 421 } 422 if (!m_frmAnchor.Visible) 423 m_frmAnchor.Show(this.FindForm()); 424 if (KeyboardClick != null) 425 { 426 KeyboardClick(sender, e); 427 } 428 } 429 430 void m_frmAnchor_Disposed(object sender, EventArgs e) 431 { 432 if (m_HandAppWin != IntPtr.Zero) 433 { 434 if (m_HandPWin != null && !m_HandPWin.HasExited) 435 m_HandPWin.Kill(); 436 m_HandPWin = null; 437 m_HandAppWin = IntPtr.Zero; 438 } 439 } 440 441 442 IntPtr m_HandAppWin; 443 Process m_HandPWin = null; 444 string m_HandExeName = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "HandInput\\handinput.exe"); 445 446 void m_frmAnchor_VisibleChanged(object sender, EventArgs e) 447 { 448 if (m_frmAnchor.Visible) 449 { 450 var lstP = Process.GetProcessesByName("handinput"); 451 if (lstP.Length > 0) 452 { 453 foreach (var item in lstP) 454 { 455 item.Kill(); 456 } 457 } 458 m_HandAppWin = IntPtr.Zero; 459 460 if (m_HandPWin == null) 461 { 462 m_HandPWin = null; 463 464 m_HandPWin = System.Diagnostics.Process.Start(this.m_HandExeName); 465 m_HandPWin.WaitForInputIdle(); 466 } 467 while (m_HandPWin.MainWindowHandle == IntPtr.Zero) 468 { 469 Thread.Sleep(10); 470 } 471 m_HandAppWin = m_HandPWin.MainWindowHandle; 472 Control p = m_frmAnchor.Controls.Find("keyborder", false)[0]; 473 SetParent(m_HandAppWin, p.Handle); 474 ControlHelper.SetForegroundWindow(this.FindForm().Handle); 475 MoveWindow(m_HandAppWin, -111, -41, 626, 412, true); 476 } 477 else 478 { 479 if (m_HandAppWin != IntPtr.Zero) 480 { 481 if (m_HandPWin != null && !m_HandPWin.HasExited) 482 m_HandPWin.Kill(); 483 m_HandPWin = null; 484 m_HandAppWin = IntPtr.Zero; 485 } 486 } 487 } 488 489 private void UCTextBoxEx_MouseDown(object sender, MouseEventArgs e) 490 { 491 this.ActiveControl = txtInput; 492 } 493 494 private void UCTextBoxEx_Load(object sender, EventArgs e) 495 { 496 if (!Enabled) 497 { 498 base.FillColor = Color.FromArgb(240, 240, 240); 499 txtInput.BackColor = Color.FromArgb(240, 240, 240); 500 } 501 else 502 { 503 FillColor = _FillColor; 504 txtInput.BackColor = _FillColor; 505 } 506 } 507 [DllImport("user32.dll", SetLastError = true)] 508 private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 509 510 [DllImport("user32.dll", SetLastError = true)] 511 private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint); 512 [DllImport("user32.dll", EntryPoint = "ShowWindow")] 513 private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow); 514 [DllImport("user32.dll")] 515 private static extern bool SetWindowPos(IntPtr hWnd, int hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags); 516 private const int GWL_STYLE = -16; 517 private const int WS_CHILD = 0x40000000;//设置窗口属性为child 518 519 [DllImport("user32.dll", EntryPoint = "GetWindowLong")] 520 public static extern int GetWindowLong(IntPtr hwnd, int nIndex); 521 522 [DllImport("user32.dll", EntryPoint = "SetWindowLong")] 523 public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong); 524 525 [DllImport("user32.dll")] 526 private extern static IntPtr SetActiveWindow(IntPtr handle); 527 } 528 }
1 namespace HZH_Controls.Controls 2 { 3 partial class UCTextBoxEx 4 { 5 ///6 /// 必需的设计器变量。 7 /// 8 private System.ComponentModel.IContainer components = null; 9 10 /// 11 /// 清理所有正在使用的资源。 12 /// 13 /// 如果应释放托管资源,为 true;否则为 false。 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region 组件设计器生成的代码 24 25 /// 26 /// 设计器支持所需的方法 - 不要 27 /// 使用代码编辑器修改此方法的内容。 28 /// 29 private void InitializeComponent() 30 { 31 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UCTextBoxEx)); 32 this.txtInput = new HZH_Controls.Controls.TextBoxEx(); 33 this.imageList1 = new System.Windows.Forms.ImageList(); 34 this.btnClear = new System.Windows.Forms.Panel(); 35 this.btnKeybord = new System.Windows.Forms.Panel(); 36 this.btnSearch = new System.Windows.Forms.Panel(); 37 this.SuspendLayout(); 38 // 39 // txtInput 40 // 41 this.txtInput.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); 42 this.txtInput.BorderStyle = System.Windows.Forms.BorderStyle.None; 43 this.txtInput.DecLength = 2; 44 this.txtInput.Font = new System.Drawing.Font("微软雅黑", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 45 this.txtInput.InputType = TextInputType.NotControl; 46 this.txtInput.Location = new System.Drawing.Point(8, 9); 47 this.txtInput.Margin = new System.Windows.Forms.Padding(3, 3, 10, 3); 48 this.txtInput.MaxValue = new decimal(new int[] { 49 1000000, 50 0, 51 0, 52 0}); 53 this.txtInput.MinValue = new decimal(new int[] { 54 1000000, 55 0, 56 0, 57 -2147483648}); 58 this.txtInput.MyRectangle = new System.Drawing.Rectangle(0, 0, 0, 0); 59 this.txtInput.Name = "txtInput"; 60 this.txtInput.OldText = null; 61 this.txtInput.PromptColor = System.Drawing.Color.Gray; 62 this.txtInput.PromptFont = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 63 this.txtInput.PromptText = ""; 64 this.txtInput.RegexPattern = ""; 65 this.txtInput.Size = new System.Drawing.Size(309, 24); 66 this.txtInput.TabIndex = 0; 67 this.txtInput.TextChanged += new System.EventHandler(this.txtInput_TextChanged); 68 // 69 // imageList1 70 // 71 this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); 72 this.imageList1.TransparentColor = System.Drawing.Color.Transparent; 73 this.imageList1.Images.SetKeyName(0, "ic_cancel_black_24dp.png"); 74 this.imageList1.Images.SetKeyName(1, "ic_search_black_24dp.png"); 75 this.imageList1.Images.SetKeyName(2, "keyboard.png"); 76 // 77 // btnClear 78 // 79 this.btnClear.BackgroundImage = global::HZH_Controls.Properties.Resources.input_clear; 80 this.btnClear.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 81 this.btnClear.Cursor = System.Windows.Forms.Cursors.Default; 82 this.btnClear.Dock = System.Windows.Forms.DockStyle.Right; 83 this.btnClear.Location = new System.Drawing.Point(227, 5); 84 this.btnClear.Name = "btnClear"; 85 this.btnClear.Size = new System.Drawing.Size(30, 32); 86 this.btnClear.TabIndex = 4; 87 this.btnClear.Visible = false; 88 this.btnClear.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnClear_MouseDown); 89 // 90 // btnKeybord 91 // 92 this.btnKeybord.BackgroundImage = global::HZH_Controls.Properties.Resources.keyboard; 93 this.btnKeybord.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 94 this.btnKeybord.Cursor = System.Windows.Forms.Cursors.Default; 95 this.btnKeybord.Dock = System.Windows.Forms.DockStyle.Right; 96 this.btnKeybord.Location = new System.Drawing.Point(257, 5); 97 this.btnKeybord.Name = "btnKeybord"; 98 this.btnKeybord.Size = new System.Drawing.Size(30, 32); 99 this.btnKeybord.TabIndex = 6; 100 this.btnKeybord.Visible = false; 101 this.btnKeybord.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnKeybord_MouseDown); 102 // 103 // btnSearch 104 // 105 this.btnSearch.BackgroundImage = global::HZH_Controls.Properties.Resources.ic_search_black_24dp; 106 this.btnSearch.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 107 this.btnSearch.Cursor = System.Windows.Forms.Cursors.Default; 108 this.btnSearch.Dock = System.Windows.Forms.DockStyle.Right; 109 this.btnSearch.Location = new System.Drawing.Point(287, 5); 110 this.btnSearch.Name = "btnSearch"; 111 this.btnSearch.Size = new System.Drawing.Size(30, 32); 112 this.btnSearch.TabIndex = 5; 113 this.btnSearch.Visible = false; 114 this.btnSearch.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnSearch_MouseDown); 115 // 116 // UCTextBoxEx 117 // 118 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; 119 this.BackColor = System.Drawing.Color.Transparent; 120 this.ConerRadius = 5; 121 this.Controls.Add(this.btnClear); 122 this.Controls.Add(this.btnKeybord); 123 this.Controls.Add(this.btnSearch); 124 this.Controls.Add(this.txtInput); 125 this.Cursor = System.Windows.Forms.Cursors.IBeam; 126 this.IsShowRect = true; 127 this.IsRadius = true; 128 this.Name = "UCTextBoxEx"; 129 this.Padding = new System.Windows.Forms.Padding(5); 130 this.Size = new System.Drawing.Size(322, 42); 131 this.Load += new System.EventHandler(this.UCTextBoxEx_Load); 132 this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UCTextBoxEx_MouseDown); 133 this.ResumeLayout(false); 134 this.PerformLayout(); 135 136 } 137 138 #endregion 139 140 private System.Windows.Forms.ImageList imageList1; 141 public TextBoxEx txtInput; 142 private System.Windows.Forms.Panel btnClear; 143 private System.Windows.Forms.Panel btnSearch; 144 private System.Windows.Forms.Panel btnKeybord; 145 } 146 }
用处及效果
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星 星吧