模拟MFC自定义窗口响应编辑框输入变化事件

几年前写的一个窗口程序,当时为了提升自己的技术,没有采用MFC原生的窗口类,而是模拟MFC的底层实现,自己实现了一个窗口基类,并实现了处理窗口各类消息的循环。

最近,为了提升用户的交互体验,需要响应编辑框的输入变化事件,这在MFC中本可轻松实现,但是由于本人的程序是模拟MFC的底层实现,消息处理没能做到响应所有的窗口和空间消息及事件。在多年前的程序中添加该事件响应,很多技术细节都已经模糊了,所以很是费了一番周折,在此记录下来。

代码如下,自定义宏
 

#define SORA_MSG_MAP_BEGIN(TheClass) \
	typedef TheClass ThisClass;\
	static SORA_MSG_MAP pMessageEntries[] = \
	{

#define SORA_MSG_MAP_END \
		{(UINT)0, (UINT)0, (WORD)0, (SORA_PMSG)0}\
	};\
	m_pMessageEntries = &pMessageEntries[0];

#define MSG_COMMAND(msg, msgFunc)\
	{WM_COMMAND, \
	(UINT)msg, \
	(WORD)0, \
	(SORA_PMSG)&ThisClass::msgFunc},

#define MSG_COMMAND_EX(msg, controlid, msgFunc)\
	{WM_COMMAND, \
	(UINT)msg, \
	(WORD)controlid, \
	(SORA_PMSG)&ThisClass::msgFunc},

在窗口配置控件的事件响应时,如下配置:

void CListFilesDlg::InitMessageMap()
{
	SORA_MSG_MAP_BEGIN(CListFilesDlg)
	MSG_COMMON(WM_INITDIALOG, OnInitDialog)
	MSG_COMMAND(IDOK, OnOK)
	MSG_COMMAND(IDB_OPEN, OnOpen)
	MSG_COMMAND(IDCANCEL, OnCancel)
	MSG_NOTIFY(NM_DBLCLK, IDC_LIST_FILES, OnDbClickList)
	MSG_COMMAND_EX(EN_UPDATE, IDC_EDIT_FIND_FILE, OnInputChange)
	SORA_MSG_MAP_END
}

其中,IDC_EDIT_FIND_FILE为编辑框的ID,OnInputChange函数响应其输入变化事件。

在msdn中关于事件EN_UPDATE的描述如下:

EN_CHANGE notification code

  • ‎2018‎年‎05‎月‎31‎日
  • 2 分钟阅读时长

本文内容

  1. Parameters
  2. Remarks
  3. Requirements
  4. See also

 

Sent when the user has taken an action that may have altered text in an edit control. Unlike the EN_UPDATE notification code, this notification code is sent after the system updates the screen. The parent window of the edit control receives this notification code through a WM_COMMAND message.

C++复制

EN_CHANGE

    WPARAM wParam;
    LPARAM lParam;

Parameters

wParam

The LOWORD contains the identifier of the edit control. The HIWORD specifies the notification code.

lParam

A handle to the edit control.

wParam的低位表示空间的标识,高位标识事件的code。

所以,在窗口的时间循环中,处理EN_CHANGE事件,代码如下:

			if (nMsg == WM_COMMAND)
			{
				if (m_pMessageEntries[i].nControlID == 0) {
					if (m_pMessageEntries[i].nMsgID == wParam)
					{
						bFound = TRUE;
						break;					
					}
					if (HIWORD(wParam)  ==  EN_SETFOCUS && 
						m_pMessageEntries[i].nMsgID == EN_SETFOCUS) {
							bFound = TRUE;
							break;
					}
				} else if (m_pMessageEntries[i].nControlID == LOWORD(wParam)) {
					if ((UINT)(m_pMessageEntries[i].nMsgID)	== HIWORD(wParam))
					{
						bFound = TRUE;
						break;
					}
				}
			}

以上即可模拟MFC捕获编辑框的输入变化消息。

欢迎关注技术公众号:架构师成长营

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值