【发布时间】:2017-08-16 02:03:20
【问题描述】:
有一个WTL::CListViewCtrl,它显示在一个窗口中。当它获得焦点并按下任何键时,会调用 WM_KEYDOWN / UP,但会调用 WM_CHAR。
class CPopupList : public CWindowImpl<CPopupList, WTL::CListViewCtrl>
{
public:
DECLARE_WND_SUPERCLASS(NULL, WTL::CListViewCtrl::GetWndClassName())
BEGIN_MSG_MAP(CPopupList)
MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)
MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
MESSAGE_HANDLER(WM_CHAR, OnChar)
REFLECTED_NOTIFY_CODE_HANDLER(LVN_ITEMCHANGED, OnListItemChanged)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
LRESULT OnChar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
LRESULT OnGetDlgCode(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& afx_msg LRESULT OnListItemChanged(WPARAM wParam, LPNMHDR hdr, BOOL&);
...
}
CPopupList::OnKeyDown 和 CPopupList::OnKeyUp 都被调用,但 CPopupList::OnChar 不被调用。
OnGetDlgCode 代码是return DLGC_WANTALLKEYS | DLGC_WANTCHARS;
我发现,如果我将 WM_KEYDOWN 发布到父窗口,则会在父窗口中调用 WM_CHAR:
LRESULT CPopupList::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
::PostMessage(m_hWndParentCtrl, uMsg, wParam, lParam); -> this will call WM_KEYDOWN + WM_CHAR in parent
}
我想在 ListView 中捕捉 WM_CHAR。我该怎么做,我错过了什么?
【问题讨论】:
-
您可以使用虚函数 PreTranslateMessage(MSG* pMsg) 捕获几乎所有消息。
标签: listview mfc event-handling wtl clistctrl