Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在ListControl MFC中拥有多行项目?_C++_Visual Studio_Mfc_Listcontrol - Fatal编程技术网

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

C++ 如何在ListControl MFC中拥有多行项目?,c++,visual-studio,mfc,listcontrol,C++,Visual Studio,Mfc,Listcontrol,我在Visual Studio 2013(C++)中有一个MFC列表控件,其中包含一个项目列表(报表视图) 我怎样才能拥有全名、职业、运动和爱好的多行项目?令人惊讶的是,默认的CListCtrl不可能实现这一点。但是,通过一些定制编码(和一些技巧),您可以获得想要的效果 首先,您需要从CListCtrl派生自己的类,并为控件样式设置所有者绘制位(owner draw Fixed=true)。在父对话框类中,创建一个图像列表(这里是技巧)。图像列表将用于指定列表控件每行的高度。在下面的示例中,我使

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


我怎样才能拥有全名、职业、运动和爱好的多行项目?

令人惊讶的是,默认的CListCtrl不可能实现这一点。但是,通过一些定制编码(和一些技巧),您可以获得想要的效果

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

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方法设置每一行的文本。

非常感谢,但是您能告诉我如何在DrawItem()中嵌入项目文本和其他信息吗?目前,我调用
SetItemText(nItem,1,Actoss.str().c_str())现在,如何调用DrawItem()?e、 g.LPDRAWITEMSTRUCT的值应该是多少?@TOWI\u Parallelism DrawItem在需要呈现所有者绘制控件时被调用。你不能直接叫它。MFC将调用您的实现,让您有机会绘制控件的内容。将用用于绘制控件的信息填充。但是是否有任何方法可以在LPDRAWITEMSTRUCT中嵌入每个项所需的文本?在代码中,所有项目都将具有相同的txt。
CString txt = GetItemText(lpDrawItemStruct->itemID, 0);
pDC->DrawText(txt, &lpDrawItemStruct->rcItem, DT_TOP);