我怎么可以在一个列表控件MFC多项目?(How can I have a multi-line it

2019-10-23 08:30发布

我有一个MFC列表在Visual Studio 2013与项目列表控制(C ++)(报表视图)

   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");

我怎么能有姓名,专业,体育和业余爱好多项目?

Answer 1:

出人意料的是,这是不可能的默认CListCtrl的。 但是,有一点自定义编码(和一些挂羊头卖狗肉),你可以得到你想要的效果。

首先,你需要从CListCtrl的派生自己的类,并设置所有者绘制位( 所有者绘制固定=真 )的控制风格。 在你的父母对话框类,创建一个图像列表(这里是挂羊头卖狗肉)。 图像列表将用来指定列表控件中的每一行的高度。 在我下面的例子中,我使用:

m_imagelist.Create(48, 48, ILC_COLOR4, 10, 10);
m_listctrl.SetImageList(&m_imagelist, LVSIL_SMALL);

你需要玩的CXCY值图像列表,以满足您的需求。 因为它的预测显示图标你控制将使用图像列表大小每一行。 接下来,添加一个处理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的方法之一来设置文本每行文字。



文章来源: How can I have a multi-line item in a ListControl MFC?