CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

重载ClistCtrl的OnItemChanged时碰到的问题

楼主icper()2005-08-02 11:40:04 在 VC/MFC / 界面 提问

CEditListCtrl是我从ClistCtrl继承的类  
   
  下面这段代码是我用于判断选择是否发生改变用的  
  m_CurRow   和   m_LastRow   是CEditListCtrl成员变量,记录上次和这次选择的行  
  debug编译的只用第二个if就可以了  
  而release编译的则需要用两个if,否则会有多次消息发送出来,导致界面连续刷新好几次  
  (程序根据选择自动更新数据)  
   
  我发现如果不判断的话肯定是3次消息,  
  做了判断的情况下,如果调用pNMListView->uNewState不为偶数次的话就不是固定3次  
  搞得我糊涂了  
   
   
  void   CEditListCtrl::OnItemChanged(NMHDR*   pNMHDR,   LRESULT*   pResult)    
  {  
  *pResult   =   0;  
  NM_LISTVIEW*   pNMListView   =   (NM_LISTVIEW*)pNMHDR;  
  //   TODO:   Add   your   control   notification   handler   code   here  
  int   Row   =   pNMListView->iItem;  
  int   Col   =   pNMListView->iSubItem;//该值似乎一直为0?????  
   
  //判断Row行是否被选中  
  if(!(pNMListView->uNewState   &   LVIS_SELECTED))  
  return;  
  if(((pNMListView->uNewState   &   (LVIS_FOCUSED|LVIS_SELECTED))   !=   0)   &&   (m_CurRow   !=   Row))  
  //if(m_CurRow   !=   Row)  
  {  
  m_LastRow   =   m_CurRow;  
  m_CurRow   =   Row;  
   
  SendMessage(LVN_ITEMCHANGED,(WPARAM)pNMHDR,(LPARAM)pResult);  
  }  
  } 问题点数:50、回复次数:4Top

1 楼newbiestar()回复于 2005-08-02 11:45:39 得分 10

重载?重载的谁给你调用?那个叫虚函数的重写……Top

2 楼lixiaosan(小三)回复于 2005-08-02 11:59:32 得分 40

分析以下代码  
   
  void   CTest6Dlg::OnItemchangedList1(NMHDR*   pNMHDR,   LRESULT*   pResult)    
   
  {  
   
  NM_LISTVIEW*   pNMListView   =   (NM_LISTVIEW*)pNMHDR;  
   
  //   TODO:   Add   your   control   notification   handler   code   here  
   
   
   
  CString   sTemp;  
   
   
   
  if((pNMListView->uOldState   &   LVIS_FOCUSED)   ==   LVIS_FOCUSED   &&  
   
  (pNMListView->uNewState   &   LVIS_FOCUSED)   ==   0)  
   
  {  
   
  sTemp.Format("%d   losted   focus",pNMListView->iItem);  
   
  }  
   
  else   if((pNMListView->uOldState   &   LVIS_FOCUSED)   ==   0   &&  
   
  (pNMListView->uNewState   &   LVIS_FOCUSED)   ==   LVIS_FOCUSED)  
   
  {  
   
  sTemp.Format("%d   got   focus",pNMListView->iItem);  
   
  }  
   
   
   
  if((pNMListView->uOldState   &   LVIS_SELECTED)   ==   LVIS_SELECTED   &&  
   
  (pNMListView->uNewState   &   LVIS_SELECTED)   ==   0)  
   
  {  
   
  sTemp.Format("%d   losted   selected",pNMListView->iItem);  
   
  }  
   
  else   if((pNMListView->uOldState   &   LVIS_SELECTED)   ==   0   &&  
   
  (pNMListView->uNewState   &   LVIS_SELECTED)   ==   LVIS_SELECTED)  
   
  {  
   
  //sTemp.Format("%d   got   selected",pNMListView->iItem);  
   
  CString   str;  
   
  str.Format("%d",   pNMListView->iItem);  
   
  AfxMessageBox(str);  
   
  }  
   
   
   
  *pResult   =   0;  
   
  }Top

3 楼icper()回复于 2005-08-03 12:07:06 得分 0

关键是如果在if之前再做一次操作如  
  Row   =   pNMListView->iItem;  
  这仅仅是把上面一条语句重新复制了一遍  
  这样if中的判断就不同了.........  
   
  和uOldState配合使用,等一下试试看  
   
  是不是虚函数我没注意...Top

4 楼asewq()回复于 2006-06-09 17:35:55 得分 0

listview中每改变一次选择,OnItemchanged函数执行了,三次,后来查证之后发现,state不光是选择的变化,还包括了焦点,还有其它的的变化  
  第1次是iOldItem从LVIS_SELECTED到0(取消选择)  
  第2次是iOldItem从LVIS_FOCUSED到0(取消焦点)  
  第3次是iNewItem从0到LVIS_SELECTED   |   LVIS_FOCUSED(获得选择,同时获得焦点)  
   
  只在获得选择的时候执行,就需要这样  
  if(   (pNMListView->uNewState   &   LVIS_SELECTED)   &&    
  !(pNMListview->uOldState   &   LVIS_SELECTED)   )  
  {  
          int   nNewItem   =   pNMListView->iItem;  
          ......  
  }  
  Top

相关问题

  • ClistCtrl重载问题
  • CListCtrl重载后的用法(急)
  • 请问如何重载CListView 里的 CListCtrl????
  • CListCtrl中重载了DrawItem之后,为什么LVS_EX_CHECKBOXES无效?
  • 请问:如果不重载CListCtrl类,能否让CListCtrl实现文件托拽?
  • 用重载的ClistCtrl类去替换CListView类中ClistCtrl类时总出错?
  • 重载()
  • 重载!
  • 我重载了CListCtrl,增加了一个CEDIT,debug下没问题,release下出错..........
  • 重载问题!

关键词

  • 选择
  • pnmlistview
  • lvis
  • unewstate
  • uoldstate
  • iitem
  • focused
  • currow
  • ceditlistctrl
  • stemp

得分解答快速导航

  • 帖主:icper
  • newbiestar
  • lixiaosan

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo