mfc-listCtrl

多功能控件

CGridListCtrlEx 非常好用的扩展库

可编辑

m_ctrl_list_geometric_coeff.SetExtendedStyle(m_ctrl_list_geometric_coeff.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);
{
CGridColumnTrait* pTrait = NULL;
CString colsName[] = {
L"编号",L"名字",L"描述",L"数值"
};
for (size_t i = 0; i < 4; ++i)
{
if (i > 0)
{
pTrait = new CGridColumnTraitEdit;
}
else
{
pTrait = new CGridColumnTrait;
}
m_ctrl_list_geometric_coeff.InsertColumnTrait(int(i + 1), colsName[i], LVCFMT_LEFT, 100, i, pTrait);
}
}

编辑完成事件

(msdn)[https://docs.microsoft.com/en-us/windows/win32/controls/lvn-itemchanged]

LVN_ITEMCHANGED

```

## 常用代码

```c++
m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS, CRect(0, 0, 0, 0), this, IDC_FRM_FILE_LIST);//|LVS_SINGLESEL
m_wndList.SetExtendedStyle(m_wndList.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);//LVS_EX_ONECLICKACTIVATE||LVS_EX_TRACKSELECT
//::SendMessageW(m_wndList.m_hWnd,LVM_SETHOVERTIME,0,1);

m_wndList.InsertColumn(0, TEXT("Name"), LVCFMT_LEFT, 400);
m_wndList.InsertColumn(1, TEXT("Ext"), LVCFMT_LEFT, 130);
m_wndList.InsertColumn(2, TEXT("Size"), LVCFMT_LEFT, 80);
m_wndList.InsertColumn(3, TEXT("Date"), LVCFMT_LEFT, 100);

m_wndList.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
if (m_wndList.GetColumnWidth(0) < 200)
{
m_wndList.SetColumnWidth(0, 200);
}
m_imageList.Create(16, 16, ILC_COLOR24, 7, 7);
m_wndList.SetImageList(&m_imageList, LVSIL_SMALL);


BOOL CDlgIconList::FillList(HWND hwnd)
{
// Clear the list before we start
// ListView_DeleteAllItems(hwnd);

CDevHelperApp* pwnd = (CDevHelperApp*)AfxGetApp();
ListView_SetImageList(hwnd, pwnd->m_hLarge, LVSIL_NORMAL);

// Get number of icons in system image list
count = ImageList_GetImageCount(pwnd->m_hLarge);

LVITEM lvitem;
TCHAR ach[20];
// add to list
for (int i = 0; i < 10; ++i)
{
wsprintf(ach, TEXT("%d"), i);
lvitem.mask = LVIF_TEXT;
lvitem.iItem = i;
lvitem.iSubItem = 0;
lvitem.pszText = ach;
ListView_InsertItem(m_wndView.m_hWnd, &lvitem);

m_wndView.SetItemText(i, 1, TEXT("1"));
m_wndView.SetItemText(i, 2, TEXT("2"));
}
return TRUE;
}

//从扩展名中获取图标信息
SHFILEINFO shfi;
memset(&shfi, 0, sizeof(shfi));
if (0 == SHGetFileInfo(TEXT("*.rxs"), FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
{
AfxMessageBox(TEXT("Failed"));
}
int idx = m_imageList.Add(shfi.hIcon);
if (0 == SHGetFileInfo(TEXT("*.doc"), FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
{
AfxMessageBox(TEXT("Failed"));
}
m_imageList.Add(shfi.hIcon);
m_wndList.InsertItem(1, TEXT("dd"), idx);
m_wndList.InsertItem(2, TEXT("test"), idx + 1);

InsertItem
Return Value
The index of the new item if successful or - 1 otherwise.
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
BOOL DeleteItem(int nItem);
Return Value
Nonzero if successful; otherwise zero.
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
插入项带图标
nt idx = m_imageList.Add(shfi.hIcon);
m_wndList.InsertItem(1, TEXT("dd"), idx);

双击事件

使用向导添加NM_DBLCLK即可

...
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CTradeQuery::OnNMDblclkList1)
END_MESSAGE_MAP()

afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);

void CTradeQuery::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here


*pResult = 0;
}

删除一行/多行

m_ctrl_list.DeleteItem(nItem);

// 多行删除
while (m_ctrl_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED) != -1)
{
int nItem = m_ctrl_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
m_ctrl_list.DeleteItem(nItem);
}

删除列

inline void CMRLGaugerProgramerDlg::deleteAllColumns()
{
int nColumnCount = m_list_data.GetHeaderCtrl()->GetItemCount();

// Delete all of the columns.
for (int i = 0; i < nColumnCount; i++)
{
m_list_data.DeleteColumn(0);
}
m_list_data.DeleteAllItems();
}

添加一行

++nItem;
int curItem = m_ctrl_list_geometric_coeff.InsertItem(nItem, utils::format(100, L"%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 1, utils::format(100, L"k%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 2, utils::format(100, L"Geom. Coeff.%d", nItem).c_str());
m_ctrl_list_geometric_coeff.SetItemText(curItem, 3, L"0.00");

遍历

//Get all selected item
POSITION pos = m_list.GetFirstSelectedItemPosition();
CString str;
DWORD dwID = 0;
if (pos == NULL)
{
AfxMessageBox(TEXT("No item selected"));
}
else
{
while (pos)
{
// if delete item need this
//pos = m_list.GetFirstSelectedItemPosition();
int nItem = m_list.GetNextSelectedItem(pos);
strTmp.Format(TEXT("item %s selected"), str);
dwID = m_wndList.GetItemData(nItem);
str = m_wndList.GetItemText(nItem, 0);
}
}

获取字段文字

CString str;
str = m_ctrl_list.GetItemText(pNMListView->iItem, 7);

获取列数量

m_ctrl_list_geometric_coeff.GetHeaderCtrl()->GetItemCount();

获取保存的 data

POSITION listPos = m_ctrl_list.GetFirstSelectedItemPosition();
if (listPos == NULL) return;
int itemData = m_ctrl_list.GetNextSelectedItem(listPos);

可编辑列表框

void CfireShanghaiYongTianEF_01ConfigDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
m_ctrl_list.OnListEdit();

*pResult = 0;
}


m_list_car.setControlId(IDC_LIST_CAR);
m_list_car.InsertColumn(0, TEXT("车牌号"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(1, TEXT("车牌类型"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(2, TEXT("车辆类型"), LVCFMT_LEFT, 130);
m_list_car.InsertColumn(3, TEXT("注册人"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(4, TEXT("联系手机"), LVCFMT_LEFT, 100);
m_list_car.InsertColumn(5, TEXT("备注"), LVCFMT_LEFT, 120);
m_list_car.SetExtendedStyle(m_list_car.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EX_SUBITEMIMAGES);