用于将 ProgressBar 或任何控件放入 StatusBar 的类






4.76/5 (26投票s)
如何在程序的 StatusBar 中简单地显示一个控件。
引言
在 VB.NET 中,不可能直接将 ProgressBar
或按钮放入 StatusBar
中。 C++ 或 VB 5 或 6.0 有可用的解决方案。 这是在 VB.NET 中实现此目的的一种方法。 这篇文章的先前版本,名为StatusProgressBar,只允许使用ProgressBar
。 这个新版本将该技术扩展到任何控件。
使用代码
首先,创建一个包含 StatusBar
和 ProgressBar
或任何类型的控件(经过按钮测试)的窗体,您将把它们放在任何地方。 您必须在 StatusBar
中创建至少一个 Panel
并使 Panel
可见 (.showpanels = True
)。 放入状态栏的控件将被称为“子控件”。
创建 StatusBarChild
的一个实例
sbcProgressBar = New StatusBarChild(ProgressBar1, StatusBar1, 1)
参数是 ProgressBar
(ProgressBar1
)、StatusBar
(StatusBar1
) 和状态面板的编号(左侧第一个为 0)。 一个可选参数是状态面板的边缘和 ProgressBar
之间的边距。 创建 StatusBarChild
时,ProgressBar
会被移动到 StatusBar
。 您可以用同样的方式把一个按钮放入 StatusBar
sbcButton= New StatusBarChild(Button1, StatusBar1, 1)
StatusBarChild
对象的属性是子控件(.ChildObject
),StatusBar
(.StatusBar
),面板编号(.Panel
)和边距(.Margin
)。 它唯一的方法是 .Resize
,您应该在父窗体大小调整时调用它。 有关详细信息,请参见演示。
工作原理
子控件被声明为一个对象
Public ChildControl As Control
首先更改子控件的父级
ChildControl.Parent = StatusBar
然后,必须在适当的面板中显示它。 由于没有属性来获取 Panel
的实际宽度,因此必须进行 API 调用。 SendMessage
返回一个 RECT
值,其中包含 Panel
的坐标。
Private Structure RECT
Friend Left As Int32
Friend Top As Int32
Friend Right As Int32
Friend Bottom As Int32
End Structure
Dim Rectangle As RECT
' Use the API to get the panel's display rectangle
SendMessage(StatusBar.Handle.ToInt32, SB_GETRECT, Panel, Rectangle)
' Resize
With ProgressBar
.Left = Rectangle.Left + Margin
.Top = Rectangle.Top + Margin
.Height = Rectangle.Bottom - Rectangle.Top - 2 * Margin
.Width = Rectangle.Right - Rectangle.Left - 2 * Margin
End With
只要它具有 .parent
属性,您就可以使用此技术将任何类型的控件放入 StatusBar
中。
演示在第一个面板中使用一个按钮,在第二个面板中使用一个 ProgressBar
。 单击该按钮以使进度条前进。
历史
- 1.1: 允许
Option Strict On
。 请参阅下面的第一个线程。 - 1.0:第一个公共版本。 不允许
Option Strict On
。