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);
}
}
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);
}
}
Row = pNMListView->iItem;
这仅仅是把上面一条语句重新复制了一遍
这样if中的判断就不同了.........和uOldState配合使用,等一下试试看是不是虚函数我没注意...
第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;
......
}