C#是否有更好的方法使用WinAPI消息隐藏水平滚动条?

时间:2014-07-10 12:49:58

标签: c# winforms winapi

我有一个显示自定义控件的类IndicatorPanel : FlowLayoutPanel。调整此面板的大小时,它还会将其子控件宽度调整为与其宽度相同的大小。这样它就不需要显示水平滚动条。

我遇到的问题是没有AutoScroll = true我必须重新实现所有滚动功能,如果我想要一个垂直滚动条,但它使得横向永远不会出现。我决定采用另一种方式尝试在WndProc中不断隐藏水平滚动条,并使用自动滚动条作为垂直滚动条。

这是我的WndProc

const int WM_MOUSEWHEEL = 0x020A;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);

private enum ScrollBarDir { SB_HORZ = 0, SB_VERT = 1, SB_CTL = 2, SB_BOTH = 3 }
protected override void WndProc(ref Message m)
{
    // Continually suppress; AutoScroll wants to show a scroll bar
    ShowScrollBar(this.Handle, (int)ScrollBarDir.SB_HORZ, false);
    // No scrolling when that flag is set
    if (m.Msg == WM_MOUSEWHEEL && NoScrollFlag)
        return;
    // Pass everything else through
    base.WndProc(ref m);
}

正如您所看到的,这有点过分了。任何时候发生消息的第一件事就是我调用ShowScrollBar函数来抑制水平滚动条,这通常不会浪费周期。

是否有我可以捕获的Windows消息,以便我只在需要时调用ShowScrollBar

我查看了windows scroll bar reference并且没有任何消息似乎适用于此,它们都与控制滚动条在绘制/添加到控件/表单后有关。

0 个答案:

没有答案