标签: clistctrl

如何检测CListCtrl选择更改?

我想在用户选择CListCtrl中的行时执行一些代码(报表视图,我不关心其他查看模式).

我如何抓住这个活动?是否有一些我可以映射的消息或像"OnSelectionChanged"这样的方法?

mfc clistctrl visual-c++

30
推荐指数
2
解决办法
3万
查看次数

如何在CListCtrl中将项目设置为选中?

ClistCtrl在报表视图中设置为单选和单列,没有标题.

我试过了SetItemState(0,LVIS_SELECTED,LVIF_STATE),
SetSelectionMark(int index)但这些都行不通.

c++ winapi clistctrl selection

12
推荐指数
3
解决办法
3万
查看次数

自动调整CListCtrl中的列宽

如何CListCtrl自动调整列宽?通常,当列表中的项目太长时,后端会从视图中消失,并且用户手动必须调整相应列的宽度.有没有办法通过代码来做到这一点?

mfc resize clistctrl

11
推荐指数
1
解决办法
1万
查看次数

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的输出之间进行转换.

mfc scroll clistctrl

10
推荐指数
1
解决办法
1万
查看次数

如何(快速)在C++(MFC)中填充CListCtrl?

在我的应用程序中,我有一些CListCtrl表.我用带有for循环的数组填充/刷新它们.在循环内部,我必须对如何显示值进行一些调整,这样就无法以任何方式进行数据绑定.

真正的问题是填充表所需的时间,因为它是逐行重绘的.如果我在控件填充时将其置于不可见状态,并在循环完成后再次使其可见,则整个方法要快得多!

现在我正在寻找一种方法来阻止控件重新绘制,直到完全填满.或任何其他方式来加快速度.

c++ mfc clistctrl

7
推荐指数
2
解决办法
5451
查看次数

MFC:如何更改ListCtrl的个别行的颜色/粗体?

使用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 row highlighting clistctrl visual-c++

6
推荐指数
1
解决办法
1万
查看次数

如何在 MFC 虚拟列表控件中设置 ItemData

我有一个所有者绘制的 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)

mfc clistctrl

6
推荐指数
1
解决办法
1792
查看次数

列表视图中的CListCtrl垂直滚动条

我在"列表"视图模式下有一个CListCtrl,我不能让它垂直滚动而不是水平滚动.

我在这里尝试过建议:CListCtrl中的垂直滚动条,但只有在使用图标视图模式时才有效.它在列表模式下不起作用.

那么,如何让我的CListCtrl在列表视图模式下垂直滚动?

c++ mfc scroll clistctrl

5
推荐指数
1
解决办法
1974
查看次数

CListCtrl 设置字体样式为粗体

我想将 CListCtrl 控件的任何单元格的字体更改为粗体。任何人都可以告诉如何为 CList Ctrl 执行此操作吗?

我已经为 CTreeCtrl 完成了此操作,如下所示

pTC->SetItemState(hItemCur, TVIS_BOLD, TVIS_BOLD);
Run Code Online (Sandbox Code Playgroud)

我们有类似的 CListCtrl 吗?

提前致谢。

mfc clistctrl visual-studio visual-c++

5
推荐指数
1
解决办法
3899
查看次数

如何说服 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)

c++ winapi mfc custom-draw clistctrl

5
推荐指数
0
解决办法
292
查看次数