大家有没有发现ListCtrl的LVN_ITEMCHANGED时间为什么连续响应3次,是不是vc的bug,急!!!

thomas_xj 2005-07-12 11:43:09
大家有没有发现ListCtrl的LVN_ITEMCHANGED时间为什么连续响应3次,是不是vc的bug,急!!!


另外再问一下,listctrl换行用什么消息?我用NM_CLICK加上LVN_ITEMCHANGED是可以,但是LVN_ITEMCHANGED响应3次,如果是用鼠标单击换行共4次,请问怎么解决?
...全文
629 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodheartppl 2006-05-23
  • 打赏
  • 举报
回复
我试过了,肯定是你程序的问题

你可以发过来,我帮你调一下

也有可能在初始话的时候会触发一下 ITEMCHANGED
ksmgbits 2006-05-23
  • 打赏
  • 举报
回复
你把这句话加上绝对好使:if(pNMLV->pNMListView != 3)return;
axiaowin 2005-07-14
  • 打赏
  • 举报
回复
检查程序中有没有设置选中状态的 SetItemState(l_nIndex, 0, LVIS_SELECTED); 操作
thomas_xj 2005-07-12
  • 打赏
  • 举报
回复
ListCtrl失去焦点的时候,会发LVN_ITEMCHANGED,和你的AfxMessageBox有关

-----------------------------------------------
我想不是,因为我做了实验。
我用以下代码代替AfxMessageBox,如果m_ListCtrl.GetItemText(m_ListCtrl.GetSelectionMark(),1)本来是“ccc”
m_edit+=m_ListCtrl.GetItemText(m_ListCtrl.GetSelectionMark(),1);
UpdateData(FALSE);
运行结果m_edit是“ccccccccc”
goodboyws 2005-07-12
  • 打赏
  • 举报
回复
ListCtrl失去焦点的时候,会发LVN_ITEMCHANGED,和你的AfxMessageBox有关
vcmute 2005-07-12
  • 打赏
  • 举报
回复
选中也会设置State,触发LVN_ITEMCHANGED
thomas_xj 2005-07-12
  • 打赏
  • 举报
回复
还有一个问题,LVN_ITEMCHANGED好像只支持方向键换行,如果用鼠标点击换行,当前行为换行前的行,不只大家发现没有?
thomas_xj 2005-07-12
  • 打赏
  • 举报
回复
m_edit+=m_ListCtrl.GetItemText(m_ListCtrl.GetSelectionMark(),1);
UpdateData(FALSE);

通过实验,仍然运行了3次。
不知道是不是与安装了vc补丁有关。
oyljerry 2005-07-12
  • 打赏
  • 举报
回复
oid CXXXDlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
// TODO: Add your control notification handler code here
//假定CListCtrl控件变量为m_MyListCtrl
CString str;
str=m_MyListCtrl.GetItemText;//得到被选行的内容
m_editstr=str;//假定CEdit空间变量为m_editstr
UpdateData();

*pResult = 0;
}
thomas_xj 2005-07-12
  • 打赏
  • 举报
回复
我只映射了一个LVN_ITEMCHANGED消息

Xxxx.h

afx_msg void OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult);


xxx.cpp

ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnItemchangedList)

BOOL CTest15Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP|LVS_EX_GRIDLINES;
m_ListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(dwExStyle));



m_ListCtrl.InsertColumn(0,"ID",0,0);
m_ListCtrl.InsertColumn(1,"楼层",LVCFMT_CENTER,55);
m_ListCtrl.InsertColumn(2,"房号",0,55);
m_ListCtrl.InsertColumn(3,"位置",0,64);
m_ListCtrl.InsertColumn(4,"等级",LVCFMT_CENTER,70);
m_ListCtrl.InsertColumn(5,"电话",0,0);

m_ListCtrl.InsertItem(0,"111");
m_ListCtrl.SetItem(0,1,LVIF_TEXT|LVIF_STATE,"1111",0,0,0,NULL);
m_ListCtrl.SetItem(0,1+1,LVIF_TEXT|LVIF_STATE,"1111",0,0,0,NULL);
m_ListCtrl.SetItem(0,2+1,LVIF_TEXT|LVIF_STATE,"1111",0,0,0,NULL);
m_ListCtrl.SetItem(0,3+1,LVIF_TEXT|LVIF_STATE,"1111",0,0,0,NULL);
m_ListCtrl.SetItem(0,4+1,LVIF_TEXT|LVIF_STATE,"1111",0,0,0,NULL);

m_ListCtrl.InsertItem(1,"aaa");
m_ListCtrl.SetItem(1,1,LVIF_TEXT|LVIF_STATE,"aaaa",0,0,0,NULL);
m_ListCtrl.SetItem(1,1+1,LVIF_TEXT|LVIF_STATE,"aaaa",0,0,0,NULL);
m_ListCtrl.SetItem(1,2+1,LVIF_TEXT|LVIF_STATE,"aaaa",0,0,0,NULL);
m_ListCtrl.SetItem(1,3+1,LVIF_TEXT|LVIF_STATE,"aaaa",0,0,0,NULL);
m_ListCtrl.SetItem(1,4+1,LVIF_TEXT|LVIF_STATE,"aaaa",0,0,0,NULL);


m_ListCtrl.InsertItem(2,"aaa");
m_ListCtrl.SetItem(2,1,LVIF_TEXT|LVIF_STATE,"bbb",0,0,0,NULL);
m_ListCtrl.SetItem(2,1+1,LVIF_TEXT|LVIF_STATE,"bbbb",0,0,0,NULL);
m_ListCtrl.SetItem(2,2+1,LVIF_TEXT|LVIF_STATE,"bbbb",0,0,0,NULL);
m_ListCtrl.SetItem(2,3+1,LVIF_TEXT|LVIF_STATE,"bbbb",0,0,0,NULL);
m_ListCtrl.SetItem(2,4+1,LVIF_TEXT|LVIF_STATE,"bbbb",0,0,0,NULL);


m_ListCtrl.InsertItem(3,"ccc");
m_ListCtrl.SetItem(3,1,LVIF_TEXT|LVIF_STATE,"cccc",0,0,0,NULL);
m_ListCtrl.SetItem(3,1+1,LVIF_TEXT|LVIF_STATE,"cccc",0,0,0,NULL);
m_ListCtrl.SetItem(3,2+1,LVIF_TEXT|LVIF_STATE,"cccc",0,0,0,NULL);
m_ListCtrl.SetItem(3,3+1,LVIF_TEXT|LVIF_STATE,"cccc",0,0,0,NULL);
m_ListCtrl.SetItem(3,4+1,LVIF_TEXT|LVIF_STATE,"cccc",0,0,0,NULL);

m_ListCtrl.InsertItem(4,"ddd");
m_ListCtrl.SetItem(4,1,LVIF_TEXT|LVIF_STATE,"dddd",0,0,0,NULL);
m_ListCtrl.SetItem(4,1+1,LVIF_TEXT|LVIF_STATE,"dddd",0,0,0,NULL);
m_ListCtrl.SetItem(4,2+1,LVIF_TEXT|LVIF_STATE,"dddd",0,0,0,NULL);
m_ListCtrl.SetItem(4,3+1,LVIF_TEXT|LVIF_STATE,"dddd",0,0,0,NULL);
m_ListCtrl.SetItem(4,4+1,LVIF_TEXT|LVIF_STATE,"dddd",0,0,0,NULL);

return TRUE; // return TRUE unless you set the focus to a control
}


void CTest15Dlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
AfxMessageBox(m_ListCtrl.GetItemText(m_ListCtrl.GetSelectionMark(),1));
*pResult = 0;
}

我的代码就这么简单,不只问题出在哪里?
不信,大家也可以做以下试验
modena 2005-07-12
  • 打赏
  • 举报
回复
NM_CLICK包括鼠标点下操作和松开操作,每次引起NM_ITEMCHANGED
你点击新的行,旧行会被失去选择状态,也会引起NM_ITEMCHANGED
oyljerry 2005-07-12
  • 打赏
  • 举报
回复
检查一下代码
thomas_xj 2005-07-12
  • 打赏
  • 举报
回复
我专门作了实验,代码很简单,就是有问题

void CTest15Dlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
AfxMessageBox(m_ListCtrl.GetItemText(m_ListCtrl.GetSelectionMark(),1));
*pResult = 0;
}

goodboyws 2005-07-12
  • 打赏
  • 举报
回复
不会啊,是不是你代码的问题啊
thomas_xj 2005-07-12
  • 打赏
  • 举报
回复
up
thomas_xj 2005-07-12
  • 打赏
  • 举报
回复
to goodboyws(深夜不眠者)
你的方法能解决鼠标单击的问题,但LVN_ITEMCHANGED消息响应3次作何解呢?

用你的办法
结果是:
响应第一次,得到是换行前的数据
响应第二次,不能得到数据
响应第三次,得到是换行后的数据,即正确的数据
goodboyws 2005-07-12
  • 打赏
  • 举报
回复
GetSelectionMark的问题,这时候选中标记可能还没有置上
用pList->GetNextSelectedItem(pList->GetFirstSelectedItemPosition());

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧