我试图创建一个动态面板,在其中我可以添加控件,并在控件超出面板高度时滚动,同时还隐藏滚动条。
我正在使用FlowLayoutPanel,并不断向其中添加自定义面板,将其Width
设置为父容器的Width
。
我还将其AutoScroll
属性设置为true
。
然而,还有一个问题。我如何隐藏该死的滚动条?两个都有。
我尝试了以下方法:
this.lobbiesPanel.AutoScroll = false;
this.lobbiesPanel.HorizontalScroll.Visible = false;
this.lobbiesPanel.VerticalScroll.Visible = false;
this.lobbiesPanel.AutoScroll = true;
令我失望的是,它并没有按预期的那样工作。滚动条仍然可见。我如何隐藏滚动条,同时仍然保持使用鼠标滚轮滚动的能力?
2条答案
按热度按时间xxls0lw81#
由于您只需要隐藏FlowLayoutPanel的ScrollBars,而不是用自己的控件替换ScrollBars,因此可以生成从FlowLayoutPanel派生的自定义控件。
自定义控件需要一些祖先控件不具备的功能:
要使其可选并接收鼠标输入,可以将以下内容添加到其构造函数:
要使其无论鼠标指针位于何处都能滚动,它需要预过滤WM_MOUSEWHEEL消息,可能还需要预过滤WM_LBUTTONDOWN消息。
您可以使用IMessageFilter接口在消息被调度和处理之前对消息进行预过滤(这可能很棘手,您不能太贪心,必须了解何时需要放弃或保留消息)。
当收到
WM_MOUSEWHEEL
消息并且它看起来定向到您的控件时,您可以将其发送到FlowLayoutPanel。现在,有黑客式的部分:ScrollableControl非常努力地显示它的Scrollbar,而您(有点)需要它们,因为该控件有一种非常奇怪的方法来计算它的
PreferredSize
(子控件占用的控件的总面积),它基于FlowDirection
而变化,而且没有真正的方法来管理标准的Scrollbar:要么扔掉要么藏起来。或者你用你自己设计的控件替换它们,但这完全是另一回事。
要隐藏滚动条,常用的方法是调用ShowScrollBar函数。
int wBar
参数指定要隐藏/显示的滚动条。bool bShow
参数指定是显示(true
)还是隐藏(false
)这些滚动条。ShowScrollBar
(您不能只调用此函数一次就忘记它)。下面是一个测试自定义控件,它实现了所有这些功能:
(it的工作代码,但不完全是 * 生产级 *:我想,您必须对它进行一些修改,使其在特定条件/用例中按照您的喜好运行)
它是这样工作的:
1szpjjfi2#
还有一种简单的方法。您可以添加一个Panel,并将FlowLayoutPanel放入Panel中。将FlowLayoutPanel的宽度设置为宽20px左右。现在FlowLayoutPanel的滚动条将不再可见。您可以使用下面的代码以编程方式处理它。