我的一个类继承于CListCtrl,第一列是checkbox, 用ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
来捕获click事件,现在遇到几个难题:
1 在onclick里不知道如何得到用户点击的是哪一行?
2 在onclick里checkbox状态没有更新,比如没选中时点一下,检查到并不是已经选中?是不是onclick里还没有更新checkbox状态?
3 onclick点一次执行2次请高手指教,在线等,立即结。
来捕获click事件,现在遇到几个难题:
1 在onclick里不知道如何得到用户点击的是哪一行?
2 在onclick里checkbox状态没有更新,比如没选中时点一下,检查到并不是已经选中?是不是onclick里还没有更新checkbox状态?
3 onclick点一次执行2次请高手指教,在线等,立即结。
解决方案 »
- OpenGL纹理贴图
- windows桌面扩展监视器
- 关于钩子函数的一个问题
- vc遍历控件
- 怎样修改VC默认的帮助文件名?
- 内存中数据如何实现类似select的查询
- 一个我没有查到的问题!急,非常急,很非常急!!!!!!(在线等候)!!!!
- 如何用socket实现tcp/ip数据通讯 最好给出源程序!急!!!!帮帮忙明天就交了!!
- 求指导 网页游戏服务器技术VC)
- 紧急!帮我看看为什么第一步通过,第二步就不能通过呢?(注册表相关)附源代码。
- 这个贴包含另外一个贴的80分:CListCtrl的高难度问题,onclick 执行2次
- 如何把CString 对象转化为unsigned short str[6000]
用HitTest函数检查点击选中的行。鼠标位置用GetCursorPos,然后ScreenToClient进行转换。
2 在onclick里checkbox状态没有更新,比如没选中时点一下,检查到并不是已经选中?是不是onclick里还没有更新checkbox状态?
应该是还没有更新吧。如果你实际的效果就是这样。
3 onclick点一次执行2次
怎么会呢?是否是你的程序再次激发了该事件?
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int row = pNMListView->iItem;3 onclick点一次执行2次
怎么会呢?是否是你的程序再次激发了该事件?我这个Clistctrl是加在一个ccontrolbar里,作为这个controlbar 的一个tab,不过这个controlbar没写onclick事件啊,不解。
这句话我不懂啊。
另外我是动态创建的,消息函数要自己写的。
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点一次执行二次。
int row = pNMListView->iItem;if(pNMListView->iItem != -1 && pNMListView->uNewState == 3)
{
// pNMListView->iItem为新选中项的索引值
}
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);
}