竟然撞到了微软的BUG——使用ListCtrl响应ENTER击键

竟然撞到了微软的BUG——使用ListCtrl响应ENTER击键

想实现一个在ListCtrl的某个ITEM上单击ENTER键而执行一些动作的功能。为此,最先想到添加NM_ENTER事件响应函数,但发现并没有执行相应的功能。设断点调试发现根本不能进入该响应函数。

又添加了LVN_KEYDOWN响应函数,现在可以响应很多击键,但是ENTER键还是不能响应,ESC键也不能。

尝试响应NM_DBLCLK,结果是可以的,证明大方向没错。

看了一些MSDN,还搜了CODE PROJECT,未果,陷入僵局。

还是搜MSDN,快要放弃的时候,看到了一则标题为“BUG: ESC/ENTER Keys Do Not Work When Editing CTreeCtrl Labels”的文章。

照样子拿过来,问题解决。


附上关键部分代码:

// 响应ENTER击键,执行相应功能
void  CMyFormView::OnLvnKeydownMyList(NMHDR  * pNMHDR, LRESULT  * pResult)
{
 LPNMLVKEYDOWN pLVKeyDow 
=  reinterpret_cast < LPNMLVKEYDOWN > (pNMHDR);
 
//  TODO: 在此添加控件通知处理程序代码
  if (pLVKeyDow -> wVKey  ==  VK_RETURN)  {
  POSITION pos 
=  m_list.GetFirstSelectedItemPosition();
  
if  (pos  !=  NULL)  {
   
// Execute the corresponding function
  }

 }

 
else   {
  
// 可以添加其他击键处理
 }

 
* pResult  =   0 ;
}


// BUG FIX
BOOL CMyFormView::PreTranslateMessage(MSG *  pMsg)
{
 
//  TODO: 在此添加专用代码和/或调用基类
  if  (pMsg -> message  ==  WM_KEYDOWN  &&
         pMsg
-> wParam  ==  VK_RETURN  ||  pMsg -> wParam  ==  VK_ESCAPE)  {
    m_list.SendMessage(WM_KEYDOWN, pMsg
-> wParam, pMsg -> lParam);
    
return  TRUE;
   }

      
//  CXxxx can be a CFormView, Cdialog, or CPropertyPage class.

 
return  CFormView::PreTranslateMessage(pMsg);
}


你可能感兴趣的:(竟然撞到了微软的BUG——使用ListCtrl响应ENTER击键)