CListCtrl的几个高难度问题,onclick 执行2次和checkbox状态检查是反的

Kaile 2005-09-12 04:48:00
我的一个类继承于CListCtrl,第一列是checkbox, 用ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
来捕获click事件,现在遇到几个难题:
1 在onclick里不知道如何得到用户点击的是哪一行?
2 在onclick里checkbox状态没有更新,比如没选中时点一下,检查到并不是已经选中?是不是onclick里还没有更新checkbox状态?
3 onclick点一次执行2次

请高手指教,在线等,立即结。
...全文
311 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzd 2005-10-20
  • 打赏
  • 举报
回复
此问题我也遇到过,经分析是这样的:
onclick事件处理函数写到派生类里,当click事件发生时,派生类会执行一次,而此时该派生类实例存在于一个容器中,该容器还要再转发一次click事件,所以会执行两次

解决办法:改写或重载容器类的OnNotify,以下是代码,过滤的是COLUMNCLICK事件

BOOL CXXXXXX::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
CWnd *wndParent = this->GetParent();

if(wndParent)
{
if(lParam)
{
if( ((NMHDR *) lParam)->code != LVN_COLUMNCLICK )
{
*pResult = wndParent->SendMessage(WM_NOTIFY,wParam,lParam);
}
}
}

return CXXXXXX::OnNotify(wParam, lParam, pResult);
}
Kaile 2005-09-14
  • 打赏
  • 举报
回复
帮顶有分,顶到解决为止。
2025‘someday 2005-09-13
  • 打赏
  • 举报
回复
顶啊,!
Kaile 2005-09-13
  • 打赏
  • 举报
回复
100分送不出去,急
Kaile 2005-09-13
  • 打赏
  • 举报
回复
那如何解决onclick的问题了?
teli_eurydice 2005-09-13
  • 打赏
  • 举报
回复
up
vcmute 2005-09-13
  • 打赏
  • 举报
回复
onitemchanged点一次执行二次 很正常 onclick就不清楚了
kenskens 2005-09-13
  • 打赏
  • 举报
回复
这有什么好奇怪的,如果你先在ListCtrl里选中一项,再单击选中另一项时,OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)还会执行三次呢!

但只有当pNMListView->uNewState值为3时,pNMListView->iItem才是当前新的选中项。

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int row = pNMListView->iItem;

if(pNMListView->iItem != -1 && pNMListView->uNewState == 3)
{
// pNMListView->iItem为新选中项的索引值
}
Kaile 2005-09-12
  • 打赏
  • 举报
回复
我曾经遇到过这种情况,后来改用响应鼠标UP事件解决的。

怎么解决的,请赐教。
Kaile 2005-09-12
  • 打赏
  • 举报
回复
第2个问题也解决了,查了老贴:


void CEditList::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

if (pNMListView->uOldState == 0 && pNMListView->uNewState == 0)
return; // No change

// Old check box state
BOOL bPrevState = (BOOL)(((pNMListView->uOldState & LVIS_STATEIMAGEMASK)>>12)-1);
if (bPrevState < 0) // On startup there's no previous state
bPrevState = 0; // so assign as false (unchecked)

// New check box state
BOOL bChecked = (BOOL)(((pNMListView->uNewState & LVIS_STATEIMAGEMASK)>>12)-1);
if (bChecked < 0) // On non-checkbox notifications assume false
bChecked = 0;

if (bPrevState == bChecked) // No change in check box
return;
else
{
CMainFrame* pMainFrame=(CMainFrame*)::AfxGetMainWnd();
CUIView *pView = (CUIView*) (pMainFrame->m_wndSplitter.GetPane(0,1));
if(bChecked)
{
// 这里加入后台思考
}
else
{
//这里停止后台思考
}
}

*pResult = 0;
return ;

}

现在就差第3个问题,为什么onclick和onitemchanged点一次执行二次。
zxyjyzxyjy 2005-09-12
  • 打赏
  • 举报
回复
我曾经遇到过这种情况,后来改用响应鼠标UP事件解决的。
Kaile 2005-09-12
  • 打赏
  • 举报
回复
To: vcmuete:

OnItemChanged中判断uNewState & LVIS_STATEIMAGEMASK

判断uNewState & LVIS_STATEIMAGEMASK
这句话我不懂啊。
另外我是动态创建的,消息函数要自己写的。
Kaile 2005-09-12
  • 打赏
  • 举报
回复
谢谢,第一个问题我查了老贴,解决了。
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int row = pNMListView->iItem;



3 onclick点一次执行2次
怎么会呢?是否是你的程序再次激发了该事件?

我这个Clistctrl是加在一个ccontrolbar里,作为这个controlbar 的一个tab,不过这个controlbar没写onclick事件啊,不解。


快乐鹦鹉 2005-09-12
  • 打赏
  • 举报
回复
为何没有用classwizard生成的OnClick事件呢?这个事件的参数pNMHDR中,会得到当前选中行的信息
vcmute 2005-09-12
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=210183

LVS_EX_CHECKBOXES属性的CListCtrl怎样获得复选框选中的动作。
快乐鹦鹉 2005-09-12
  • 打赏
  • 举报
回复
1 在onclick里不知道如何得到用户点击的是哪一行?
用HitTest函数检查点击选中的行。鼠标位置用GetCursorPos,然后ScreenToClient进行转换。
2 在onclick里checkbox状态没有更新,比如没选中时点一下,检查到并不是已经选中?是不是onclick里还没有更新checkbox状态?
应该是还没有更新吧。如果你实际的效果就是这样。
3 onclick点一次执行2次
怎么会呢?是否是你的程序再次激发了该事件?

16,551

社区成员

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

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

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