文章目錄
- CListCtrl
- 常見問題
- 增強版CGridCtrl(第三方)
- 第三方庫
- ReoGrid
CListCtrl
默認情況下,CListCtrl
不支持直接編輯單元格,需通過消息處理實現。
1.添加控件到資源視圖
在對話框資源編輯器中拖入List Control
控件,設置ID(如IDC_LIST
),樣式選擇Report
。
2.綁定控件
CListCtrl m_listCtrl;
DDX_Control(pDX, IDC_LIST, m_listCtrl);
3.初始化表格樣式與列頭
在對話框的OnInitDialog()
中初始化控件(8行2列):
//啟用整行選擇和網格線
m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//添加列
m_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);
m_listCtrl.InsertColumn(1, _T("年齡"), LVCFMT_CENTER, 50);
//插入行數據
for (int i = 0; i < 8; i++)
{m_listCtrl.InsertItem(i, _T("張三"));m_listCtrl.SetItemText(i, 1, _T("18"));
}
PS:默認在控件區域內填滿行,行數、行高均無法直接控制。
4.控制行數:插入透明圖片占位
CRect rcListCtrl(0,0,0,0);
m_listCtrl.GetClientRect(&rcListCtrl);
CImageList m_ImageList;
m_ImageList.Create(1, rcListCtrl.Height() / 8 - 1, ILC_COLOR32, 1, 0); // 創建透明圖標(高度=總高/8)
m_listCtrl.SetImageList(&m_ImageList, LVSIL_SMALL); // 關聯圖像列表for (int i = 0; i < BP_COUNT; i++)
{m_listCtrl.InsertItem(i, _T("張三"));m_listCtrl.SetItem(i, 0, LVIF_IMAGE, NULL, 0, 0, 0, 0);m_listCtrl.SetItemText(i, 1, _T("18"));
}
3.實現編輯功能
CEdit m_edit; //編輯框控件
int m_nEditRow; //當前編輯行
int m_nEditCol; //當前編輯行//消息映射
ON_NOTIFY(NM_CLICK, IDC_LIST, &XXX::OnClickList)
ON_EN_KILLFOCUS(IDC_EDIT, &XXX::OnKillFocusEdit)//單元格點擊事件
void XXX::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);m_nEditRow = pNMItemActivate->iItem;m_nEditCol = pNMItemActivate->iSubItem;// 僅允許編輯第2、3列if (m_nEditRow >= 0 && (m_nEditCol == 1 || m_nEditCol == 2)) {CRect rectCell;m_listCtrl.GetSubItemRect(m_nEditRow, m_nEditCol, LVIR_BOUNDS, rectCell);m_listCtrl.ClientToScreen(&rectCell);ScreenToClient(&rectCell); //控件坐標-> 屏幕坐標-> 父窗體坐標//修改編輯框位置rectCell.DeflateRect(2, 2);m_edit.MoveWindow(rectCell);m_edit.SetWindowText(m_listCtrl.GetItemText(m_nEditRow, m_nEditCol));m_edit.ShowWindow(SW_SHOW);m_edit.SetFocus();m_edit.SetSel(0, -1);}*pResult = 0;
}//保存數據
void XXX::OnKillFocusEdit()
{if (m_nEditRow >= 0 && m_nEditCol >= 0) {CString strText;m_edit.GetWindowText(strText);m_listCtrl.SetItemText(m_nEditRow, m_nEditCol, strText); // 更新列表內容}m_edit.ShowWindow(SW_HIDE);m_nEditRow = -1;m_nEditCol = -1;
}
常見問題
1.焦點管理
編輯控件需正確處理焦點丟失事件,避免內存泄漏(如動態創建的CEdit
需在EN_KILLFOCUS
中銷毀)。
2.性能優化
大數據量時啟用虛擬模式(LVS_OWNERDATA
),按需加載數據。
4.數據驗證
在LVN_ENDLABELEDIT
消息中校驗輸入格式(如數字、日期)。
增強版CGridCtrl(第三方)
支持直接編輯。內置支持文本框、下拉框、日期選擇器等編輯器,無需手動處理消息。
1.集成控件到項目
下載CGridCtrl
源碼,將頭文件和實現文件加入項目。
2.在對話框中添加控件
// .h
CGridCtrl m_grid;// .cpp
m_grid.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(10,10,400,200), this, IDC_GRID);
m_grid.SetRowCount(10); // 設置行數
m_grid.SetColumnCount(3); // 設置列數
m_grid.SetItemText(0, 0, _T("數據")); // 填充單元格
第三方庫
ReoGrid
適用于需要Excel級功能的場景。支持公式計算、樣式定制等高級功能。