首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ListControl MFC中拥有多行项?

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

Stack Overflow用户
提问于 2015-06-10 13:39:49
回答 1查看 4.5K关注 0票数 1

我在Visual 2013 (C++)中有一个MFC列表控件,其中包含一个项列表(报表视图)

代码语言:javascript
复制
   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");

我怎么能有多行项目的全名,职业,体育和霍比?

EN

回答 1

Stack Overflow用户

发布于 2015-06-10 16:01:43

令人惊讶的是,这在默认的CListCtrl中是不可能的。但是,使用一些自定义编码(和一些技巧),您可以获得您想要的效果。

首先,您需要从CListCtrl派生出您自己的类,并为控件样式设置所有者绘图位(Owner = true)。在父对话框类中,创建一个图像列表(以下是技巧)。图像列表将用于指定列表控件的每一行的高度。在下面的示例中,我使用了:

代码语言:javascript
复制
m_imagelist.Create(48, 48, ILC_COLOR4, 10, 10);
m_listctrl.SetImageList(&m_imagelist, LVSIL_SMALL);

为了满足您的需要,您需要使用图像列表的、cx、cy值。您的控件将使用图像列表来调整每行的大小,因为它预期会显示图标。接下来,为DrawItem添加如下处理程序:

代码语言:javascript
复制
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:

代码语言:javascript
复制
CString txt = GetItemText(lpDrawItemStruct->itemID, 0);
pDC->DrawText(txt, &lpDrawItemStruct->rcItem, DT_TOP);

以上假设您使用CListCtrl方法之一设置每行的文本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30758085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档