帮忙解决个问题 在对话框上放了一个CListCtrl控件,想用响应LVN_ITEMCHANGED来处理列表中选项的改变,不过每改变一次选项响应函数OnItemchangedXXX()总被执行3遍,为什么?如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 补充一下:这个对话框是mode对话框,CListCtrl类型为Report。 第一次:uNewState = 0 uOldState = 2 其他不变第二次:uOldState = 1; 其他不变第三次:item = 你选择的item iSubItem = 你选择的SubItem uNewState = 3 uOldState = 0why? 郁闷ing 三次消息触发分别为一次老的ITEM得到选择,二次老的ITEM被失去选择,三次改变后的新项目被选择。void CTestDialog::OnItemChangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; static BOOL bIgnoreNextChange=FALSE; // for debug only : Note, flags in CAPITALS if set! TRACE( "Item=%2d (Old=%s,%s,%s,%s) (New=%s,%s,%s,%s) (Change=%s,%s,%s,%s) ", pNMListView->iItem, (pNMListView->uOldState&LVIS_CUT)?"CUT":"cut", (pNMListView->uOldState&LVIS_DROPHILITED)?"DROP":"drop", (pNMListView->uOldState&LVIS_FOCUSED)?"FOCUS":"focus", (pNMListView->uOldState&LVIS_SELECTED)?"SELECT":"select", (pNMListView->uNewState&LVIS_CUT)?"CUT":"cut", (pNMListView->uNewState&LVIS_DROPHILITED)?"DROP":"drop", (pNMListView->uNewState&LVIS_FOCUSED)?"FOCUS":"focus", (pNMListView->uNewState&LVIS_SELECTED)?"SELECT":"select", (pNMListView->uChanged&LVIF_TEXT)?"TEXT":"text", (pNMListView->uChanged&LVIF_IMAGE)?"IMAGE":"image", (pNMListView->uChanged&LVIF_PARAM)?"PARAM":"param", (pNMListView->uChanged&LVIF_STATE)?"STATE":"state"); if (pNMListView->iItem >= 0) { if ((pNMListView->uOldState&LVIS_FOCUSED) && !(pNMListView->uNewState&LVIS_FOCUSED)) { bIgnoreNextChange = TRUE; } else if ((pNMListView->uNewState&LVIS_SELECTED) && !(pNMListView->uOldState&LVIS_SELECTED)) { // Got a new selection here ! RequeryList2(pNMListView->iItem); TRACE("SELECTED=%s",m_list1.GetItemText(pNMListView->iItem,0)); bIgnoreNextChange = FALSE; } else if ((pNMListView->uOldState&LVIS_SELECTED) && !(pNMListView->uNewState&LVIS_SELECTED)) { if (!bIgnoreNextChange) { // Got a "no selection" here ! RequeryList2(-1); TRACE("SELECTED=NONE"); } bIgnoreNextChange = FALSE; } } TRACE("\n"); *pResult = 0;}上面的代码可以看见触发的情况。 可以响应NM_CLICK事件并且判断ITEM是否改变过 我现在就是响应NM_CLICK事件那么做的,但是这样用上下箭头改变选项时会没有响应。 关于使用UpdateLayeredWindow窗口透明的问题 如何编程获取显示器/显卡的参数 在MFC中如何实现十进制数或字符转换为十六进制(unsigned char型)? CreateProcess函数的使用 关于wsprintf函数的问题 BeyondCompare的TXListBox控件怎么做的? 通报一下vc8的小BUG~~~~~ 谁有<<windows核心编程英文版>>的EBOOK? 为什么Unicode下字符串比较结果错误? 小问题,大家帮忙,谢先! 测试可用串口代码造成内存泄漏? 无窗口程序如何捕获鼠标消息(不用Hook)
uOldState = 2
其他不变
第二次:uOldState = 1;
其他不变
第三次:item = 你选择的item
iSubItem = 你选择的SubItem
uNewState = 3
uOldState = 0why? 郁闷ing
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
static BOOL bIgnoreNextChange=FALSE; // for debug only : Note, flags in CAPITALS if set!
TRACE(
"Item=%2d (Old=%s,%s,%s,%s) (New=%s,%s,%s,%s) (Change=%s,%s,%s,%s) ",
pNMListView->iItem,
(pNMListView->uOldState&LVIS_CUT)?"CUT":"cut",
(pNMListView->uOldState&LVIS_DROPHILITED)?"DROP":"drop",
(pNMListView->uOldState&LVIS_FOCUSED)?"FOCUS":"focus",
(pNMListView->uOldState&LVIS_SELECTED)?"SELECT":"select",
(pNMListView->uNewState&LVIS_CUT)?"CUT":"cut",
(pNMListView->uNewState&LVIS_DROPHILITED)?"DROP":"drop",
(pNMListView->uNewState&LVIS_FOCUSED)?"FOCUS":"focus",
(pNMListView->uNewState&LVIS_SELECTED)?"SELECT":"select",
(pNMListView->uChanged&LVIF_TEXT)?"TEXT":"text",
(pNMListView->uChanged&LVIF_IMAGE)?"IMAGE":"image",
(pNMListView->uChanged&LVIF_PARAM)?"PARAM":"param",
(pNMListView->uChanged&LVIF_STATE)?"STATE":"state"); if (pNMListView->iItem >= 0)
{
if ((pNMListView->uOldState&LVIS_FOCUSED) &&
!(pNMListView->uNewState&LVIS_FOCUSED))
{
bIgnoreNextChange = TRUE;
}
else if ((pNMListView->uNewState&LVIS_SELECTED) &&
!(pNMListView->uOldState&LVIS_SELECTED))
{
// Got a new selection here !
RequeryList2(pNMListView->iItem);
TRACE("SELECTED=%s",m_list1.GetItemText(pNMListView->iItem,0));
bIgnoreNextChange = FALSE;
}
else if ((pNMListView->uOldState&LVIS_SELECTED) &&
!(pNMListView->uNewState&LVIS_SELECTED))
{
if (!bIgnoreNextChange)
{
// Got a "no selection" here !
RequeryList2(-1);
TRACE("SELECTED=NONE");
}
bIgnoreNextChange = FALSE;
}
}
TRACE("\n");
*pResult = 0;
}
上面的代码可以看见触发的情况。