当我们在向文本编辑框中输入字符时,有时要求只允许输入数字,有时要求只允许输入字符或者可显字符。这个我们可以通过新建一个继承于CEdit的类来实现。
MyEdit.h文件
#pragma once
// CMyEdit
class CMyEdit : public CEdit
{
DECLARE_DYNAMIC(CMyEdit)
public:
CMyEdit();
virtual ~CMyEdit();
protected:
DECLARE_MESSAGE_MAP()
virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
};
MyEdit.cpp文件
#include "stdafx.h"
#include "MyEdit.h"
#include "resource.h"
// CMyEdit
IMPLEMENT_DYNAMIC(CMyEdit, CEdit)
CMyEdit::CMyEdit()
{
}
CMyEdit::~CMyEdit()
{
}
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
ON_WM_CHAR()
END_MESSAGE_MAP()
// CMyEdit message handlers
LRESULT CMyEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
return CEdit::DefWindowProc(message, wParam, lParam);
}
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
UINT ch = nChar;
HWND hWnd = ::GetFocus();
int CtrlId = ::GetDlgCtrlID(hWnd);
// 删除键
if (ch == VK_BACK)
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
//针对某个控件进行特殊处理
else if (CtrlId == IDC_EDIT_PUBLIC_SERIAL_CS_FIX_VALUE)
{
// 可显字符
if ((ch >= 32 && ch <= 126)|| (ch == VK_DELETE))
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
//针对某个控件进行特殊处理
else if (CtrlId == IDC_EDIT_PUBLIC_OTHER_SISCREV_VALUE)
{
//数字、字母和小数点
if (ch >= '0' && ch <= '9'
|| ch >= 'a' && ch<= 'z'
|| ch >= 'A' && ch<= 'Z'
|| ch == VK_DELETE)
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
// 正常处理
else if (ch >= '0' && ch <= '9')
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
这个新定义的类的重点在OnChar函数,在这个函数里面我们可以对输入的字符进行判断而进行处理; 有可能,各个控件要求的输入规则不同,如果针对每种规则去创建这样一个类会感觉到代码臃余,所以在上面这段代码中,我们通过判断当前ID对应的控件要求输入规则进行了分支处理。
下面介绍具体的使用方法:
1、在控件所在的对话框类中,添加一个
CMyEdit m_DataEdit;变量
2、在对话框类的OnInitDialog函数中,添加如下代码:
m_DataEdit.SubclassDlgItem(IDC_EDIT_BIN_COMPARE_CAP1,this);
这样我们就将ID:IDC_EDIT_BIN_COMPARE_CAP1对应的控件关联到CMyEdit类。