MFC 事件处理程序

Posted

技术标签:

【中文标题】MFC 事件处理程序【英文标题】:MFC Event Handlers 【发布时间】:2008-11-03 15:20:55 【问题描述】:

只是想知道以以下为前缀的MFC控制消息之间的区别是:

LVN (e.g. LVN_ITEMCHANGED)
HDN (e.g. HDN_TRACK)
NM (e.g. NM_HOVER)

此外,当用户使用 NM_CLICK 消息单击项目时,我正在使用 ListControl 并进行陷印。我还想在用户选择一个新项目时捕获一个键,例如向上/向下箭头键。谁能告诉我应该为此设置哪些信息?

谢谢

【问题讨论】:

【参考方案1】: LVN = ListView 通知 HDN = 标头控制通知 NM = er..um..“鼠标通知”?

【讨论】:

NM_ 是非特定控件类型的通用控件通知。我通常将其解析为“通知消息”。【参考方案2】:

对于选择的更改,您需要处理 LVN_ITEMCHANGED 通知:

NMLISTVIEW & nm = *(NMLISTVIEW *) pnmh;
if (  (nm.uNewState ^ nm.uOldState) & LVIS_SELECTED) 
     
   // nm.iItem was selected or deselected
   if (!m_internalUIChange)
   
      // see below
   

第一个“if”检查“selected”状态是否已更改。请注意,当在列表中选择不同的项目时,它仍然会触发两次:一次用于取消选择旧项目,一次用于选择新项目。但是,这对于获取“完全取消选择”是必要的。

此通知经常触发 - 即使您以编程方式修改控件也是如此。如果您的处理程序应该只对用户事件做出反应,那么您至少需要一个在这些操作期间设置的标志(我为此使用了一个类和一个 RAII-Lock,所以我不会忘记重置它)

【讨论】:

以上是关于MFC 事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

哪个是 MFC C++ 中单选组合框的事件处理程序

如何为 MFC 中的线程完成添加事件处理程序?

如何在 MFC 中处理 CTreeCtrl 的状态更改事件

MFC 对话框的事件处理

定位事件处理程序

如何使用 MFC 在 CWinApp 中接收计时器事件?