我想在用户选择CListCtrl中的行时执行一些代码(报表视图,我不关心其他查看模式).
我如何抓住这个活动?是否有一些我可以映射的消息或像"OnSelectionChanged"这样的方法?
ClistCtrl在报表视图中设置为单选和单列,没有标题.
我试过了SetItemState(0,LVIS_SELECTED,LVIF_STATE),
SetSelectionMark(int index)但这些都行不通.
如何CListCtrl自动调整列宽?通常,当列表中的项目太长时,后端会从视图中消失,并且用户手动必须调整相应列的宽度.有没有办法通过代码来做到这一点?
我有一个CListCtrl(报告样式),我清除列表并在特定时间重新填充它.这样做时我想保持垂直滚动位置.我看到有几种方法看起来很有希望:
EnsureVisible()
GetScrollPos()
SetScrollPos()
GetScrollInfo()
GetTopIndex()
Scroll()
Run Code Online (Sandbox Code Playgroud)
我正在尝试GetScrollPos()然后尝试SetScrollPos()但它似乎没有工作.保存滚动位置然后恢复它的简单正确方法是什么?
UPDATE
实际上我似乎可以保存滚动位置GetScrollPos()然后SetScrollPos()来恢复它,但它实际上似乎只是设置滚动条位置,并没有实际滚动我的CListCtrl的项目.
更新2
Scroll()方法似乎正确滚动滚动条和内容.然而,它需要一个CSize对象作为它的参数.所以问题是如何在CSize和GetTopIndex或GetScrollInfo/Pos的输出之间进行转换.
在我的应用程序中,我有一些CListCtrl表.我用带有for循环的数组填充/刷新它们.在循环内部,我必须对如何显示值进行一些调整,这样就无法以任何方式进行数据绑定.
真正的问题是填充表所需的时间,因为它是逐行重绘的.如果我在控件填充时将其置于不可见状态,并在循环完成后再次使其可见,则整个方法要快得多!
现在我正在寻找一种方法来阻止控件重新绘制,直到完全填满.或任何其他方式来加快速度.
使用MFC和Visual Studio 2010 C++.我需要一种方法来使某些CListCtrl的各行突出(但我不想使用内置的选择功能来突出显示行).它可能是行背景的颜色,或字体粗细,甚至可能是图像(如果是高性能).
理想情况下,我想知道如何使用库存清单控件执行此操作.但是,如果无法做到这一点,请告诉我使用第三方代码的方法.
UPDATE
这是我最终使用的代码:
void MyList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* cd = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
*pResult = CDRF_DODEFAULT;
switch( cd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
{
int rowNumber = cd->nmcd.dwItemSpec;
bool highlightRow = (bool)GetItemData(rowNumber);
if (highlightRow)
{
COLORREF backgroundColor;
backgroundColor = RGB(255, 0, 0);
cd->clrTextBk = backgroundColor;
}
}
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的例子中,我没有使用ItemData作为任何东西,因此我在其他地方用一个布尔值调用了SetItemData来指示是否应该突出显示该行.
我有一个所有者绘制的 MFC CListCtrl,我正在尝试将其转换为虚拟列表控件。我的列表中有 30-40,000 个项目,因此虚拟列表控件在速度改进方面完全满足了我的需要。问题是我的列表是所有者绘制的,并且我依靠当前在 SetItemData 中设置的值来正确绘制行。
对于虚拟列表控件,您无法调用 SetItemData。根据 MSDN 文档(https://msdn.microsoft.com/en-us/library/ye4z8x58.aspx),LVN_GETDISPINFO通知消息的处理程序应该询问主项目的 LVIF_PARAM,但事实并非如此。我仔细阅读了其他(非 stackoverflow)论坛,它们也有同样的问题,但似乎没有人知道答案。
触发LVN_GETDISPINFO消息中的LVIF_PARAM有什么技巧?
void CTablePage::OnLvnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
LV_ITEM* pItem = &(pDispInfo)->item;
int iItem = pItem->iItem;
if (pItem->mask & LVIF_TEXT)
{
// this gets hit
}
if (pItem->mask & LVIF_PARAM) {
// this never gets hit
}
}
Run Code Online (Sandbox Code Playgroud) 我在"列表"视图模式下有一个CListCtrl,我不能让它垂直滚动而不是水平滚动.
我在这里尝试过建议:CListCtrl中的垂直滚动条,但只有在使用图标视图模式时才有效.它在列表模式下不起作用.
那么,如何让我的CListCtrl在列表视图模式下垂直滚动?
我想将 CListCtrl 控件的任何单元格的字体更改为粗体。任何人都可以告诉如何为 CList Ctrl 执行此操作吗?
我已经为 CTreeCtrl 完成了此操作,如下所示
pTC->SetItemState(hItemCur, TVIS_BOLD, TVIS_BOLD);
Run Code Online (Sandbox Code Playgroud)
我们有类似的 CListCtrl 吗?
提前致谢。
我有自己的CListCtrl (MyList : public CListCtrl)选择,我想显示每列的选择,而不是整行。我更改了WM_LBUTTONDOWN消息并将WM_KEYDOWNMESSAGE当前列设置为m_iCurCol。然后我有 CMyList::OnNMCustomdraw:
void CMyList::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLVCUSTOMDRAW pLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
*pResult = 0;
int i = 0;
if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
*pResult = CDRF_NOTIFYITEMDRAW; // ask for subitem notifications.
else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
if (pLVCD->nmcd.uItemState & CDIS_SELECTED)
*pResult = CDRF_NOTIFYPOSTPAINT;
}
else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT)
{
LVITEM rItem;
int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec);
ZeroMemory(&rItem, sizeof(LVITEM));
rItem.mask = LVIF_IMAGE | LVIF_STATE;
rItem.iItem = nItem; …Run Code Online (Sandbox Code Playgroud) clistctrl ×10
mfc ×9
c++ ×4
visual-c++ ×3
scroll ×2
winapi ×2
custom-draw ×1
highlighting ×1
resize ×1
row ×1
selection ×1