状态栏我不想详细解释。控件非常容易用。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事件相关的数据。详见下表:
backcolor |
获取所绘制的项的背景色。 |
---|---|
bounds |
获取表示所绘制项的边界的矩形。 |
font |
获取分配给所绘制项的字体。 |
forecolor |
获取所绘制项的前景色。 |
graphics |
获取要在其上绘制项的图形表面。 |
index |
获取所绘制项的索引值。 |
panel |
获取要绘制的statusbarpanel。 |
state |
获取所绘制项的状态。 |
如何让状态条右下角的三角消失呢?
将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属性设置最小宽度。