65.9K
CodeProject 正在变化。 阅读更多。
Home

CHexEdit 控件 - 用于十六进制和十进制数字输入

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (12投票s)

2005年1月25日

2分钟阅读

viewsIcon

108908

downloadIcon

4289

一篇关于如何编写用于 HEX 和 DEC 数字输入的 Edit 控件的文章。

Sample Image - chexedit.JPG

引言

最近,我正在开发一款诊断软件,需要一个用于 HEX/DEC 数字输入的 Edit 控件。MFC 自带的 CEdit 在这方面不太好,因为它不能阻止用户输入无效的 HEX 数字。

因此,我创建了从 CEdit 派生的 CHexEdit 控件,用于 HEX/DEC 数字输入,它非常易于使用。

CHexEdit 控件的特性

以下是 CHexEdit 类的特性

  • 自动验证用户输入,并防止无效的 HEX/DEC 数字格式输入。
  • 自动检测 HEX/DEC 数字,并通过着色文本来突出显示差异。
  • 能够通过自带的菜单将 HEX 转换为 DEC 或将 DEC 转换为 HEX 数字。
  • 重新定义 Paste、Cut、Delete、Copy 操作以避免无效输入。
  • 通过其 GetValue()/SetValue() 函数轻松管理输入值。
  • 易于 MFC 开发者实现。

使用 CHexEdit 控件

要使用 CHexEdit,您必须执行以下步骤

  1. 在您的应用程序中,为您的 Edit 控件添加一个控件变量。
  2. 在相应的 .h 文件中,将 CEdit 更改为 CHexEdit,如下所示
     public:
    CHexEdit m_cEdit;
  3. (可选)您可以在初始化应用程序时定义您自己的 HEX/DEC 数字背景/前景颜色。
    m_cEdit.SetHexColor(RGB(255,255,255),RGB(0,0,0));
    //black text color and white text background for hex number
    
    m_cEdit.SetDecColor(RGB(0,0,0),RGB(255,255,255));
    //white text color and black text background for dec number
  4. (可选)您可以通过 SetValue(unsigned int _value,bool _bHex) 定义其默认数字。
    m_cEdit.SetValue(100,true);
    //set value to 100 using HEX format to express
  5. 您可以通过 GetValue() 获取输入值。

技术背景

CHexEdit 派生自 CEdit,并且有三个修改,包括

  1. 验证用户输入。这通过覆盖 CEdit::PreTranslateMessage(MSG* pMsg) 来完成。当用户敲击一个键时,它会确定该键是否有效,并将输入的字母转换为大写,使数字看起来更好看。
  2. 重新定义 CEdit 的默认弹出菜单。由于用户不能一直进行复制、剪切、粘贴等操作,因此最好检查剪贴板缓冲区,并在数据不合适时将这些菜单项灰显。
  3. 获取输入数字类型 (HEX/DEC)。通过拦截 EN_UPDATE 消息,它会检查输入的数字是 HEX 还是 DEC,并自动对背景和前景进行着色。
    void CHexEdit::OnEnUpdate() {
        CStringtext;
        this->GetWindowText(text);
        //Hex or Dec?
        this->m_bHex=false;
        if(text.Find("0x")== 0)
            this->m_bHex=true;
        for(int i=0; i < text.GetLength(); i++)
        {
            char c=text.GetAt(i);
            if(c >= 'A' && c <= 'F')
                this->m_bHex=true;
        }
        this->RedrawWindow();
    }

历史

  • 2005 年 1 月 21 日 - v1.0 - 首次发布。
© . All rights reserved.