如何在 MFC 中垂直同步两个列表控件

Posted

技术标签:

【中文标题】如何在 MFC 中垂直同步两个列表控件【英文标题】:How synchronize two list controls vertically in MFC 【发布时间】:2016-03-30 05:50:09 【问题描述】:

我有两个列表控件,它们都可以分别垂直滚动。

但是我想同步滚动也想隐藏列表控件 1 中的垂直滚动条。

另一方面,如果您垂直滚动列表 control-2,则列表 control-1 应自动向下滚动相同数量的项目,这样两个列表框上的选项应始终显示在同一行中.

如何在 MFC 中实现这一点?

【问题讨论】:

对于同步,您可以使用CListBox::SetTopIndexCListBox::SetTopIndex。将滚动条隐藏在具有比显示更多项目的列表框中是另一回事,我不确定这是否可能。您可以尝试所有者绘制列表控件,然后您可以完全控制列表控件 1 中显示的内容,但这需要一些工作。 更正:您可以通过将列表框的“垂直滚动条”属性设置为False来移除垂直滚动条。 @MichaelWalz 感谢您的回复。是否可以冻结(修复)列表控件的第一列?我的意思是与 Excel 中的冻结列相同。 不太清楚你所说的第一列是什么意思,我以为你有两个列表控件。也许你应该编辑你的问题,更清楚你到底想要什么。 对不起,我误读了您的问题,以为您在谈论列表框而不是列表控件。看看this SO question。 【参考方案1】:

我通过文档在两个列表视图之间建立连接,但最终结果是对从属列表控件的 Scroll 成员发出的命令。

所以在 master 中处理 ON_WM_VSCROLL(),我实际上有一个自定义通知,但您可能只想从 master 中的类似处快捷方式:

if( pS->nSBCode == SB_THUMBTRACK )
    GetDocument( )->SetSplitScrollPos( pS->nPos );

无论你如何工作到 'SetSplitScrollPos' 之类的东西,它都会在从属设备上结束:

void CLCtrl::ScrollToVPosition( long inPos )

    long scroll= ( inPos - curVScrollPos );
    Scroll( scroll << 20 );
    curVScrollPos= inPos;

“滚动”调用是 CListCtrl 成员,因此您可以:

mySlaveCtrl.Scroll( ... );

现在,我很抱歉,但我不记得为什么将 20 转换为 '

也就是说,您可以简单地处理主 ON_WM_VSCROLL 和:

if( pS->nSBCode == SB_THUMBTRACK )
    mySlaveCtrl.Scroll( ( ps->pos - curVScrollPos ) << 20 );

【讨论】:

非常感谢您的重播。我参考link

以上是关于如何在 MFC 中垂直同步两个列表控件的主要内容,如果未能解决你的问题,请参考以下文章

MFC中如何向列表控件中嵌入单选按钮radio控件

怎么读取列表控件中的数据

求教:关于MFC控件中的滚动条事件........

限制列表控件 MFC 中的条目数

mfc中如何读取combobox控件中的内容

如何将复选框控件添加到 mfc 中的列表控件子项