实现一个冒泡提示的浮点数编辑框

最近需要一个浮点数编辑框。所谓浮点数编辑框,就是限制输入只在”-1234567890.” 这些字符,其它字符不予输入(用户输错了冒一个气泡进行提示)。本想使用BCG库的CBCGPMaskEdit类,无奈该类允许重复输入小数点,不满足我的需求。

 

       于是上网搜了一个,发现是基于VS2010的。VS 2010的编辑框已经实现了自动冒泡提示了。但是我的工程是VS 2005的。于是我设法在VS 2005实现编辑框的冒泡提示。

 

       实际上这个也不难,主要是使用Edit_ShowBalloonTip宏。下面是编辑框的主体代码:

[cpp] view plaincopy

  1. BEGIN_MESSAGE_MAP(CMyFloatEdit, CEdit)  
  2.     ON_WM_CHAR()  
  3. END_MESSAGE_MAP()  
  4.   
  5. // 实现编辑框的冒泡提示  
  6. void CMyFloatEdit::ShowBalloonTip(LPWSTR strTitile,LPWSTR strtext,UINT uStyle)  
  7. {  
  8.     EDITBALLOONTIP ebt;  
  9.     ebt.cbStruct = sizeof(EDITBALLOONTIP);  
  10.     ebt.pszText = strtext;  
  11.     ebt.pszTitle = strTitile;  
  12.     ebt.ttiIcon = uStyle;  
  13.     Edit_ShowBalloonTip(GetSafeHwnd(),&ebt);  
  14. }  
  15.   
  16. // CMyFloatEdit 消息处理程序  
  17.   
  18. void CMyFloatEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
  19. {  
  20.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
  21.   
  22.     // TODO: Add your message handler code here and/or call default  
  23.     UpdateData(TRUE);  
  24.     CString strText;  
  25.     TCHAR ch = TCHAR(nChar);  
  26.   
  27.     // 限制字符的数值在在之间,否则调用_istdigit函数会崩溃  
  28.     if ((ch<-1)||(ch>255))  
  29.     {  
  30.         return;  
  31.     }  
  32.   
  33.     GetWindowText(strText);  // 获得当前已输入的字符序列  
  34.     int i= GetSel();      
  35.     if(!_istdigit(ch)) // 如果不是数字  
  36.     {  
  37.         int startSel,endSel;  
  38.         GetSel(startSel,endSel);  
  39.         if(ch == '.') // 是小数点  
  40.         {  
  41.             int minusPos;  
  42.             minusPos = strText.FindOneOf(_T("-"));  
  43.             if(strText.Find('.') != -1) // 检查是否已经输入了小数点  
  44.             {  
  45.                 ShowBalloonTip(L"不能输入字符",L"你只能输入一个小数点",TTI_ERROR);  
  46.                 return;  
  47.             }  
  48.             if ((startSel==0)||((startSel==1)&&(minusPos==0)))  
  49.             {  
  50.                 ShowBalloonTip(L"不能输入字符",L"先输入整数部分",TTI_ERROR);  
  51.                 return;  
  52.             }  
  53.   
  54.         }  
  55.         else if (ch=='-')  
  56.         {  
  57.             if(startSel)   
  58.             {  
  59.                 ShowBalloonTip(L"不能输入字符",L"你只能在此处输入数字或者小数点",TTI_ERROR);  
  60.                 return;  
  61.             }  
  62.             if(strText.Find('-') != -1)   
  63.             {  
  64.                 ShowBalloonTip(L"不能输入字符",L"你只能输入一次负号",TTI_ERROR);  
  65.                 return;  
  66.             }  
  67.         }  
  68.         else if (ch>=0&&ch<=31)  
  69.         {  
  70.             ;  
  71.         }  
  72.         else  
  73.         {  
  74.             ShowBalloonTip(L"不能输入字符",L"你只能在此处输入数字或者小数点",TTI_ERROR);  
  75.             return;  
  76.         }  
  77.     }  
  78.     CEdit::OnChar(nChar, nRepCnt, nFlags);    
  79. }  

效果如下:

       

        该编辑框兼容在unicode字符集和多字节字符集下使用。一个值得注意的问题是编辑框实现冒气泡需要对话框开启xp界面风格。在VS 2005下开启xp界面风格一个很简单的方法是在stdafx.h下添加如下代码:

[cpp] view plaincopy

  1. #if defined _M_IX86  
  2. #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  3. #elif defined _M_IA64  
  4. #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  5. #elif defined _M_X64  
  6. #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  7. #else  
  8. #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")  
  9. #endif  

        有时unicode字符集工程下已默认添加了上述代码。上述做法已在VS 2005上测试通过,VS 2005以下的VS 版本不确定能否支持,VS 2005以上的VS版本应该能支持。

 这个浮点数框类可以稍加改造为只支持整数的编辑框等(具体在OnChar函数修改)。

 

        源码工程请在此下载:PUDN下载

时间: 2024-10-24 07:21:20

实现一个冒泡提示的浮点数编辑框的相关文章

mfc-使用VS2010 MFC制作一个窗口,2个编辑框,1个按键,

问题描述 使用VS2010 MFC制作一个窗口,2个编辑框,1个按键, 每次打开的时候焦点都在第一个按键.然后使用回车键切换到下一个编辑框. 解决方案 设置好tab order.在onkeypress里面发送一个tab键消息setfocus设置焦点 解决方案二: 这个可以用PreTranslateMessage捕获回车按键,然后SetFocus来设置焦点

VC定制编辑框的上下文菜单

上下文菜单的应用在基于Windows的应用程序中使用得越来越广泛.本文针对WM_INITMENUPOPUP消息的处理机制谈谈如何在编辑框控制的上下文菜单上添加自己的菜单项. 刚开始的时候常常碰到一个问题,就是在编辑框上单击鼠标右键时,程序并不产生WM_INITMENUPOPUP消息,原因我也说不清楚,也没有找到说明这个问题的具体文档资料.每当我子类化编辑框控制向标准的上下文菜单添加自己的菜单项时(如图二), 图二 总是要碰到上面这样的问题.那么到底该如何使用WM_INITMENUPOPUP处理机

评论的界面——编辑框与软件盘之间的逻辑

问题描述 评论的界面--编辑框与软件盘之间的逻辑 目前在做一个评论的界面,编辑框位于屏幕的底端,点击EditText获取焦点时会弹出软件盘,且编辑框位于软键盘的头部位置,无论是点击屏幕其他位置,还是点击返回键收起软键盘时如何使编辑框又回到原来的位置 解决方案 http://blog.csdn.net/caesardadi/article/details/8252829

android-如何在编辑框添加一个按钮?

问题描述 如何在编辑框添加一个按钮? 我想要在EditText里面添加一个图片按钮,但是不知道怎么做,我想实现的效果如下图: 多谢指教~ 解决方案 不实现点击: android:drawableRight=""@drawable/icon"" 实现点击的代码: <?xml version=""1.0"" encoding=""utf-8""?><RelativeLayo

mfc串口通信-大神! 串口通信多编辑框显示到一个编辑框!求教代码!谢谢!

问题描述 大神! 串口通信多编辑框显示到一个编辑框!求教代码!谢谢! 是这样的.串口通信中有多个发送编辑框 现在需将这多个编辑框的内容显示到一个大的(最后的,总的)发送编辑框中 现如今这段代码遇到了问题 !求大神指点 我是个初学者 解决方案 大神指点就好啦,非常感谢!

xml-duilib 编辑框内怎么再添加一个按钮

问题描述 duilib 编辑框内怎么再添加一个按钮 我想在edit内添加一个button,类似于搜索时最右边那个放大镜似的搜索按钮,xml文件应该怎么写 解决方案 http://bbs.csdn.net/topics/390385510 解决方案二: http://blog.163.com/tfn2008@yeah/blog/static/1103213192013101035938376/ 解决方案三: 回车到下一个编辑框 MFC

安卓-多个按钮共用一个编辑框edittext

问题描述 多个按钮共用一个编辑框edittext 求教怎么实现多个按钮共用一个编辑框edittext,求具体的详细实现方法 解决方案 http://blog.csdn.net/jianghuiquan/article/details/8252430 解决方案二: 在按钮各自的点击事件中添加各自的事件 解决方案三: 共用是什么意思?可以一起操作这个编辑框? 解决方案四: 求大神帮忙解答下!!*罒▽罒*

cstring-vs2010,如何为MFC单文档中的编辑框的ID关联一个CString变量?

问题描述 vs2010,如何为MFC单文档中的编辑框的ID关联一个CString变量? vs2010,如何为MFC单文档中的编辑框的ID关联一个CString变量? 解决方案 直接用class wizard去映射,在项目菜单下. 解决方案二: 编辑框.右键选择...设置.. 解决方案三: DDX_Text(pDX, IDC_STATIC1, m_strText);

vc++6.0-VC++6.0如何实现按向上箭头焦点移动到上一个编辑框?

问题描述 VC++6.0如何实现按向上箭头焦点移动到上一个编辑框? VC++6.0基于对话框如何实现按向上箭头焦点移动到上一个编辑框,连续按连续移动?