我用如下方法从 IDC_EDIT 读取到数据的
CString a;
CString b;
GetDlgItemText(IDC_EDIT1,a);
GetDlgItemText(IDC_EDIT2,b);
string s1 = (LPCTSTR)a;
string s2 = (LPCTSTR)b;我现在想对输入的数据做如下限定
1、输入的字符最长的长度为8个字符,包括 粘贴 是也要保证最长8个字节,长于8个字符的部分 自动去掉。2、输入的字符,只能为0~~f 这16个字符,输入其它字符,无法输入。如果能弹出提示信息最好,但是也不是必须的。3、如果的字符,不论是在Caps Lock使能的情况下 或是 Shift+字符的情况下,输入的内容自动变化成小写。不知道如何实现,谢谢。
CString a;
CString b;
GetDlgItemText(IDC_EDIT1,a);
GetDlgItemText(IDC_EDIT2,b);
string s1 = (LPCTSTR)a;
string s2 = (LPCTSTR)b;我现在想对输入的数据做如下限定
1、输入的字符最长的长度为8个字符,包括 粘贴 是也要保证最长8个字节,长于8个字符的部分 自动去掉。2、输入的字符,只能为0~~f 这16个字符,输入其它字符,无法输入。如果能弹出提示信息最好,但是也不是必须的。3、如果的字符,不论是在Caps Lock使能的情况下 或是 Shift+字符的情况下,输入的内容自动变化成小写。不知道如何实现,谢谢。
2,3这两个问题可以重写一下CEdit这个类,在OnChar这个事件中加一些条件。得到一个字符就判断一下是不是在这个范围内的字母,如果是大写的话,转成小写输出,上面的判断可以判断这个字符的ASCII值
1:可以在类向导中绑定变量后进行设置;
2:处理OnEditChange
3:可以在控件属性上直接设置 Lowercase,输入的字母即可自动转化为小写
WM_CHAR中判断按下的按键是什么,分别进行处理。
1、建立自己的 Edit Control 类class CMyEdit : public CEdit
2、重载 OnChar 函数void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if( ((nChar>=0x30)&&(nChar<=0x39))||((nChar>=0x61)&&(nChar<=0x66))||(nChar==0x08) )
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
// 0x30 ~ 0x39 就是字符 0 ~ 9 ;0x61 ~ 0x66 是 a,b,c,d,e,f ; 0x80 是 Backspace 键。// 你先试试看
CEdit m_edtCtrl;
……
typedef LONG FAR (PASCAL *WndProc)( HWND hWnd,unsigned message,WORD wParam,LONG lParam);WndProc OldEditWnd;LONG FAR PASCAL NeWWndProc( HWND hWnd,
unsigned message,
WORD wParam,
LONG lParam)
{
switch(message)
{
case WM_CHAR:
if((wParam>'9'||wParam <'0')&&(wParam!='-'&&wParam!=','&&wParam!='\b'))
{
return 0;
}
default:
if(OldEditWnd != NULL)
OldEditWnd(hWnd,message,wParam,lParam);
}
}
……
添加如下代码
OldEditWnd = (WndProc )GetWindowLong(m_edtCtrl.m_hWnd,GWL_WNDPROC);
SetWindowLong(m_edtCtrl.m_hWnd,GWL_WNDPROC,(long)NeWWndProc);
为该类添加OnChar()事件
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar>'9'||nChar<'0'&&nChar!=VK_BACK&&nChar!='+'&&nChar!='-'&&nChar!='*'&&nChar!='/')
{
return;
}
//AfxMessageBox("OK");
CEdit::OnChar( nChar, nRepCnt, nFlags);
}
然后把这个CMyEdit替换CEdit m_edit;