windows核心编程<读书笔记一>---重写Onchar函数
2011-11-18 00:29
253 查看
【文起】:蟹儿的爱是我坚持的动力,为了你和我们的幸福
第一章中,书上有一个程序用例,在一个Edit中输入错误码ID,另一个Edit中显示错误码描述。自己写完发现错误码ID能输入所有的字符,这显然是不对的,就想到了去限制只能输入数字和delete。
MFC中可以通过设置Eidt属性为NUM解决。但是我想到如果要求可以输入小数点或者负号呢?在网上搜了下,看到了MFC子类化。这儿只说如何实现,不深究原理。
一:
新增一个MFC类,CEdit_NUMONLY,继承之CEdit。给类CEdit_NUMONLY添加WM_CHAR消息处理,于是有了函数
二:
在用到需要限制对话框的类中,添加 CEdit_NUMONLY m_editNumOnly; 然后在初始化对话框时,调用子类化函数。
即在函数
三:
重写OnChar函数:
1、如果传入的字符是0-9或者是delete(注意这儿跟模拟键盘中不一样,delete是VK_BACK而非VK_DELETE),那么就正常处理;
2、如果传入的是回车,那么获取ErrCodeID,调用FormatMessage函数取得错误码描述;
3、如果是其他的,提示输入必须是数字。
代码如下:
四:
OnChar函数是系统在KeyUp只前和KeyDown之后调用的,所以还有一种方法是在KeyDown中做限制,原理雷同,不多说。
如果以上内容对你有用了,请留下对我和蟹儿的祝福。谢谢~~
第一章中,书上有一个程序用例,在一个Edit中输入错误码ID,另一个Edit中显示错误码描述。自己写完发现错误码ID能输入所有的字符,这显然是不对的,就想到了去限制只能输入数字和delete。
MFC中可以通过设置Eidt属性为NUM解决。但是我想到如果要求可以输入小数点或者负号呢?在网上搜了下,看到了MFC子类化。这儿只说如何实现,不深究原理。
一:
新增一个MFC类,CEdit_NUMONLY,继承之CEdit。给类CEdit_NUMONLY添加WM_CHAR消息处理,于是有了函数
void CEdit_NUMONLY::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
二:
在用到需要限制对话框的类中,添加 CEdit_NUMONLY m_editNumOnly; 然后在初始化对话框时,调用子类化函数。
即在函数
BOOL CErrorShowDlg::OnInitDialog() { /* 省略系统默认生成的代码 */ m_editNumOnly.SubclassDlgItem(IDC_EDIT_ERRCODE,this); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
三:
重写OnChar函数:
1、如果传入的字符是0-9或者是delete(注意这儿跟模拟键盘中不一样,delete是VK_BACK而非VK_DELETE),那么就正常处理;
2、如果传入的是回车,那么获取ErrCodeID,调用FormatMessage函数取得错误码描述;
3、如果是其他的,提示输入必须是数字。
代码如下:
void CEdit_NUMONLY::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if ((nChar <= '9' && nChar >= '0') || (VK_BACK == nChar) ) { CEdit::OnChar(nChar, nRepCnt, nFlags); } else if (VK_RETURN == nChar) { int i_errcode = GetDlgItemInt(IDC_EDIT_ERRCODE); LPWSTR lp_buffer; BOOL bOK; bOK = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL,i_errcode,MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED), lp_buffer,0,NULL); if (bOK) { SetDlgItemText(IDC_EDIT_ERR,lp_buffer); } else { SetDlgItemText(IDC_EDIT_ERR,_T("Err code is wrong")); } } else { AfxMessageBox(_T("只能输入数字")); } }
四:
OnChar函数是系统在KeyUp只前和KeyDown之后调用的,所以还有一种方法是在KeyDown中做限制,原理雷同,不多说。
如果以上内容对你有用了,请留下对我和蟹儿的祝福。谢谢~~
相关文章推荐
- Windows核心编程<读书笔记五>手把手写JobLab程序
- Windows核心编程<读书笔记十七> 内存映射文件
- java之重载和重写<一>
- Windows核心编程<读书笔记四> 进程的概念
- Java多态之重写<一>
- Windows核心编程<读书笔记五>作业JOB
- Windows核心编程<读书笔记六> 线程
- Javascript Math 中常用函数<一>--ceil(),floor(),round()
- Windows核心编程<读书笔记二>Unicode和ANSI
- ThinkPHP 学习笔记<一>:ThinkPHP常用函数说明
- Windows核心编程<读书笔记十二>纤程
- Windows核心编程<读书笔记十三>Windows的内存结构
- PostgreSQL学习笔记5之函数和操作符<一>
- Windows核心编程<读书笔记八>线程的同步
- 代码的未来读书笔记<一>
- Windows核心编程<读书笔记九>线程与内核对象的同步
- Windows核心编程<读书笔记十七>Applnst程序详解
- Windows核心编程<读书笔记四之程序>显示系统中进程、线程、模块详细信息
- Windows核心编程<读书笔记九>手把手写Queue程序
- Windows核心编程<读书笔记十六>线程的堆栈