在MFC(Microsoft Foundation Classes)中创建一个对话框的过程,该对话框用于输入序列号(SN),并具有一些特定的行为,比如自动聚焦到输入框、验证输入规则以及根据输入情况关闭对话框。以下是步骤说明和一些代码示例:
步骤 1: 创建对话框资源
- 使用MFC的资源编辑器添加一个新的对话框资源。
- 在对话框中添加一个编辑控件(IDC_EDIT1),用于输入SN。
- 设置编辑控件的文本对齐属性为居中(Align Text 属性设为 Center)。
步骤 2: 设置对话框类
-
为对话框创建一个类,继承自
CDialog
。 -
在对话框类的构造函数中,创建一个自定义字体并设置为输入框的字体。
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: 初始化对话框
-
重写
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: 监控输入情况
-
通过处理
EN_UPDATE
通知消息来监控输入框的内容变化。 -
如果输入不符合规则,清空输入框;如果符合规则,设置一个定时器用于自动关闭对话框。
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验证逻辑
-
实现
CheckSN
函数,根据你的业务规则验证SN的合法性。BOOL CYourDialog::CheckSN()
{
// 实现SN验证逻辑
// 返回TRUE表示SN合法,FALSE表示不合法
}
步骤 6: 注册消息和添加控件变量
-
在对话框类的头文件中,添加消息映射和控件变量。
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; // 自动关闭前的等待时间