列表控件在資源上定義爲單選。帶複選框的CListCtrl問題
問題1
我想對我的CListCtrl
的第一列的標題的複選框。在OnInitDialog
我
m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
CString s;
s.LoadString(IDS_COLUMN1);
#ifndef HDS_CHECKBOXES
// Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h
#define HDS_CHECKBOXES 0x0400
#endif
CHeaderCtrl& header = *m_list.GetHeaderCtrl();
header.ModifyStyle(0, HDS_CHECKBOXES);
#ifndef HDF_CHECKBOX
// Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h
#define HDF_CHECKBOX 0x0040
#endif
LVCOLUMN lc = { 0 };
lc.mask = LVCF_FMT |LVCF_WIDTH |LVCF_TEXT | LVCF_SUBITEM;
lc.fmt |= HDF_CHECKBOX;
lc.cx = 96;
lc.pszText = (TCHAR*) (LPCTSTR)s;
m_list.InsertColumn(0, &lc);
如果我添加在擴展|LVS_EX_AUTOCHECKSELECT
,我絕對不希望因爲我渴望在檢查行動和選擇的動作將被用於不同的目的,只給出了標題的複選框。
問題2
我需要設置一個布爾值和標誌的東西作爲修飾,當用戶選中或取消選中的項目。但是我不希望在插入項目時發生此操作,例如在表單加載時填充列表,但是它會在沒有我的意圖的情況下觸發,因爲InsertItem
觸發OnItemChanged
上的「取消選中操作」。
它迫使我調理與m_is_inserting
會員標記每次插入:
m_is_inserting = true;
m_list.InsertItem(i, m_array[i]->GetName());
m_is_inserting = false;
,並在LVN_ITEMCHANGED
處理
void CMyDialog::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (pNMListView->uChanged & LVIF_STATE)
{
if (pNMListView->uNewState & LVIS_SELECTED)
OnSelect();
else
{
if (pNMListView->iItem != -1)
{
if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x1000)
{
if (!m_is_inserting)
{
m_array[pNMListView->iItem]->m_active = false;
SetModified();
}
}
else if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x2000)
{
if (!m_is_inserting)
{
m_array[pNMListView->iItem]->m_active = true;
SetModified();
}
}
}
}
}
*pResult = 0;
}
做出相應的反應是否有更好的方法來區分真實用戶檢查/取消選中InsertItem
副作用的操作?
問題3
是否有獲取支票/取消選中狀態更好的象徵性的約定?幻數0x1000
和0x2000
是相當無意義的!
在此先感謝。
相關(**問題2 **):http://stackoverflow.com/questions/28582698/differentiate-between-user-click-and-setchecked-in-clistctrl – sergiol