using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
{
/// <summary>
/// 数字编辑框控件
/// dotnet里可以采用masktextbox,但是可能会有占位符
/// </summary>
public class NumberTextBox:TextBox
{
#region windows api
private const uint WM_CHAR = 0x0102;
private const uint WM_PASTE = 0x0302;
private const int CF_TEXT = 1;
[DllImport("user32")]
private static extern bool MessageBeep(uint type);
[DllImport("user32")]
private static extern bool OpenClipboard(IntPtr hwnd);
[DllImport("user32")]
private static extern bool CloseClipboard();
[DllImport("user32")]
private static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("kernel32.dll")]
private static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll")]
private static extern bool GlobalUnlock(IntPtr hMem);
#endregion
{
switch ((uint)m.Msg)
{
case WM_CHAR://处理char
OnChar(ref m);
break;
case WM_PASTE://处理paste
OnPaste(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
/// 处理字符输入
/// </summary>
/// <param name="m"></param>
private void OnChar(ref Message m)
{
uint nChar = (uint)m.WParam;
if((nChar == 8)||(nChar==22)||(nChar==3)||(nChar==24)||(nChar==26))
{
base.WndProc(ref m);
return;
}
{
MessageBeep(0xFFFFFFFF);
return;
}
}
/// 是否有效字符
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
private bool IsValidChar(uint c)
{
if ((c >= '0') && (c <= '9'))
return true;
if ((c == 13) && Multiline)
return true;
return false;
}
/// 是否有效的字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private bool IsValidStr(string str)
{
int len = str.Length;
for (int i = 0; i < len; i++)
{
char c = str[i];
if (!IsValidChar((uint)c))
return false;
}
return true;
}
/// 粘贴时的处理
/// </summary>
/// <param name="m"></param>
private void OnPaste(ref Message m)
{
bool pasteok = true;
{
IntPtr ClipHandle = GetClipboardData(CF_TEXT);
if (ClipHandle != IntPtr.Zero)
{
//判断是否拷贝后的内容正确
IntPtr pbuf = GlobalLock(ClipHandle);
string sbuf = Marshal.PtrToStringAnsi(pbuf);
string stext=Text;
int bindex=SelectionStart;
int eindex=SelectionStart+SelectionLength;
string newtext=stext.Substring(0,bindex)
+sbuf+stext.Substring(eindex,stext.Length-eindex);
pasteok = IsValidStr(newtext);
GlobalUnlock(ClipHandle);
}
CloseClipboard();
}
{
MessageBeep(0xFFFFFFFF);
return;
}
base.WndProc(ref m);
}
}
}