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

t1rydlwq  于 2022-11-17  发布在  C#
关注(0)|答案(1)|浏览(155)

我有一个显示自定义控件的类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,没有一条消息似乎适用于此,它们都与在滚动条被绘制/添加到控件/窗体后控制滚动条有关。

nnt7mjpx

nnt7mjpx1#

执行代码以隐藏水平滚动条,以响应 WM_NCCALCSIZE Windows消息
在必须计算窗口工作区的大小和位置时发送。通过处理此消息,应用程序可以在窗口的大小或位置更改时控制窗口工作区的内容。
https://learn.microsoft.com/en-us/windows/win32/winmsg/wm-nccalcsize

Const WM_NCCALCSIZE As Integer = &H83

    Protected Overrides Sub WndProc(ByRef m As Message)

        If m.Msg = WM_NCCALCSIZE Then
            ShowScrollBar(Me.Handle, CInt(ScrollBarDir.SB_HORZ), False)
        End If

        MyBase.WndProc(m)

    End Sub

相关问题