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

1 篇文章 0 订阅
1 篇文章 0 订阅
 

        使用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;
	}
}

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

        针对限制编辑框输入这种功能,是否还有更好的解决方案,有待进一步学习。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值