給.NET中的Windows窗體加載Xp樣式
2024-07-10 13:00:20
供稿:網友
給.net中的windows窗體加載xp樣式
作者:heath stewart
介紹
當windows xp 帶著他特有的可視化樣式或者主題發布時,許多人為他擁有的華麗界面而興奮。然而,當.net1.0正式版本發布的時候,許多人包括我自己為windows 窗體不支持windows xp 的可視化樣式而失望。我對可視化樣式的api函數和微軟的.net框架開發文檔進行了一番研究,而后認識到為.net應用程序加上xp樣式也不是很難。
下面的將通過一個簡單的程序來為你的程序和控件加上xp樣式。內容適用于一些擁有能實現xp樣式的屬性的控件,通過這些屬性使他們產生xp樣式,同時通知windows系統為你的應用程序和控件加上主題。
實現所需條件
你需要一些條件來實現這項功能:
1.microsoft .net framework sdk(必須)
2.microsoft visual studio .net,他幫助你設計windows窗體(可選)
3.windows xp 操作系統(可選),支持主題的正式版本操作系統
進入正題
打開visual studio .net 建立一個新的windows 應用程序。在這里我將使用c#來作為編程語言,因此如果你使用visual basic.net,你就需要轉換代碼。當你建好項目后,打開assemblyinfo.cs文件,在assemblytitle,assemblydescription以及assemblyversion中填入值,修改assemblydelaysign的值為true。同時你也要修改assemblykeyfile的值為@”../../keyfile.snk”,keyfile.snk文件我們隨后回來創建或者拷貝一個。
當你按照上面所說的完成后,你的代碼看起來應該象下面:
using system.reflection;
using system.runtime.compilerservices;
[assembly: assemblytitle("theme test")]
[assembly: assemblydescription("testing windows xp visual styles.")]
[assembly: assemblyconfiguration("")]
[assembly: assemblycompany("")]
[assembly: assemblyproduct("")]
[assembly: assemblycopyright("")]
[assembly: assemblytrademark("")]
[assembly: assemblyculture("")]
[assembly: assemblyversion("1.0.0.0")]
[assembly: assemblydelaysign(true)]
[assembly: assemblykeyfile(@"../../keyfile.snk")]
[assembly: assemblykeyname("")]
現在,打開form1.cs窗體設計界面加一些windows窗體控件到上面,比如listviews,buttons,groupboxes,progressbars或者更多,下面列出了所有支持xp樣式的孔件:
textbox
richtextbox
hscrollbar
vscrollbar
progressbar
tabcontrol
mainmenu
contextmenu
combobox
datagrid
listbox
listview
treeview
datetimepicker
monthcalendar
splitter
trackbar
statusbar
toolbar
treeview
listview
對于這些控件,有些是默認就支持的,另外的一些特定的控件是從buttonbase,groupbox,或者label繼承而來,你需要設置他們的flatstyle屬性為system,那些我會做一些簡短的說明。
當你編譯這個應用程序后,你會發現這個windows forms看上去不象帶有xp樣式,要找到原因,請往下看。
windows xp樣式的顯示原理
簡單描述:comctl32.dll,版本為6。comctl32.dll,或者那些普通控件使用了很長時間。這個動態連接庫被基礎控件使用,同時user32.dll提供給用戶控件。在版本6的comctl32.dll中,所有的控件都放入在里面,因此他們都支持主題。但是新版本的comctl32.dll不象上一個版本,要使用windows xp樣式,你必須使用包含有comctl32.dll的操作系統,比如windows xp。
對于那些被支持的控件,他們的樣式是同一些特殊的主題資源相關的,而這些就是用來在客戶界面進行繪制。對于那些派生于buttonbase,groupbox和lablel的控件必須把flatstyle屬性設置成flatstyle.system枚舉值,這樣系統就可以對他們進行繪制。
為了使操作系統給我們的控件加主題樣式,你需要通知系統讓版本6的comctl32.dll作為默認。系統默認的使用的是版本5的comctl32.dll,對于.net的程序也是如此,但是我們會讓程序在執行時使用版本6的comctl32.dll。
給你的項目增加一個xml文件,文件命取為[你的應用程序名].exe.manifest,[你的應用程序名]指得就是項目編譯生成的主exe文件。設置編譯類型為”none”。
假如你的assemblyinfo.cs中的代碼就是上面提到的那樣,那么新建的[你的應用程序名].exe.manifest文件應該為下面的樣子:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestversion="1.0">
<assemblyidentity
version="1.0.0.0"
processorarchitecture="x86"
name="theme test"
type="win32" />
<description>testing windows xp visual styles.</description>
<dependency>
<dependentassembly>
<assemblyidentity
type="win32"
name="microsoft.windows.common-controls"
version="6.0.0.0"
processorarchitecture="x86"
publickeytoken="6595b64144ccf1df"
language="*" />
</dependentassembly>
</dependency>
</assembly>
你要適當的替換上面的”version”和”name”屬性的值,使他和你項目里面的一樣,分別對應assemblyversion和assemblytitle屬性。那個”descryiption”元素也要同你的assemblydescription屬性符合。
接下去,打開命令提示窗口修改你的項目輸出路徑,應該把”bin/debug”作為項目路徑根目錄。假設你已經加了sn.exe強名稱工具的路徑到你的系統環境變量,那么在命令行中輸入如下:
sn.exe –k ../../keyfile.snk
上面的步驟會生成一個keyfile.snk公鑰文件,為了使你的程序集成為強類型程序集這個公鑰是必須的。這個在許多情況下是必須需的。
最后一步添加mnifest信息
你現在要在項目文件輸出的所在目錄。在我的例子中是一個簡單的windowsapplication1.exe文件,接下去會講到他。
現在,退回到visul studio.net,點擊文件菜單—>打開,瀏覽到你的應用程序比如windowsapplication1.exe,點擊打開他我們會看到一個資源文件管理樹。
1.右鍵在根節點上點擊選擇“添加資源”。
2.點擊“導入”按鈕,在你的項目路徑中找到windowsapplication.exe.mnifest并打開他。
3.在自定義資源類型對話框中我們輸入rt_manifest然后點擊確定。
4.保存所有文件讓我們回到先前的資源來瀏覽樹。我們現在可以看到一個rt_manifest的節點。
5.點擊選中他下面那個新加的資源文件,通常的名字是101。在屬性窗口里修改他的id值為1,再一次保存你的應用程序。
6.關閉你打開的資源瀏覽窗口回到命令行提示符下,輸入下面的命令:
sn –r windowsapplication1.exe ../../keyfile.snk
執行后會輸出一些版本信息,最后顯示:
assembly ‘windowsapplication1.exe’ successfully re-signed
運行你的.net應用程序你就會看到windows xp樣式了。
概要
你不需要做很多工作就可以把windows xp 可視化樣式加入到你的應用程序和控件。使用這些新的樣式將會帶給你的窗體新的視覺,而這些經常在商業程序上用到。許多公司都花精力去開發這方面的東西,而現在你可以不用做很多工作就可以做到。
請記住把那些帶有flatstyle屬性的控件設置為flatstyle.system,同時在編譯你的程序后加入manifest資源就象上面的樣板文件。當這些都做好了以后剩下的就是完成對程序集的簽名。如果你想要測試你的應用程序或者你有權限對他進行簽名,你可以通過下面的命令關閉對程序集的驗證:
sn.exe –vr windowsapplication1.exe
立即行動,為你的應用程序加上xp樣式,使你的產品更有特點。這樣做不會花很多時間但是效果是顯而易見的。
about heath stewart
heath stewart is a happily married software engineer originally from nebraska and a graduate of iowa state university in ames, iowa. with nothing much to do in either state, heath started programming early in life when gopher ruled and the internet wasn't commercialized, and enjoys continuous research and development in new languages and frameworks. fluent in many different programming languages, he has developed many large software solutions for companies in different areas, such as internet filtering, intrusion detection systems, production management systems, web sites for various purposes, and data analysis tools. he also enjoys photography.
currently, heath is the director of technology at proplanner, a web-based production planning system that primarily uses .net where he designed a multi-tiered environment and supports multiple front-ends (such as a legacy java interface on pdm) and back-ends (such as web services, rdbms's, file-based io, and pdm).
heath is now an editor for codeproject and is happy to help the development community as a microsoft mvp (c#).