从CEdit派生一个只允许输入16进制数据的新类

//从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);

}


 

 


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值