//自定义Edit,实现十六进制输入控制,使用OnChar()函数实现
//MyEdit.h
#pragma once class CMyEdit : public CEdit {
DECLARE_DYNAMIC(CMyEdit) -----------------------① public:
CMyEdit(){};
protected:
DECLARE_MESSAGE_MAP() ----------------------------②
public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); ------③
};
//MyEdit.cpp
#include "stdafx.h" -----------------------------------④
#include "MyEdit.h" IMPLEMENT_DYNAMIC(CMyEdit, CEdit) BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
ON_WM_CHAR()
END_MESSAGE_MAP() void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if((nChar>=&&nChar<=)||(nChar>=&&nChar<=) || //0~9, A~F
(nChar>=&&nChar<=) || (nChar==) || //a~f, space,
(nChar == ) || nChar == ){ //backspace, delete
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
#pragma once 防止重复编译,头文件很可能会被多个cpp文件包含,这样一方面节省时间,另一方面防止类或者变量重复定义(全局变量可使用extern),c语言里面采用:
#ifndef
#define __MYEDIT_H__
...
#endif
①DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏。
同时还有一对宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE是为了“动态创建”类的实例而定义的宏。new可以用来创建对象,但不是动态的。比如说,你要在程序中实现根据用户输入的类名来创建类的实例:
char szClassName[];
cin >> szClassName;
CObject *pOb = new szClassName; //错误
这里就要用到DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE。
②DECLARE_MESSAGE_MAP(),消息映射声明,有了这个之后这个类才能接收系统消息,这个可是Windows核心之一^_^
③消息声明,这里采用OnChar函数,可采用的按顺序发生的有OnKeyDown()、OnChar()、OnKeyUp(),在这个函数里面控制键盘按下之后的处理,我这里是要输入十六进制字符,使用第一个参数UINT nChar控制输入,同时还要考虑空格键和删除键。
④stdafx.h:标准系统包含文件和经常使用但不经常变化的项目特定包含文件的包含文件,这些文件用于生成预编译头文件 Projname.pch 和预编译类型文件 Stdafx.obj。
所谓头文件预编译就是把一个工程中使用的一些MFC标准头文件(如windows.h、Afxwin.h)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
1、所有MFC实现文件都有#include “stdafx.h”
2、#include “stdafx.h”必须添加到.cpp文件的第一行