国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

用C#和VB.NET實(shí)現(xiàn)VS.NET或Office XP風(fēng)格的菜單(二)

2024-07-10 13:00:26
字體:
供稿:網(wǎng)友
用c#和vb.net實(shí)現(xiàn)vs.net或office xp風(fēng)格的菜單

小氣的神 2001.08.18

2.“owner-drawn menus”技術(shù)

這個(gè)例子是vb.net語法的.我去掉了和menu無關(guān)的class,原因是錯(cuò)誤太多,你會(huì)遇到類庫和命名空間的移植性的問題:

最多的是beta1 system.winforms 和beta 2 的system.windows.froms的命名空間問題;

然后是beta1中的bitand 、bitor等等bitxxx的函數(shù)在beta2中已去掉了bit又和vb中一樣了(據(jù)說beta1的這項(xiàng)改動(dòng)遭到了總多vb fans的投訴,說不能把vb也c?;?,bit是什么東東),這樣你需要把這類函數(shù)改掉;

然后是nameobjectcollectionbase從原來的system.collections中刪除了,beta2放在system.collections.specialized 中,真的有些昏倒,開始我還以為beta2中刪除了這個(gè)類。

最后是一些overrides和 overloads的問題,具體的看vs.net或framework sdk beta 2編譯時(shí)的提示就可以了,這方面ms做得不錯(cuò),task list中告訴你具體得建議,照做就是了。

具體一點(diǎn)你可以在framework sdk beta 2安裝目錄的doc目錄中找到這兩個(gè)文件,這是從beta1移植到beta2上不錯(cuò)的指導(dǎo)文件:apichangesbeta1tobeta2.htm 和change list - beta1 to beta2.doc 特別是這個(gè)doc文件洋洋灑灑90多頁,但很有幫助。

希望你還能在排除所有的錯(cuò)誤之后保持清醒,找到最核心有用的代碼,來分析。主要是cactionmenu.vb,焦點(diǎn)在onmeasureitem和ondrawitem這兩個(gè)函數(shù)或說事件處理程序上。onmeasureitem主要是處理menuitem的itemheight和itemwidth的,從它傳的measureitemeventargs參數(shù)數(shù)就知道。ondrawitem主要是如何畫菜單的問題。關(guān)鍵字overrides表明我們要在子類中重新定義menuitem中的這兩個(gè)方法。



從56行到58行是onmeasureitem函數(shù):

protected overrides sub onmeasureitem(byval e as system.windows.forms.measureitemeventargs)

if me.action.caption = "-" then

e.itemheight = 5

else

e.itemheight = 20

end if

dim fs as fontstyle

if me.defaultitem = true then fs = fs or fontstyle.bold

dim fnt as new font("tahoma", 8, fs)

dim sf as sizef = e.graphics.measurestring(me.action.caption, fnt)

fnt.dispose()

e.itemwidth = cint(sf.width) + 20

end sub

measureitemeventargs提供4個(gè)屬性graphis、index、itemheight和itemwidth。me相當(dāng)于c?;騤ava的this關(guān)鍵字。fnt.dispose()中dispose是一個(gè)很有意思的函數(shù)調(diào)用,在以往的windows編程中象字體、畫筆等許多資源都希望快使用快釋放,這個(gè)語句是用來控制gc(garbage collection)的,意思是我已使用完了這個(gè)設(shè)備或資源,gc你可以收回了。



從70到146行是有關(guān)onitemdraw函數(shù)的:

protected overrides sub ondrawitem(byval e as system.windows.forms.drawitemeventargs)

' colors, fonts

dim clrbgicon, clrbgtext, clrtext as color, fs as fontstyle, fnt as font

dim b as solidbrush, p as pen

dim fenabled as boolean = not ctype(e.state and drawitemstate.disabled, boolean)

dim fselected as boolean = ctype(e.state and drawitemstate.selected, boolean)

dim fdefault as boolean = ctype(e.state and drawitemstate.default, boolean)

dim fbreak as boolean = (me.action.caption = "-")

if fenabled and fselected and not fbreak then

clrbgicon = color.silver

clrbgtext = color.white

clrtext = color.blue

fs = fs or fontstyle.underline

else

clrbgicon = color.gray

clrbgtext = color.silver

clrtext = color.black

end if

if not fenabled then

clrtext = color.white

end if

if fdefault then

fs = fs or fontstyle.bold

end if

fnt = new font("tahoma", 8, fs)

' total background (partly to remain for icon)

b = new solidbrush(clrbgicon)

e.graphics.fillregion(b, new [region](e.bounds))

b.dispose()

' icon?

if not me.action.actionlist is nothing then

dim il as imagelist = me.action.actionlist.imagelist

if not il is nothing then

dim index as integer = me.action.image

if index > -1 and index < il.images.count then

dim rect as rectangle = e.bounds

with rect

.x += 2

.y += 2

.width = 16

.height = 16

end with

e.graphics.drawimage(il.images.item(index), rect)

end if

end if

end if

' text background

dim rf as rectanglef

with rf

.x = 18

.y = e.bounds.y

.width = e.bounds.width - .x

.height = e.bounds.height

end with

b = new solidbrush(clrbgtext)

e.graphics.fillregion(b, new [region](rf))

b.dispose()

' text/line

rf.y += 3 : rf.height -= 3

if not fbreak then

b = new solidbrush(clrtext)

e.graphics.drawstring(me.action.caption, fnt, b, rf)

fnt.dispose()

b.dispose()

else

p = new pen(color.black)

rf.y -= 1

e.graphics.drawline(p, rf.x, rf.y, rf.right, rf.y)

p.dispose()

end if

' border

if fenabled and fselected and not fbreak then

p = new pen(color.black)

e.graphics.drawrectangle(p, e.bounds)

p.dispose()

end if

end sub



drawitemeventargs參數(shù)給了你和菜單相關(guān)的所有環(huán)境和信息,它包括6個(gè)屬性:bounds、font、forecolor、graphics、index、states。如果你以前用過windows下的gdi函數(shù),那一定很熟悉這些函數(shù),不是很復(fù)雜只需要你一點(diǎn)點(diǎn)算術(shù)知識(shí)和美術(shù)觀點(diǎn)就可以了,如果你是第一次那么在紙上畫幾個(gè)矩形塊就可以了理解和做的很好,比起以前tc下的菜單編程容易得多。主要是作者是如何把icon畫在菜單上的,然后是根據(jù)不同的states表現(xiàn)一下菜單的forecolor, bounds就是菜單項(xiàng)最前面的表示選中等等的小方塊。

好了第二部分涉及到了大部分技術(shù)細(xì)節(jié)了,這里你需要關(guān)注的是,如何畫出來,下一部分我們來看如何畫的好看些,象vs.net或office xp那樣子。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 木里| 治多县| 富宁县| 关岭| 绥江县| 九江县| 陇南市| 黄龙县| 湘阴县| 堆龙德庆县| 恭城| 普兰县| 那曲县| 轮台县| 洛南县| 罗山县| 颍上县| 乌拉特中旗| 特克斯县| 大姚县| 禹州市| 武平县| 堆龙德庆县| 桂阳县| SHOW| 尚义县| 揭阳市| 刚察县| 丰原市| 满洲里市| 夹江县| 冕宁县| 饶平县| 缙云县| 准格尔旗| 罗城| 深水埗区| 松溪县| 遂平县| 新营市| 新闻|