//从CEdit派生一个只允许输入16进制数据的新类
//支持输入 空格 0-F Backspace
//在激活时切换输入法至英文键盘
//在失去焦点时恢复输入法
//遇非法字符时有警示音提示
#pragma once
// CHexEditCtrl
class CHexEditCtrl : public CEdit
{
DECLARE_DYNAMIC(CHexEditCtrl)
public:
CHexEditCtrl();
virtual ~CHexEditCtrl();
protected:
afx_msg BOOL OnEnSetfocusEx();
afx_msg BOOL OnEnKillfocusEx();
DECLARE_MESSAGE_MAP()
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//输入法状态
protected:
BOOL m_bImmGetOpenStatus;
};
// HexEditCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "HexEditCtrl.h"
#include <imm.h>
#pragma comment(lib, "imm32.lib")
// CHexEditCtrl
IMPLEMENT_DYNAMIC(CHexEditCtrl, CEdit)
CHexEditCtrl::CHexEditCtrl()
{
m_bImmGetOpenStatus = 0;
}
CHexEditCtrl::~CHexEditCtrl()
{
}
BEGIN_MESSAGE_MAP(CHexEditCtrl, CEdit)
ON_CONTROL_REFLECT_EX(EN_SETFOCUS, OnEnSetfocusEx)
ON_CONTROL_REFLECT_EX(EN_KILLFOCUS, OnEnKillfocusEx)
END_MESSAGE_MAP()
// CHexEditCtrl message handlers
LRESULT CHexEditCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
//过滤其它字符
//允许 空格 0-F Backspace
if(message == WM_CHAR)
{
WCHAR szInput[2] = {(WCHAR)wParam, 0};
_wcsupr(szInput);
static LPCWSTR szValidItem =L" 0123456789ABCDEF\b";
if(wcsstr(szValidItem, szInput) == 0)
{
MessageBeep(-1);//警示音
return 0;
}
wParam = szInput[0];
}
if(WM_INPUTLANGCHANGEREQUEST == message) //切换输入法消息
{
return 0; //锁定输入法
}
return CEdit::WindowProc(message, wParam, lParam);
}
BOOL CHexEditCtrl::OnEnSetfocusEx()
{
// TODO: Add your control notification handler code here
//关闭输入法
HIMC hImc = ImmGetContext(m_hWnd);
if(hImc)
{
m_bImmGetOpenStatus = ImmGetOpenStatus(hImc)? 1:-1;
ImmSetOpenStatus(hImc, FALSE);
}
return TRUE;
}
BOOL CHexEditCtrl::OnEnKillfocusEx()
{
// TODO: Add your control notification handler code here
//恢复输入法
if(m_bImmGetOpenStatus)
{
HIMC hImc = ImmGetContext(m_hWnd);
if(hImc)
{
ImmSetOpenStatus(hImc, m_bImmGetOpenStatus>0);
}
m_bImmGetOpenStatus = 0;
}
return TRUE;
}
//应用示例
// MFC_1Dlg.h : 头文件
//
#pragma once
#include "HexEditCtrl.h"
// CMFC_Dlg 对话框
class CMFC_Dlg : public CDialog
{
protected:
CHexEditCtrl m_Edit;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// MFC_1Dlg.cpp : 实现文件
//
void CMFC_Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT, m_Edit);
}