如何在 MFC 中垂直同步两个列表控件
Posted
技术标签:
【中文标题】如何在 MFC 中垂直同步两个列表控件【英文标题】:How synchronize two list controls vertically in MFC 【发布时间】:2016-03-30 05:50:09 【问题描述】:我有两个列表控件,它们都可以分别垂直滚动。
但是我想同步滚动也想隐藏列表控件 1 中的垂直滚动条。
另一方面,如果您垂直滚动列表 control-2,则列表 control-1 应自动向下滚动相同数量的项目,这样两个列表框上的选项应始终显示在同一行中.
如何在 MFC 中实现这一点?
【问题讨论】:
对于同步,您可以使用CListBox::SetTopIndex
和CListBox::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 中垂直同步两个列表控件的主要内容,如果未能解决你的问题,请参考以下文章