现在还有一点问题
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = (e.KeyChar < '0' || e.KeyChar > '9');
if (e.KeyChar ==(char ) Keys.Back )
{
//允许BackSpace
e.Handled = false;
}
}这个语句屏蔽掉了字符,对于汉字和复制粘贴还是不可以。这个好象可以屏蔽掉汉字输入和粘贴问题。
public const int WM_PASTE = 0x0302;//粘貼消息
protected override void WndProc(ref Message m)
{
if(m.Msg != WM_PASTE)base.WndProc (ref m);
}
有谁有更好的方法讲解一下。
先谢谢了/
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = (e.KeyChar < '0' || e.KeyChar > '9');
if (e.KeyChar ==(char ) Keys.Back )
{
//允许BackSpace
e.Handled = false;
}
}这个语句屏蔽掉了字符,对于汉字和复制粘贴还是不可以。这个好象可以屏蔽掉汉字输入和粘贴问题。
public const int WM_PASTE = 0x0302;//粘貼消息
protected override void WndProc(ref Message m)
{
if(m.Msg != WM_PASTE)base.WndProc (ref m);
}
有谁有更好的方法讲解一下。
先谢谢了/
/// <summary>
/// 只能对数值操作的TextBox。
/// </summary>
public class TextBoxNumEx : System.Windows.Forms.TextBox
{
public TextBoxNumEx()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0102:
bool isSign = ((int)m.WParam == 45);
bool isNum = ((int)m.WParam >= 48) && ((int)m.WParam <= 57);
bool isBack = (int)m.WParam == (int)Keys.Back;
bool isDelete = (int)m.WParam == (int)Keys.Delete;
bool isCtr = ((int)m.WParam == 24) || ((int)m.WParam == 22) || ((int)m.WParam == 26) || ((int)m.WParam == 3); if (isNum || isBack || isCtr)
{
base.WndProc(ref m);
}
if (isSign)
{
if (this.SelectionStart != 0)
{
break;
}
base.WndProc(ref m);
break;
}
if (isDelete)
{
if (this.Text.IndexOf(".") < 0)
{
base.WndProc(ref m);
}
}
if ((int)m.WParam == 1)
{
this.SelectAll();
}
break;
case 0x0302:
IDataObject iData = Clipboard.GetDataObject();//取剪贴板对象 if (iData.GetDataPresent(DataFormats.Text)) //判断是否是Text
{
string str = (string)iData.GetData(DataFormats.Text);//取数据
if (MatchNumber(str))
{
base.WndProc(ref m);
break;
}
}
m.Result = (IntPtr)0;//不可以粘贴
break;
default:
base.WndProc(ref m);
break;
}
}
private bool MatchNumber(string numberText)
{
if (string.IsNullOrEmpty(numberText))
{
return false;
} int index = 0;
string strNum = "-0.123456789"; index = numberText.IndexOf(strNum[0]);
if (index >= 0)
{
if (numberText.Length == 1 || numberText.IndexOf(strNum[0], index + 1) > 0)
{
return false;
}
}
index = numberText.IndexOf(strNum[2]);
if (index != -1)
{
index = numberText.IndexOf(strNum[2], index + 1);
if (index != -1)
{
return false;
}
}
return true;
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
//判断输入是否为数字,是则显示,否则清空
Regex r = new Regex("^[0-9]+$");
if (!r.IsMatch (textBox1.Text))
{
txtLineNumber.Text = ""; }
}
//onDrop="return false" 禁止拖拉
<asp:TextBox ID="TextBox1" runat="server" onPaste="return false" onDrop="return false"></asp:TextBox>
但是有点视觉残影。hbxtlhx(平民百姓) 这个可以, 但是看着有点费劲。 有高手讲解一下吗?让大家都明白一下/
代码中没有用到任何API,只是把消息接过来了.比如我们发现TextBox在将要处理的按键消息(比如A或"我"等)时发现这个按键我们不想让它出现在Textbox里,那么我们就不要把这时的消息m(Message)传到基类的WndProc方法中,这样基类就不会处理这个消息了,自然就不出在文本框里出现这个按键了.但是并不是所有的消息都不要base.WndProc来处理,比如粘贴文本的消息我们还是要base.WndProc来处理的,怎么办呢,这就用到了消息的返回值m.Result,在粘贴的消息中如果这个值为0则不处理粘贴了.这样也就不会出现在TextBox上了.总的说来合适的处理base.WndProc就会得到我们想要的某种效果.
WndProc 是一个窗口过程函数,他接收当前使用控件的消息和事件处理方法,
过程函数 protected override void WndProc(ref Message m)
中的m.msg 就是获取消息的标识符。 所有控件的所有消息和事件处理方法都是通过 WndProc处理的。 不同的控件有不同的WndProc 是吗?
上面的例子就是将 m.msg 判断一下,满足提交条件的话操作,否则不提交消息队列中