MFC序列号输入框

在MFC(Microsoft Foundation Classes)中创建一个对话框的过程,该对话框用于输入序列号(SN),并具有一些特定的行为,比如自动聚焦到输入框、验证输入规则以及根据输入情况关闭对话框。以下是步骤说明和一些代码示例:

步骤 1: 创建对话框资源

  1. 使用MFC的资源编辑器添加一个新的对话框资源。
  2. 在对话框中添加一个编辑控件(IDC_EDIT1),用于输入SN。
  3. 设置编辑控件的文本对齐属性为居中(Align Text 属性设为 Center)。

步骤 2: 设置对话框类

  1. 为对话框创建一个类,继承自CDialog

  2. 在对话框类的构造函数中,创建一个自定义字体并设置为输入框的字体。

    CYourDialog::CYourDialog(UINT nIDTemplate, CWnd* pParentWnd)
    : CDialog(nIDTemplate, pParentWnd)
    {
    // 从系统中检索当前图标标题使用的字体设置
    SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0);

    复制代码
     lf.lfWeight = FW_NORMAL;
     lf.lfHeight = 50; // 设置字体大小为50像素
     m_hFont = CreateFontIndirect(&lf);

    }

    CYourDialog::~CYourDialog()
    {
    DeleteObject(m_hFont);
    if (m_hIMC)
    ImmAssociateContext(GetSafeHwnd(), m_hIMC);
    }

步骤 3: 初始化对话框

  1. 重写OnInitDialog函数,设置输入框的字体并聚焦。

    BOOL CYourDialog::OnInitDialog()
    {
    CDialog::OnInitDialog();

    复制代码
     CWnd* pwnd = GetDlgItem(IDC_EDIT1);
     if (pwnd)
     {
         pwnd->SendMessage(WM_SETFONT, (WPARAM)m_hFont, 0);
         pwnd->SetFocus();
         // 关闭输入法
         m_hIMC = ::ImmAssociateContext(pwnd->GetSafeHwnd(), NULL);
     }
     return TRUE;

    }

步骤 4: 监控输入情况

  1. 通过处理EN_UPDATE通知消息来监控输入框的内容变化。

  2. 如果输入不符合规则,清空输入框;如果符合规则,设置一个定时器用于自动关闭对话框。

    void CYourDialog::OnEnChangeEdit1()
    {
    CWnd* pwnd = GetDlgItem(IDC_EDIT1);
    if (pwnd)
    {
    pwnd->GetWindowText(m_strSN);
    }

    复制代码
     if (!m_strSN.IsEmpty())
     {
         if (!m_bTimer)
         {
             m_bTimer = TRUE;
             SetTimer(TIMER_CHECKSTRING, 200, NULL);
             m_strOld = m_strSN; 
         }
     }

    }

    void CYourDialog::OnTimer(UINT_PTR nIDEvent)
    {
    if (nIDEvent == TIMER_CHECKSTR)
    {
    CWnd* pwnd = GetDlgItem(IDC_EDIT1);
    if (pwnd)
    {
    pwnd->GetWindowText(m_strSN);
    }

    复制代码
         if (m_strSN != m_strOld)
         {
             if (!CheckSN())
             {
                 pwnd->SetWindowText(L"");
             }
             else
             {
                 SetTimer(TIMER_CLOSE, m_nDeadTime, NULL); // m_nDeadTime为自动关闭前的等待时间
             }
             m_bTimer = FALSE;
         }
     }
     else if (nIDEvent == TIMER_DEAD_CLOSE )
     {
         KillTimer(TIMER_DEAD_CLOSE );
         KillTimer(TIMER_CLOSE);
         EndDialog(IDOK);
     }

    }

步骤 5: 实现SN验证逻辑

  1. 实现CheckSN函数,根据你的业务规则验证SN的合法性。

    BOOL CYourDialog::CheckSN()
    {
    // 实现SN验证逻辑
    // 返回TRUE表示SN合法,FALSE表示不合法
    }

步骤 6: 注册消息和添加控件变量

  1. 在对话框类的头文件中,添加消息映射和控件变量。

    enum { IDD = IDD_YOURDIALOG };
    enum { IDC_EDIT1 = 1000 };

    BEGIN_MESSAGE_MAP(CYourDialog, CDialog)
    // ...
    ON_EN_CHANGE(IDC_EDIT1, &CYourDialog::OnEnChangeEdit1)
    ON_WM_TIMER()
    END_MESSAGE_MAP()

    private:
    CFont m_hFont;
    HIMC m_hIMC;
    BOOL m_bTimer;
    CString m_strSN, m_strOld;
    const UINT TIMER_CHECKSTR = 1;
    const UINT TIMER_DEAD_CLOSE = 2;
    UINT m_nDeadTime; // 自动关闭前的等待时间

相关推荐
老王熬夜敲代码22 分钟前
泛型编程的差异抽象思想
开发语言·c++·笔记
hetao173383741 分钟前
2025-12-02~03 hetao1733837的刷题记录
c++·算法
“愿你如星辰如月”1 小时前
C++11核心特性全解析
开发语言·c++
广都--编程每日问1 小时前
c++右键菜单统一转化文件为utf8编码
c++·windows·python
点云SLAM1 小时前
C++包装器之类型擦除(Type Erasure)包装器之小对象优化(SBO, Small Buffer Optimization)示例(5)
c++·内存管理·c++高级应用·c++包装器·类型擦除包装器·内存小对象优化
curry____3031 小时前
study in PTA(高精度算法与预处理)(2025.12.3)
数据结构·c++·算法·高精度算法
lijiatu100862 小时前
[C++] QTimer与Qt事件循环机制 实验探究
c++·qt
三月微暖寻春笋2 小时前
【和春笋一起学C++】(四十九)C++中string类的简介
c++·cstring·string类·string类的实现·string类方法
Bona Sun2 小时前
单片机手搓掌上游戏机(二十一)—pico运行doom之修改编译
c语言·c++·单片机·游戏机
松涛和鸣2 小时前
23、链式栈(LinkStack)的实现与多场景应用
linux·c语言·c++·嵌入式硬件·ubuntu