简体   繁体   English

如何在ListControl MFC中使用多行项目?

[英]How can I have a multi-line item in a ListControl MFC?

I have an MFC List Control in Visual Studio 2013 (C++) with a List of items (Report view) 我在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");

How can I have multiline items for Full Name, Profession, Sport and Hobby? 如何获得全名,专业,运动和爱好多行项目?

Surprisingly, this is not possible with the default CListCtrl. 令人惊讶的是,使用默认的CListCtrl是不可能的。 But, with a little custom coding (and some trickery), you can get the effect you want. 但是,只需进行一些自定义编码(和一些技巧),就可以得到想要的效果。

First, you'll need to derive your own class from CListCtrl and set the owner draw bit ( Owner Draw Fixed = true ) for the control style. 首先,您需要从CListCtrl派生您自己的类,并为控件样式设置所有者绘制位( Owner Draw Fixed = true )。 In your parent dialog class, create an image list (here's the trickery). 在您的父对话框类中,创建一个图像列表(这是窍门)。 The image list will be used to specify the height of each row of the list control. 图像列表将用于指定列表控件每一行的高度。 In my example below, I used: 在下面的示例中,我使用了:

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

You'll need to play around with the cx and cy values for the image list to fit your needs. 您需要使用图像列表的cxcy值来满足您的需求。 Your control will use the image list to size each row because it's anticipating displaying icons. 您的控件将使用图像列表来调整每行的大小,因为它预期显示图标。 Next, add a handler for DrawItem like this: 接下来,为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
    }

In my example, this results in… 在我的示例中,这导致…

在此处输入图片说明

It may not be an elegant solution, but, it works. 它可能不是一个很好的解决方案,但是它可以工作。 Note: With this approach, every row will have the same height. 注意:使用这种方法,每一行将具有相同的高度。

EDIT : There are a few ways to obtain the row text. 编辑 :有几种获取行文本的方法。 The easiest would be to use GetItemText like so: 最简单的方法是像这样使用GetItemText:

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

The above assumes you set the text for each row using one of the CListCtrl methods to set text. 上面假设您使用CListCtrl方法之一设置每一行的文本。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM