您的位置:首页 > 其它

使用Win32 API实现限制编辑框输入的功能

2012-02-04 08:16 639 查看
 
        使用C++Win32API实现了编辑框输入限制的功能,限制用户只能在编辑框中输入指定的内容,例如:只能输入数字0~9。当然,可以通过编辑框的属性限制编辑框只能输入数字,但是有时需要限制的内容不仅仅是数字,例如:一个输入时间的编辑框,输入格式为“2012-2-3 18:00:00”,限制的内容就不仅仅包含数字了。

        解决思路:

        1.当编辑框中的内容发生变化时,会发送一个EN_CHANGE消息;

        2.当窗口响应函数捕捉到指定编辑框发送的EN_CHANGE消息时,读取指定编辑框里的内容;

        3.判断读取的内容中是否包含非限定的字符;

        4.如果包含非限定的字符,获得其位置,将其删除;并将该位置后面的字符依次向前移动;

        5.重新设置输入焦点。

//窗口响应函数
LRESUL TCALLBACK ProjectProc
(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case iResourceID://编辑框的资源ID
{
switch(HIWORD(wParam))
{
case EN_CHANGE:
{
//限制输入框只能输入0123456789
EditControlLimit(hWnd,iResouceID,"0123456789");
}
break;
}
}
}
}
}
//限制输入函数
void EditControlLimit(HWND hWnd,int iResouceID,char *szLimit)
{
int iPos=-1;	//记录非限定字符位置
int iLength=SendMessage(GetDlgItem(hWnd,iResouceID),WM_GETTEXTLENGTH,0,0);//获得编辑框的长度
if(iLength!=0)
{
char *szContent=new char[iLength+1];	//分配缓冲区,存储编辑框内容
SendMessage(GetDlgItem(hWnd,iResouceID),WM_GETTEXT,iLength+1,(LPARAM)szContent);	//获得编辑框内容

//判断缓冲区中是否包含非限定字符
for(int i=0;i<iLength;i++)
{
//判断是包含非限定字符,如果包含,则记录非限定字符位置
for(int j=0;j<strlen(szLimit);j++)
{
iPos=i;
if(szContent[i]==szLimit[j])
{
iPos=-1;
break;
}
}

//如果存在非限定字符
if(iPos!=-1)
{

//将非限定字符后的所有字符,向前依次复制
for(int k=i;k<=iLength;k++)
{
szContent[k]=szContent[k+1];
}

//重设编辑框内容以及光标位置
SendMessage(GetDlgItem(hWnd,iResouceID),WM_SETTEXT,0,(LPARAM)szContent);
SendMessage(GetDlgItem(hWnd,iResouceID),EM_SETSEL,iPos,iPos);
break;
}
}

//删除缓冲区
delete []szContent;
szContent=NULL;
}
}


        通过这种方法实现的限制编辑框输入的功能,会出现当输入非限定内容时,非限定内容会先在编辑框中出现,然后又消失这种现象。

        针对限制编辑框输入这种功能,是否还有更好的解决方案,有待进一步学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  api command delete null 存储