栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CMFCMaskedEdit

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CMFCMaskedEdit

CMFCMaskedEdit的ON_EN_CHANGE()问题

文章目录
      • CMFCMaskedEdit的ON_EN_CHANGE()问题
        • 1.问题描述
        • 2.结果
        • 3.解决方法
        • 4.CMFCMaskedEdit的OnChar消息响应函数源码问题分析
        • 5.最后

1.问题描述

在响应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获取到的为控件更新前的值;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/675781.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号