c#是否有更好的方法使用WinAPI消息来隐藏水平滚动条
本文关键字:消息 WinAPI 隐藏 滚动条 水平 是否 更好 方法 | 更新日期: 2023-09-27 18:12:30
我有一个显示自定义控件的类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
?
我已经通过窗口滚动条参考和没有消息似乎适用于此,他们都必须与控制滚动条后,它被绘制/添加到控件/表单。
执行代码隐藏水平滚动条以响应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