C++ 如何在ListControl MFC中拥有多行项目?
我在Visual Studio 2013(C++)中有一个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)。在父对话框类中,创建一个图像列表(这里是技巧)。图像列表将用于指定列表控件每行的高度。在下面的示例中,我使
我怎样才能拥有全名、职业、运动和爱好的多行项目?令人惊讶的是,默认的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
}
在我的例子中,这会导致
这可能不是一个优雅的解决方案,但它是有效的。注意:使用这种方法,每行的高度都相同
编辑:有几种方法可以获取行文本。最简单的方法是使用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);