您的位置:首页 > 编程语言

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消息处理,于是有了函数

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中做限制,原理雷同,不多说。

如果以上内容对你有用了,请留下对我和蟹儿的祝福。谢谢~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: