前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
目录
https://blog.csdn.net/kwwwvagaa/article/details/100586547
准备工作
终于到文本框了,文本框将包含原文本框扩展,透明文本框,数字输入文本框,带边框文本框
本文将讲解带边框文本框,可选弹出键盘样式,继承自控件基类UCControlBase
同时用到了无焦点窗体和键盘,如果你还没有了解,请前往查看
开始
添加用户控件,命名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 点个星 星吧