List Control控件中及时捕获checkbox被选中的消息的解决方案

转自:http://blog.csdn.net/vycode/article/details/7345073

我的功能需求是:用户可以在List Control里添加item,当无选项被选中(即Checkbox没被选中),删除按钮不可用;当用户点击checkbox选中item时,删除按钮可用。

图示如下:

List Control控件中及时捕获checkbox被选中的消息的解决方案

图一 模拟图

运行后如下:

List Control控件中及时捕获checkbox被选中的消息的解决方案

图二 无选项被选中

List Control控件中及时捕获checkbox被选中的消息的解决方案

图三 有选项被选中

好了,废话不多说,直接上代码:

响应LVN_ITEMCHANGED消息函数:

 1 void CLicenseGenDlg::OnLvnItemchangedListResource(NMHDR *pNMHDR, LRESULT *pResult)  
 2 {  
 3     LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);  
 4     // TODO: Add your control notification handler code here  
 5     *pResult = 0;  
 6     int nItem,i;  
 7     nItem = m_list_resource.GetItemCount();  
 8   
 9     bool mark = false;  
10     for (i = 0; i < nItem && !mark; ++i)  
11     {  
12         if (m_list_resource.GetCheck(i))  
13         {  
14             mark= true;  
15         }     
16     }  
17     if (mark)  
18     {  
19         GetDlgItem(IDC_BTN_DELITEM)->EnableWindow(TRUE);//有list选项选中后使删除按钮可用  
20     }  
21     else  
22     {  
23         GetDlgItem(IDC_BTN_DELITEM)->EnableWindow(FALSE);//无lisr选项选中使删除按钮变灰  
24     }  
25 }  

不过在解决上述问题之前,我尝试了另外一个消息函数NM_CLICK,虽然能达到获知list改变消息,但不能及时捕获checkbox状态,总是慢了一个鼠标点击动作时间段。
附录:

LVN_BEGINDRAG 鼠标左键正在被触发以便进行拖放操作(当鼠标左键开始拖拽列表视图控件中的项目时产生)

LVN_BEGINRDRAG 鼠标右键正在被触发以便进行拖放操作(当鼠标右键开始拖拽列表视图控件中的项目时产生)

LVN_BEGINLABELEDIT 开始编辑项的文本

LVN_COLUMNCLICK 单击列(当鼠标单击列表视图控件列标题时产生)

NM_CLICK 当鼠标单击列表视图控件时产生

LVN_COLUMNCLICK 单击列

LVN_DELETEALLITEMS 删除所有项

LVN_DELETEITEM 删除某个项

NM_DBLCLK 当鼠标双击列表视图控件时产生

LVN_ENDLABELEDIT 结束对项文本的编辑

LVN_GETDISPINFO 请求需要显示的信息

LVN_GETINFOTIP 请求显示在工具提示窗口内的附加的文本信息

LVN_HOTTRACK 鼠标滑过某个项

LVN_INSERTITEM 当向列表视图控件插入项目时产生

lVN_ITEMACTIVATE 激活某个项

LVN_ITEMCHANGED 某个项已经发生变化

LVN_ITEMCHANGING 某个项目正在发生变化

NM_KILLFOCUS 当视表列图控件失去焦点时产生

LVN_KEYDOWN 某个键被按下

LVN_MARQUEEBEGIN 开始某个边框选择

NM_OUTOFMEMORY 当内存溢出时产生

LVN_ODCACHEHINT 虚拟列表控件的显示区域的内容发生了变化

LVN_ODSTATECHANGED 虚拟列表的控件的某个项或某个范围内的项已经发生变化

LVN_ODFINDITEM 需要拥有者查找一个特定的回调项

NM_RCLICK 当鼠标右键单击列表视图控件时产生

NM_RDBLCLK 当鼠标右键双击列表视图控件时产生

NM_SETFOCUS 当列表视图控件获得焦点时产生

LVN_SETDISPINFO 父窗口必须更新控件为项所维护的信息

注解:

HDN:Header Notify
LVN:ListView control Notify 
NM:Notify Message
TVN:TreeView control Notify