我在Visual 2013 (C++)中有一个MFC列表控件,其中包含一个项列表(报表视图)
LVCOLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 120;
lvColumn.pszText = "Full Name";
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(0, &lvColumn);
lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 75;
lvColumn.pszText = "Profession";
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(1, &lvColumn);
lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 80;
lvColumn.pszText = "Fav Sport";
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(2, &lvColumn);
lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 75;
lvColumn.pszText = "Hobby";
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertColumn(3, &lvColumn);
LVITEM lvItem;
int nItem;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = "Sandra C. Anschwitz";
nItem = ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(&lvItem);
((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 1, "Singer");
((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 2, "HandBall");
((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(nItem, 3, "Beach");我怎么能有多行项目的全名,职业,体育和霍比?
发布于 2015-06-10 16:01:43
令人惊讶的是,这在默认的CListCtrl中是不可能的。但是,使用一些自定义编码(和一些技巧),您可以获得您想要的效果。
首先,您需要从CListCtrl派生出您自己的类,并为控件样式设置所有者绘图位(Owner = true)。在父对话框类中,创建一个图像列表(以下是技巧)。图像列表将用于指定列表控件的每一行的高度。在下面的示例中,我使用了:
m_imagelist.Create(48, 48, ILC_COLOR4, 10, 10);
m_listctrl.SetImageList(&m_imagelist, LVSIL_SMALL);为了满足您的需要,您需要使用图像列表的、cx、和cy值。您的控件将使用图像列表来调整每行的大小,因为它预期会显示图标。接下来,为DrawItem添加如下处理程序:
void MyClistCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CString text = _T("Now is the time \nfor all good men\nto come to the aid");
pDC->DrawText(text , &lpDrawItemStruct->rcItem, DT_TOP);
// TODO: Add your code to draw the specified item
}在我的示例中,这将导致…

这可能不是一个优雅的解决方案,但是,它是有效的。注意:使用这种方法,每一行都有相同的高度。
编辑:有几种方法可以获得行文本。最简单的方法是像这样使用GetItemText:
CString txt = GetItemText(lpDrawItemStruct->itemID, 0);
pDC->DrawText(txt, &lpDrawItemStruct->rcItem, DT_TOP);以上假设您使用CListCtrl方法之一设置每行的文本。
https://stackoverflow.com/questions/30758085
复制相似问题