介紹
由當前關於互聯網的許多討論來看
似乎微軟的Visual Studio開發系統已經完全不再支持開發傳統的基於Windows操作系統的應用程序了
而實際情況是
微軟依然非常重視對基於Windows的應用程序的開發
Win Forms是一種全新的窗體形式
開發人員可以利用它創建充分利用微軟的Windows操作系統中豐富的用戶接口的應用程序
Win Forms是微軟的
NET平台的一部分
采用了許多新的技術
包括一個公共應用程序框架
可管理的執行環境
集成的安全性和面向對象的設計原則
此外
Win Forms還提供了對方便迅速連接到互聯網服務和創建基於ADO+數據模型的應用程序的支持
有了Visual Studio中全新的共享開發環境
開發人員就能夠使用包括Visual Basic和C#在內的任何支持
NET平台的編程語言開發基於Win Forms的應用程序
Win Forms是什麼?
就象在上面提到的那樣
Win Forms是
NET Framework中專指Windows客戶端UI編程的名字空間
它與被稱作Web Forms的ASP+ UI的設計原理相同
但其中的類和具體的實現是完全不同的
Win
API和Web組件之間的類是不能夠互相轉換的
然而
象
NET框架中的其他部分一樣
一致性是其最優先考慮的部分
目的是讓一個Win Forms開發人員能夠迅速地適應Web Forms的編程方式
反之亦然
例如
二個名字空間都有Button類
其中都有文本域
OnClick事件和ForeColor
BackColor
Font等屬性
Win Forms控制是完全基於System
WinForms
Control類的
Control類有基本的HWND功能
處理大部分常見的WM_xxxx消息
從Control類派生出的是RichControl控制
它添加了輸出邏輯和繪制代碼
System
WinForms名字空間中的大部分控制都是由繼承RichControl得來的
ScrollableControl添加了對窗口用戶區滾動的支持
一般情況下
滾動支持是通過ContainerControl控制獲得的
ContainerControl控制是由繼承
ScrollableControl控制而得來的
其中添加了對子控制
焦點和標簽進行管理的支持
由繼承ContainerControl而生成的是Form
它是Win Form的最高層的控制
它有控制標題條
系統菜單
不規則窗口和缺省控制的屬性
另一個由繼承ContainterControl而生成的是UserControl
它就是開發人員可以創建的控制的基本類
UserControl是用來管理其他子控制的
微軟的Visual Studio
NET中有可視化的UserControl和Form設計器
我們可以發現用來添加和設計由繼承它們生成的類的工程條目
我們已經討論了有關Win Forms的最基本的知識
下面我們就來討論Win Forms的一些深層次的特性
較短的學習周期
Win Forms的首要目的是能夠盡可能地提高開發人員在開發Win
平台應用程序的編程效率
無論是GDI還是窗口狀態管理
在Win
中編程者相當困難的
例如
象WS_BORDER或WS_CAPTION等窗口風格只能在創建窗口時設定或修改
當然了
象WS_VISIBLE或WS_CHILD等窗口風格可以在已經創建的窗口上進行修改
Win Forms就能夠消除這種不統一性
確保操作可以在所有時間以同一種方式進行
可以在任何時候以任何順序修改Win Forms控制的屬性
並產生希望的效果
在改變這些屬性時需要創建新的HWND
Win Forms會自動地創建窗口
並對它進行合理的設置
使用Win Forms
獲得控制的通知或事件也更加簡單
所有的Win Forms事件都是基於一種被稱作Delegates的通用語言運行庫功能的
Delegates是一種安全函數的指針
可以為任何控制的任何事件添加Delegate事件自理程序
我們也無需通過重載創建一個處理所有事件的類
創建一個事件圖
或者為一個類中的所有事件實現一個接口而只會執行其中的一個
事件也可以通過重載繼承類進行處理
但一般情況下只有控制的創建者和在高級的應用程序設計中才會這樣作
接收一個按鈕的Click事件是相當簡單的
public class ButtonClickForm: System
WinForms
Form {
private System
WinForms
Button button
;
public ButtonClickForm() {
// 創建按鈕
button
= new System
WinForms
Button()
// 添加事件處理程序
button
AddOnClick(new System
EventHandler(button
_Click))
// 在窗體上添加按鈕
this
Controls
Add(button
)
}
private void button
_Click(object sender
EventArgs e) {
MessageBox
Show(
button
clicked!
)
}
}
在上面的代碼中
我們已經創建了一個按鈕並添加了一個事件處理程序方法button
_Click
當該按鈕被點擊時
其中的幾行代碼就會開始執行
著手開發Win Forms工程也是相當簡單的
在Visual Studio
NET中創建Win Forms工程只會生成一個被編譯的文件Form
cs
而不會生成頭文件
接口定義文件
引導應用程序文件
資源文件和庫文件
工程所需要的所有信息都包含在窗體的代碼中
其結果是工程可以很方便地由一個單一窗體組成的應用被擴充為包括有多個代碼文件
復雜的由多窗體構成的應用程序
其中沒有需要連接的臨時對象文件
只有代碼文件和已經建立的DLL文件
隨著慢慢熟悉這種方法
創建
NET框架應用程序和C/C++應用程序在復雜性方面的判別就會越來越明顯
由於信息只包含在代碼文件中
在Visual Studio
NET環境之外創建工程也是相當簡單的
而無論是Visual Basic代碼
C#代碼或是其他任何支持
NET框架的語言寫成的
由於Win Forms是建立在通用語言運行庫的
因此開發人員可以選擇任何一種支持通用語言運行庫的編程語言開發Win
應用程序
開發人員可以使用從C#到COBOL
Eiffel
Perl在內的
種編程語言開發Win Forms應用程序(或者Web Forms應用程序和Data應用程序)
這使得掌握多種編程語言的開發人員可以高效地使用Win Forms建立應用程序
輸出布局
如果你曾經嘗試著創建一個能夠正確地改變大小的窗體
就會發現這是多麼困難了/MFC和以前的Visual Basic沒有對此提供任何內置的支持
但在Visual Studio
NET中僅僅需要幾行的代碼(甚至這些代碼不需要你動手編寫
因為在設計窗體時的Property Browser(屬性浏覽器)中就能實現這樣的功能
)
就能創建一個能夠正確地改變大小的對話框
基本的輸出布局是由二部分組成的
Anchoring和Docking
RichControl類有一個Anchor屬性
這是一個枚舉型變量的值通過或運算來描述一個控制與其父控制邊緣的距離
例如
如果在一個窗體上創建了一個按鈕
並且將其Anchor屬性設置為AnchorStyles
BottomRight
則在改變大小時
按鈕將與窗體的下
右邊緣保持相同的距離
如果將Anchor屬性設置為AnchorStyles
All
按鈕將與窗體的四周保持固定的距離
按鈕就會改變自己的大小來符合這一要求
Docking是Anchoring的一種特殊情況
RichControl的Dock屬性定義控制與父控制的哪個邊相接觸
它的值可以是Top
Left
Right
Bottom或Fill
當父控制的大小變化時
它將仍然維持與特定邊緣的距離
將一個控制移動到移動到父控制的底部
並將Anchor設置為AnchorStyle
BottomLeftRight
等同於將Dock屬性設置為Bottom
在本例中
列表框與窗體的左邊緣相接觸
按鈕與窗體的頂
左和右邊保持一定的距離
因此
它們能夠維持相對的位置和大小
下面例子中對話框(圖
)是使用Visual Studio
NET中的Win Forms Designer設計的
在創建它時我用了
分鐘的時間
而沒有編寫一行代碼
// ResizableSample
cs
namespace ResizableSampleNamespace {
using System;
using System
Drawing;
using System
ComponentModel;
using System
WinForms;
///
/// Summary description for ResizableSample
///
public class ResizableSample : System
WinForms
Form {
///
/// Required by the Win Forms designer
///
private System
ComponentModel
Container components;
private System
WinForms
Button button
;
private System
WinForms
Button button
;
private System
WinForms
Button button
;
private System
WinForms
ListBox listBox
;
public ResizableSample() {
// Win Form Designer要求下面的初始化函數
InitializeComponent()
}
///
/// 清除所使用的資源文件
///
public override void Dispose() {
base
Dispose()
components
Dispose()
}
///
/// 應用程序的主入口
///
public static void Main(string[] args) {
Application
Run(new ResizableSample())
}
///
/// Designer所需要的方法不要使用編輯器編輯其中的內容
///
private void InitializeComponent()
{
ponents = new System
ComponentModel
Container()
this
button
= new System
WinForms
Button()
this
button
= new System
WinForms
Button()
this
button
= new System
WinForms
Button()
this
listBox
= new System
WinForms
ListBox()
//@design this
TrayLargeIcon = false;
//@design this
TrayHeight =
;
this
Text =
Resizable Dialog
;
this
IMEMode = System
WinForms
IMEMode
Off;
this
AutoScaleBaseSize = new System
Drawing
Size(
)
this
ClientSize = new System
Drawing
Size(
)
button
Location = new System
Drawing
Point(
)
button
Size = new System
Drawing
Size(
)
button
TabIndex =
;
button
Anchor = System
WinForms
AnchorStyles
TopLeftRight;
button
Text =
Cancel
;
button
Location = new System
Drawing
Point(
)
button
Size = new System
Drawing
Size(
)
button
TabIndex =
;
button
Anchor = System
WinForms
AnchorStyles
All;
button
Text =
Filler
;
button
Location = new System
Drawing
Point(
)
button
Size = new System
Drawing
Size(
)
button
TabIndex =
;
button
Anchor = System
WinForms
AnchorStyles
TopLeftRight;
button
Text =
OK
;
listBox
Size = new System
Drawing
Size(
)
listBox
Dock = System
WinForms
DockStyle
Left;
listBox
TabIndex =
;
listBox
Items
All = new object[] {
Item One
Item Two
Item Three
Item Four
};
this
Controls
Add(button
)
this
Controls
Add(button
)
this
Controls
Add(button
)
this
Controls
Add(listBox
)
}
}
}
From:http://tw.wingwit.com/Article/program/net/201311/13232.html