用C#和VB.NET實現VS.NET或Office XP風格的菜單(一)
2024-07-10 13:00:26
供稿:網友
用c#和vb.net實現vs.net或office xp風格的菜單
小氣的神 2001.08.18
vs.net或office xp中的菜單都是非常漂亮的,反正我很喜歡??上s.net沒有帶制作這種菜單的控件或組件,不知正式版本會不會提供一個模板和向導。至今還記得剛學計算機語言時自己用turbo c制作菜單的感受,那些矩形框函數和象素操作的確很迷人,況且那時是如此的流行菜單。
這篇文章中我會介紹有關在framework sdk beta 2 中制作自己風格的菜單,所以你最好已安裝了framework sdk beta 2,vs.net beta 2 不一定是必須的。附帶的zip包中的例子都是vs.net project的。
整個的文章包括三部分:
開始我會涉及到在winform中最基本的一些菜單的概念。
然后會有一個以前接觸過的有關菜單的例子,它是for beta 1的。老實說我沒有想到beta1 到beta2有許多函數和命名空間發生了變化,以前我在beta1中測試過這個例子,很順利。這次在beta2中會有許多錯誤,我提供了兩個project,一個是原來的project的,一個是我修改后for beta 2的。這種移植很枯燥,但可以很快熟悉新的beta2的類庫和函數,show出來的菜單還不錯,感覺是office2000風格的菜單。如果你有興趣可以試一試這個過程,會獲益非淺的,這個例子還包括按鈕的,原來的作者其實是在demo控件的“owner-drawn menus”技術;不過我只對菜單部分感興趣。
最后一部分是制作vs.net或xp風格的例子,上面那個例子的效果不能使我完全滿意,然后我重新寫了另外一個,不過我對最后的結果還不是很滿意,因為我的沒有上一個例子那么完整,例子中我只顯示了這個風格的菜單,對于事件響應、狀態欄更新、tooltips、菜單的狀態(enabled state)等處理都沒有考慮,我把這些歸結為時間問題,并承諾自己下次把它做得更好。
1.framework sdk beta 2中菜單分成兩類一類是普通的菜單叫:mainmenu,在vs.net的toolsbox中有這樣一個對應的菜單控件,拖下它到你的窗體中,設置一下屬性就可以所見所得了,這個版本的比vs.studio98 系列的要好用和漂亮的多。另一類叫:contextmenu菜單,也就是常用的彈出菜單。對于vb6來說所有的普通菜單在vs.net中是可以兼容和自動升級成mainmenu類型的菜單,但對于popmenu的菜單是不能轉換成contextmenu類型的菜單,你必須自己重新修改代碼實現。這里我們主要是針對mainmenu的,其實原理一樣。
最簡單的菜單你可以這樣做:
using system;
using system.windows.forms;
public class frmvb6 : form {
private mainmenu mumain ; // mainmenu
public static int main(string[] args) {
application.run(new frmvb6());
return 0;
}
public frmvb6() {
// the following code sets up the form properties.
this.text = "form1";
this.height = 213 + systeminformation.captionheight;
this.width = 312;
this.startposition = formstartposition.windowsdefaultlocation;
menuitem mitemfile = new menuitem() ;
mitemfile.text = "&file" ;
menuitem mitemexit = new menuitem() ;
mitemexit.text = "e&xit" ;
mumain = new mainmenu() ;
mumain.menuitems.add( mitemfile ) ;
mumain.menuitems.add( mitemexit) ;
this.menu = mumain ;
}
}
手工方式保存它為一個.cs文件然后在編譯它:
csc /t:winexe /r:system.dll /r:system.windows.forms.dll /r:system.drawing.dll form1menu.cs
vs.net下只用new一個新的winform項目,然后在默認窗體中放入mainmenu控件,然后設置完屬性,f5就可以了,完全不用一行代碼。
如果要生成一個主菜單和一個菜單的子菜單項目,主要是menuitems.addrange的方法,看下面的代碼:
this.mainmenu1 = new system.windows.forms.mainmenu();
this.menuitem1 = new system.windows.forms.menuitem();
this.menuitem2 = new system.windows.forms.menuitem();
this.menuitem3 = new system.windows.forms.menuitem();
this.menuitem4 = new system.windows.forms.menuitem();
// mainmenu1
this.mainmenu1.menuitems.addrange(new system.windows.forms.menuitem[] {
this.menuitem1, this.menuitem2});
// menuitem1
this.menuitem1.index = 0;
this.menuitem1.menuitems.addrange(new system.windows.forms.menuitem[] {
this.menuitem3, this.menuitem4});
this.menuitem1.index = 0 ;
this.menuitem1.text = "&file";
// menuitem2
this.menuitem2.index = 1;
this.menuitem2.text = "help";
// menuitem3
this.menuitem3.index = 0;
this.menuitem3.text = "open";
this.menuitem3.click += new system.eventhandler(this.menuitem3_click);
// menuitem4
this.menuitem4.index = 1;
this.menuitem4.text = "exit";
this.menuitem4.click += new system.eventhandler(this.menuitem4_click);
this.menu = this.mainmenu1;
如代碼所示menuitem1(file)和menuitem2(help)被addrange到mainmenu1中成為了頂級的菜單,menuitem3(open)和menuitem4(exit)被addrange到menuitem1(file)中成為了file菜單下的子菜單項。
this.menuitem3.click += new system.eventhandler(this.menuitem3_click);表明menuitem3點擊時激發的事件處理程序,一般的事件處理程序象下面這樣:
private void menuitem3_click(object sender, system.eventargs e)
{
messagebox.show ( " my click open" ) ;
}
我們關心的其實是menuitem,讓它用我們的方式畫出有vs.net或xp風格的菜單就可以了,更簡單的說就是實現一個menuitem的繼承類,擴展它draw的部分。好吧,讓我們深入一點看看第二部分。
國內最大的酷站演示中心!