按鈕單擊事件處理程序
接下來就是每個按鈕的按鈕單擊事件處理程序。多數(shù)僅僅是向繪圖列表中添加一個新的可繪制對象,然后調(diào)用 PictureBox 上的 Invalidate,從而使用更新的繪圖列表進行重繪。典型的按鈕事件處理程序代碼如下所示:
C#
private void AddPoint_Click(object sender, System.EventArgs e) {
drawingList.Add(new DPoint(GetRandomPoint(), Color.Blue));
Drawing.Invalidate();
}
Visual Basic
.NET Private Sub AddPoint_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles AddPoint.Click
drawingList.Add(New DPoint(GetRandomPoint(), Color.Blue))
Drawing.Invalidate()
End Sub
Change fills to hot pink(將填充色更改為粉紅)按鈕有一些不同 -- 它在列表中獲得一個所有可填充對象的數(shù)組,然后將它們的畫筆顏色更改為粉紅。這部分代碼顯示在前面“返回可填充列表”一節(jié)的末尾。(此外還必須使 PictureBox 無效。)
最后,Erase All(全部刪除)按鈕簡單地創(chuàng)建了一個新的繪圖列表,并將我們的 drawingList 字段指向該列表。這樣便釋放了舊的繪圖列表以進行最后的內(nèi)存回收。然后使 PictureBox 無效,把自己也刪除掉。
PictureBox 畫圖事件處理程序
我們要注意的最后一項就是在 PictureBox 中畫出圖像。為此,需要處理 PictureBox 生成的 Paint 事件,然后使用通過此事件傳遞的 Graphics 對象在其上進行繪圖。要進行繪圖,只需調(diào)用繪圖列表的 DrawList 方法 -- 一個 for each 循環(huán)和多態(tài)將負責處理剩下的工作!
C#
private void Drawing_Paint(object sender,
System.Windows.Forms.PaintEventArgs e) {
drawingList.DrawList(e.Graphics);
}
Visual Basic
.NET Private Sub Drawing_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles Drawing.Paint
drawingList.DrawList(e.Graphics)
End Sub
我們的 Windows 窗體應(yīng)用程序之旅到此結(jié)束 -- 請斟酌這些代碼并進行修改,這樣可以學到更多內(nèi)容!
在 ASP.NET 應(yīng)用程序中使用可繪制對象
雖然 ASP.NET Web 應(yīng)用程序和 Windows 窗體應(yīng)用程序之間存在某些不同,但兩者的相似性還是令 Dr. GUI 感到驚奇!
Web 窗體應(yīng)用程序的主要部分
ASP.NET Web 窗體應(yīng)用程序的主要部分與 Windows 窗體應(yīng)用程序的各部分非常對應(yīng)。
頁面
此項對應(yīng) Windows 窗體應(yīng)用程序中的主窗口。頁面是所有按鈕和其他控件的容器。
按鈕
同樣,這里有一組按鈕,可用于在窗體上執(zhí)行各種操作。請注意,與以前的應(yīng)用程序不同,我們將頁面文檔的 pageLayout 屬性設(shè)置為 GridLayout 而不是 FlowLayout。這意味著我們可以通過像素位置定位每個按鈕(以及其他控件)。
請注意,這里也有一些文本框。
還要注意,您不能向 Web 復制和粘貼 Windows 窗體控件 -- 必須重新創(chuàng)建整個頁面。
圖像控件
圖像控件對應(yīng)于 Windows 窗體應(yīng)用程序中的 PictureBox。但兩者有一些重要的差別:圖像控件不生成 Paint 消息,而是包含加載圖像的 URL。
我們將這個 URL 設(shè)置為第二個 Web 頁,ImageGen.aspx。換句話說,我們有一個 Web 頁,它的全部工作就是從我們的繪圖列表中生成圖像中的位,然后將圖像發(fā)送到客戶端的 Web 瀏覽器。
我們將在下面討論其代碼。
Web 窗體應(yīng)用程序的主要例程
Windows 窗體應(yīng)用程序和 Web 窗體應(yīng)用程序的代碼之間存在一些重要不同 -- 但也有某些有趣的相似之處。還要注意,可繪制對象文件中的所有代碼都可以用于三種應(yīng)用程序中的任何一種。
我們的頁面是從 System.Web.UI.Page 派生的,除了以下內(nèi)容外,還包含一組用于所有控件的聲明:
完全相同的內(nèi)容:數(shù)據(jù)聲明和 GetRandomPoint
此代碼與 Visual Basic .NET Windows 窗體應(yīng)用程序中的代碼幾乎完全相同。如果愿意,可以再看一下上面的這段代碼。它們之間只有一個不同之處,就是對字段進行了聲明而沒有將其初始化。它們將在 Page_Load 方法中被初始化(如后面所示)。
GetRandomPoint 方法與其他應(yīng)用程序完全相同。能夠重復使用代碼真的不錯,不是嗎?
非常相似的內(nèi)容:按鈕單擊事件處理程序
按鈕單擊事件處理程序與 Windows 窗體應(yīng)用程序相同,只有一個例外:在 Web 窗體中,由于每次單擊按鈕時都將重繪圖像,因此無需(也不能)使圖像控件無效。此外,它還將自動進行重繪 -- 因此唯一要調(diào)用的就是繪圖列表的 Add 方法。
以下是一個典型的按鈕事件處理程序 -- 用于繪制一個點。
Private Sub AddPoint_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles AddPoint.Click drawingList.Add(New DPoint(GetRandomPoint(), Color.Blue)) End Sub
其他按鈕事件處理程序都與 Windows 窗體的情況類似,當然,有一種例外情況除外,即不調(diào)用任何一種方法使圖像無效。
差別很大的內(nèi)容:頁面加載和卸載處理程序
頁面加載和卸載處理程序方法是完全不同的。
請記住,我們的頁面對象是使用每一個 HTTP 請求重新創(chuàng)建的。由于每個請求都將創(chuàng)建一個新頁面,因此我們不能象在 Windows 窗體中那樣將數(shù)據(jù)作為成員變量存儲,在 Windows 窗體中,主窗口將伴隨應(yīng)用程序而存在。
因此我們必須在某種狀態(tài)變量中存儲請求和頁面之間所需的信息。這里有幾種選擇 -- 下面將就此進行討論。