- CMFCMaskedEdit的ON_EN_CHANGE()问题
- 1.问题描述
- 2.结果
- 3.解决方法
- 4.CMFCMaskedEdit的OnChar消息响应函数源码问题分析
- 5.最后
在响应CMFCMaskedEdit的ON_WM_CHANGED消息中,调用GetWindowText,无法获取控件更新后的字符串;
class CMyDialog :
public CParentDialog
{
// 函数声明
public:
afx_msg void OnEnChanged();
};
BEGIN_MESSAGE_MAP(CMyDialog, CParentDialog)
ON_EN_CHANGE(IDC_My_Edit, &CMyDialog::OnEnchanged)
END_MESSAGE_MAP()
void CMyDialog::OnEnchanged()
{
CString strText;
GetDlgItemText(IDC_My_Edit, strText);
}
2.结果
上述strText中的值总是控件更新之前的值;
3.解决方法重载CMFCMaskedEdit,并重载CMFCMaskedEdit的OnChar消息
#include
#include
// 类声明
class CMyMaskedEdit :
public CMFCMaskedEdit
{
DECLARE_DYNAMIC(CMyMaskedEdit)
public:
CMyMaskedEdit();
virtual ~CMyMaskedEdit();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
};
// 类实现
BEGIN_MESSAGE_MAP(CMyMaskedEdit, CMFCMaskedEdit)
ON_WM_CHAR()
END_MESSAGE_MAP()
#define WM_NOTIFY_MSG_EN_CHANGE (WM_USER+1001) // 自定义消息
void CMyMaskedEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CMFCMaskedEdit::OnChar(nChar, nRepCnt, nFlags);
NMHDR nmhdr;
nmhdr.hwndFrom = this->m_hWnd;
nmhdr.idFrom = GetDlgCtrlID();
nmhdr.code = WM_NOTIFY_MSG_EN_CHANGE;
GetParent()->SendMessage(WM_NOTIFY, (WPARAM)nmhdr.idFrom, (LPARAM)& nmhdr);
}
在CMyDialog中响应WM_NOTIFY_MSG_EN_CHANGE消息;
// 函数声明
afx_msg void OnEnChanged(NMHDR* pNMHDR, LRESULT* pResult);
BEGIN_MESSAGE_MAP(CMyDialog, CParentDialog)
ON_NOTIFY(WM_NOTIFY_MSG_EN_CHANGE, IDC_My_Edit, &CMyDialog::OnEnChanged)
END_MESSAGE_MAP()
void CMyDialog::OnEnChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
CString strText;
GetDlgItemText(IDC_My_Edit, strText); // 成功获取到控件更新后的字符串值
}
4.CMFCMaskedEdit的OnChar消息响应函数源码问题分析
void CMFCMaskedEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
TCHAR chChar = (TCHAR) nChar;
if (_istprint(chChar) && !(::GetKeyState(VK_CONTROL)&0x80))
{
OnCharPrintchar(nChar, nRepCnt, nFlags);
return;
}
else if ((nChar == VK_DELETE || nChar == VK_BACK) &&(!m_strMask.IsEmpty()))
{
return;
}
int nBeginOld, nEndOld;
CEdit::GetSel(nBeginOld, nEndOld);
CEdit::OnChar(nChar, nRepCnt, nFlags);
DoUpdate(TRUE, nBeginOld, nEndOld);
}
BOOL CMFCMaskedEdit::DoUpdate(BOOL bRestoreLastGood, int nBeginOld, int nEndOld)
{
if (m_bPasteProcessing)
{
return FALSE;
}
m_bPasteProcessing = TRUE;
CString strNew;
GetWindowText(strNew);
BOOL bRet = SetValue(strNew, TRUE);
if (!bRet)
{
MessageBeep((UINT)-1);
}
if (!bRet && bRestoreLastGood)
{
CString strOld = m_str;
SetWindowText (strOld);
if (nBeginOld != -1)
{
CEdit::SetSel(nBeginOld, nEndOld);
}
}
m_bPasteProcessing = FALSE;
return bRet;
}
5.最后
猜测可能是因为在DoUpdate处理中SetWindowText (strOld)引起的问题,导致在响应函数ON_EN_CHANGE中调用GetWindowText获取到的为控件更新前的值;



