XP下的MFC ListView CheckBox
今日发现XP下的ListView 不太好使。当CheckBox被勾选后,CheckBox选中的行并不会高亮,也没有被设置选中的标记,遂手动实现:CheckBox被勾选后,该行高亮显示。主要是响应 LVN_ITEMCHANGED 消息,MFC下直接添加即可,win32下响应WM_NOTIFY消息即可。以下是代码:
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)pNMHDR;
// TODO: Add your control notification handler code here
/*
typedef struct tagNMLISTVIEW
{
NMHDR hdr;
int iItem;
int iSubItem;
UINT uNewState;
UINT uOldState;
UINT uChanged;
POINT ptAction;
LPARAM lParam;
} NMLISTVIEW, *LPNMLISTVIEW;
*/
if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */
)
{
TRACE("Item %d is checked\n", pNMLV->iItem);
}
else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */
)
{
TRACE("Item %d is unchecked\n", pNMLV->iItem);
}
else
{
TRACE("Item %d does't change the check-status\n", pNMLV->iItem);
}
*pResult = 0;
}
ListView选中行:
m_list.SetItemState(nIndex, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);
ListView取消选中:
m_list.SetItemState(nIndex, 0, LVIS_SELECTED);
代码整合源于: