随心所欲绘制状态栏 - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- 随心所欲绘制状态栏 (http://www.webasp.net/article/28/27709.htm) | ||||||||||||||||
| -- 作者:未知 -- 发布日期: 2006-07-18 | ||||||||||||||||
状态栏我不想详细解释。控件非常容易用。StatusBar和StatusBarPanel配合使用,非常简单。但是这样只是满足了基本的状态栏功能的需要,很多的时候我们可能还需要个性化的状态栏。我们需要随心所欲的绘制它。要做到这一点不难,StatusBarPanel类提供了Style属性,将其设置为StatusBarPanelStyle.OwnerDraw就可以自己编写代码绘制它了。StatusBar的DrawItem事件当所有者描述的状态栏控件的可视特征发生变化时,发生此事件。在这个事件里安置绘制StatusBarPanel的程序代码。 StatusBarPanelStyle枚举可以决定StatusBarPanel是由系统绘制还是由程序员亲自编写程序进行绘制。有两种选择Text和OwnerDraw。前者要求StatusBarPanel按照标准字体显示文本,后者允许程序员自己写代码绘制StatusBarPanel。默认情况下是Text。 以下代码片断自行绘制StatusBarPanel: 在一个窗体上添加一个状态栏,将其ShowPanels属性设置为true。然后,对其Panels属性进行设置。添加3个StatusBarPanel,其中第二个的Style属性设置为Text,其余两个的Style设置为OwnerDraw。 Private Sub StatusBar1_DrawItem(ByVal sender As Object, ByVal sbdevent As System.Windows.Forms.StatusBarDrawItemEventArgs) Handles StatusBar1.DrawItem Dim g As Graphics = sbdevent.Graphics Dim rf As New RectangleF(sbdevent.Bounds.X, sbdevent.Bounds.Y, _ sbdevent.Bounds.Width, sbdevent.Bounds.Height) If (sbdevent.Index = 0) Then g.FillRectangle(Brushes.Red, rf) Dim f As New Font("ËÎÌå", 10) Dim b As Brush = Brushes.Black g.DrawString(sbdevent.Panel.Text, f, b, rf) End If If (sbdevent.Index = 2) Then g.FillRectangle(Brushes.Red, rf) Dim f As New Font("ËÎÌå", 10) Dim b As Brush = Brushes.Black g.DrawString(sbdevent.Panel.Text, f, b, rf) End If End Sub 需要特别强调一下参数 System.Windows.Forms.StatusBarDrawItemEventArgs 。该类型的参数包含一个与DrawItem事件相关的数据。详见下表:
如何让状态条右下角的三角消失呢? 将statusBar.SizingGrip属性设置为false。 如何让状态栏不显示其StatusBarPanel? 把statusBar的ShowPanel属性设置为false。 怎样在程序运行过程中向状态条添加(删除)面板? 使用StatusBar的Panels属性。 Private Sub btnAddPanel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddPanel.Click Dim panel As New StatusBarPanel panel.Text = "动态添加的面板!" Me.StatusBar1.Panels.Add(panel) End Sub Private Sub btnDelPanel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelPanel.Click Dim str As String = "动态添加的面板!" Dim panel As StatusBarPanel For Each p As StatusBarPanel In Me.StatusBar1.Panels If (p.Text = str) Then panel = p End If Next If (Not (panel Is Nothing)) Then Me.StatusBar1.Panels.Remove(panel) End If End Sub 如何在状态条面板上显示图标? 使用StatusBarPanel.Icon属性。 如何自动分配状态条空间? 使用StatusBarPanel.AutoSize属性。该值指示是否自动调整状态栏面板的大小。该属性接受一个StatusBarPanelAutoSize枚举。默认值是StatusBarPanelAutoSize.None,这意味着不论状态条如何面板始终保持大小不变。除此之外还有两种选择,Contents和Springs。前者表示面板宽度取决于其内容,后者表示面板大小会被自动调整,至于调整之后合适与否,那我可就说不准了。如果AutoSize设置为Springs,还可以用MinWidth属性设置最小宽度。 | ||||||||||||||||
| webasp.net |