如何在ListControl MFC中拥有多行项目?

时间:2015-06-10 13:39:50

标签: c++ visual-studio mfc listcontrol

我在Visual Studio 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");

如何为全名,职业,运动和爱好提供多行项目?

1 个答案:

答案 0 :(得分:2)

令人惊讶的是,使用默认的CListCtrl是不可能的。但是,通过一些自定义编码(以及一些技巧),您可以获得所需的效果。

首先,您需要从CListCtrl派生自己的类,并为控件样式设置所有者绘制位( Owner Draw Fixed = 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
    }

在我的例子中,这导致......

enter image description here

它可能不是一个优雅的解决方案,但是,它的工作原理。注意:使用这种方法,每一行都具有相同的高度。

编辑:有几种方法可以获取行文字。最简单的方法是使用GetItemText,如下所示:

CString txt = GetItemText(lpDrawItemStruct->itemID, 0);
pDC->DrawText(txt, &lpDrawItemStruct->rcItem, DT_TOP);

以上假设您使用其中一种CListCtrl方法设置每行的文本来设置文本。