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);
}
}

解决方案 »

  1.   

    分析以下代码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;}
      

  2.   

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

  3.   

    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;
        ......
    }