重载ClistCtrl的OnItemChanged时碰到的问题
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




