在做项目中或许你花费在细节上的事件要比你正常花在编码测试上面的时间多一些。
1)textbox只能输入数字,在textbox的keypress事件中书写下列代码:
if ((e.KeyChar != 8 && !char.IsDigit(e.KeyChar)) && e.KeyChar != 13) { MessageBox.Show("笨蛋,这里只能输入数字,懂不?", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information); e.Handled = true; }
注:键盘上每一个值都对应着相应的ASCII值,如13是回车键,8是删除键。
2)textbox自动删除非法字符,有的网站上面的用户注册可能不允许存在非法字符,但是都是通过JavaScript实现的。如果是一个win form项目,又该如何处理那?其实原理同上,具体代码如下:
if (e.KeyValue <= 48 || e.KeyValue >= 57) { textBox4.Select(0, textBox4.Text.Length - 1); textBox4 .Text =textBox4 .SelectedText ; textBox4.SelectAll(); textBox4 .SelectionStart =textBox4 .Text .Length ; textBox4 .Focus (); }
3)可能大家都注意到了,csdn博客的回复框当得到焦点的时候是米黄色,失去焦点的时候是白色。下面来介绍一下空间得到焦点变色的功能,其实就是在控件的enter事件中改变颜色,在控件的leave事件恢复颜色。
private void textBox1_Enter(object sender, EventArgs e) { textBox1.BackColor = Color.Beige; } private void textBox1_Leave(object sender, EventArgs e) { textBox1.BackColor = Color.White; }
4)腾讯的QQ登陆密码是不可以复制黏贴的,这又是如何实现的那?这种不允许黏贴的功能,在注册用户密码确认的时候被大量使用,可以防止用户密码输入错误的情况。
新建一个窗体为ShieldPasteFunction TextBox nostiky = new Custom.CustomTextBoxGroup(); //声明自定义CustomTextBoxGroup类的对象 private void ShieldPasteFunction_load(object sender, EventArgs e) { this.nostiky.Parent = this; //设定自定义控件的父容器为当前窗口 this.Controls.Add(this.nostiky); //在当前窗体中添加自定义控件 } 新建一个自定义控件类,继承自textbox public partial class CustomTextBoxGroup : TextBox { public CustomTextBoxGroup() { this.Top = 63; //定义自定义控件上边缘与父容器上边缘的距离 this.Left = 105; //定义自定义控件左边缘与父容器左边缘的距离 this.Width = 178; //定义自定义控件的宽度 this.Height = 50; //定义自定义控件的高度 } protected override void WndProc(ref Message m) { const int wm_rbuttonDowm = 0x0204; //该变量表示鼠标右键的信息 const int wm_getText = 0x00d; //该变量表示从文本框中获取文本的信息 const int wm_contextMenu = 0x007B; //该变量表示右键菜单的信息 const int wm_paste = 0x0302; //该变量表示有关黏贴的信息 //当当前处理的信息为鼠标右键、从文本框中获取文本、右键菜单以及黏贴信息时 if (m.Msg == wm_rbuttonDowm || m.Msg == wm_getText || m.Msg == wm_contextMenu || m.Msg == wm_paste) { return; //直接返回,不进行处理 } base.WndProc(ref m); //处理下一条信息 } } 这时候允许的话他会提示:不包含“AutoScaleMode”的定义 你必须添加变量 public AutoScaleMode AutoScaleMode=new AutoScaleMode (); 原因是:用户控件本来是从UserControl继承,你也可以从其他的控件类继承,但UserControl类带了很多默认的成员,例如AutoScaleMode,而.NET要求用户控件要有这些成员,你如果直接从UserControl继承,自己就不用定义了,从其他控件类继承的话自己要添加相关的定义
Tips:C#将TextBox修改为Password后,就不能从TextBox中复制了,这个时候复制功能被禁止掉
WndProc是windows处理消息的函数,可以重载。
0x0302、0x0204分别是Windows消息中粘贴和快捷菜单常量。其余变量程序中有解释
说了这么多细节的问题,是为了让自己做程序时候能够时时刻刻以用户的需求为准,站在用户的角度上考虑问题,多些好的用户体验。有时候同样一款软件谁都可以实现其基本功能,这时候评比的重点就是:谁为用户考虑的多?