几年前写的一个窗口程序,当时为了提升自己的技术,没有采用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 分钟阅读时长
本文内容
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捕获编辑框的输入变化消息。
欢迎关注技术公众号:架构师成长营