【问题标题】:Why WM_CHAR is not called in my ListView为什么我的 ListView 中没有调用 WM_CHAR
【发布时间】: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::OnKeyDownCPopupList::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


【解决方案1】:

ListView 不允许键入文本。因此,它不需要产生 WM_CHAR。此特定消息通常是使用TranslateMessage API 从击键转换而来的。您的父窗口显然会调用它。

【讨论】:

  • 很可惜,因为我需要处理打字(我会跳到给定的位置,就像一个列表框左右)。我目前所做的,作为一种解决方法,在WM_KEYDOWN 中,我通过ToUnicode 手动将键转换为char,然后选择匹配的行。不确定是否有更好的主意。我不想在父级中捕获 WM_CHAR 然后发送回 ListView。
  • 我想你可以覆盖ListViewWndProc 并在那里拨打TranslateMessage
  • 所以你的意思是,在WndProc 中,如果WM_KEYDOWN 到达,我只需调用TranslateMessage,它会发送一个WM_CHAR ?
  • 嗯。可能不在WndProc 中,而是在发送消息之前(不知道在MFC 代码中发生了什么)。您应该始终致电TranslateMessagewin32developer.com/tutorial/windows/windows_tutorial_2.shtm
  • 是的,可能然后深入研究WTL(不是MFCListView 消息调度程序核心代码,我可以做到……但现在看起来太多了,所以我想我更喜欢第一条评论中描述的“解决方法”。
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2012-01-30
  • 2015-03-30
  • 2014-03-08
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多