该CReportCtrl来自codeproject上一位作者的作品,主要看中其中的checkbox效果,所以拿来使用进行显示,效果没那么炫,但足够我用的了。
在对其设置checkbox之后
m_listMenu.SetCheckboxeStyle(RC_CHKBOX_NORMAL); // Enable checkboxes
在点击时可以实现勾选的效果,但是,若是要拦截勾选动作在该动作进行其他操作时,如何进行拦截呢。
我也在网上找了好久,虽然没有特别关于该list的拦截说明,但是经过其他的内容,实验了出来一点效果,至于是不是真的
符合原始的想法,那还不得而知,当前水平有限,若有错误请指出来。
利用ON_NOTIFY来拦截NM_CLICK消息,
ON_NOTIFY(NM_CLICK,IDC_LIST_MENU,OnCheckBox)
在.h文件中定义
afx_msg void OnCheckBox(NMHDR * pNMHDR, LRESULT* pResult);
然后进行编写
void CMenuKeyView::OnCheckBox(NMHDR * pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
const int COL = pNMListView->iSubItem;
int nRow = pNMListView->iItem;
int nCnt = m_listMenu.GetItemCount();
int nState;
if (COL==0 )
{
if(nRow>0 && nRow<nCnt)
{
nState = m_listMenu.GetCheck(nRow);
nState = !nState;
SetMenuVal(nRow-1,nState);
}
}
}
根据命名可以看出来变量,一个是行,一个是列,还有一个是总行数。
而上面的命名,则是在调试时的变量值改变推测出来的,但是这个结构还有其他的变量,还不知道用途。
而在这个出来效果之前,我试着尝试了用cpoint点左边来定位当前位置进行判断的方法,但可惜不对,可能是我还缺少了什么地方的代码,若有人知道的话,不吝指点
// CPoint pt;
// GetCursorPos(&pt);
// m_listMenu.ScreenToClient(&pt);
// int item;
// UINT nFlag;
// item = m_listMenu.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED);
// m_listMenu.HitTest(pt,&nFlag);
这段代码的思路是不是正确的,我自己也不知道,因为没有得出想要的结果,所以暂时无从验证,若是后期有所得,在来修改下。
先记录下,若是在其他控件中也得对点击事件进行拦截,在继续记录吧