版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
WinForm事件處理機制C/SvsB/SC/S:Client/Server或客戶/服務器模式B/S:Browser/Server瀏覽器/服務器模式優(yōu)勢缺點B/S僅安裝維護服務器端,業(yè)務邏輯和數(shù)據(jù)處理完全在服務器端;客戶端僅需瀏覽器支持,客戶端零維護;分布性強,系統(tǒng)的擴展非常容易;開發(fā)簡單且共享性強、更適用于移動辦公和分布式辦公數(shù)據(jù)安全性問題較大、對服務器要求高、數(shù)據(jù)傳輸量大、軟件的個性化特點明顯降低,用戶體驗較差C/S充分發(fā)揮客戶端PC的處理能力,交互性強,具有安全的存取模式,網(wǎng)絡通信量低,響應速度快,利于處理大量數(shù)據(jù),用戶體驗豐富針對性強,客戶端需要安裝專用的客戶端軟件;不能實現(xiàn)快速部署安裝和配置;更新維護成本高;對客戶端的操作系統(tǒng)一般也會有限制胖客戶端瘦客戶端富客戶端目前,web
Form開發(fā)大量取代了傳統(tǒng)的WinForm開發(fā)領域但是:大量單機版軟件(操作系統(tǒng))大型游戲專業(yè)領域軟件如金融銀行業(yè),ERP,CAD等其他:QQ等為什么使用WindowsForms用戶體驗優(yōu)點:豐富的界面元素性能更加高效的數(shù)據(jù)庫訪問應用實現(xiàn)離線的應用安全Windows操作系統(tǒng)
Windows是一個具有可視化圖形用戶界面的多任務的操作系統(tǒng),它為用戶提供了風格統(tǒng)一的由窗口、菜單、工具欄等界面元素所構成的多任務環(huán)境Windows擁有一個圖形用戶界面(GUI).所有GUI都是基于位圖的視頻顯示器上使用圖形.圖形提供了使用屏幕的最佳方式、傳遞消息的可視化環(huán)境、能夠WYSIWYG(whatyouseeiswhatyouget:所見即所得)的圖形視頻顯示.動態(tài)鏈接Windows運轉的核心是一個被稱為動態(tài)鏈接的概念.Windows提供了應用程序可利用的豐富的函數(shù)調用,大多數(shù)用于實現(xiàn)其用戶界面和在視頻顯示器上顯示文本和圖形.這些函數(shù)采用動態(tài)鏈接庫即DLL實現(xiàn).Kernel32.dll處理傳統(tǒng)上由操作系統(tǒng)內(nèi)核處理的事務:內(nèi)存管理、文件I/O和任務處理.User32.dll指用戶界面,實現(xiàn)所有窗口邏輯.GDI32.dll是一個圖形設備接口,允許程序在屏幕和打印機上顯示文本和圖形.Windows窗體窗體是應用程序的基本單元。窗體實質上是一塊空白板,作為開發(fā)人員,您可通過添加控件來創(chuàng)建用戶界面,并通過編寫代碼來操作數(shù)據(jù),從而填充這個空白板。Windows窗體設計器為創(chuàng)建基于Windows的應用程序提供了一種快速的開發(fā)解決方案。在該設計器中可以進行可視化的、基于客戶端的窗體設計??蓮摹肮ぞ呦洹敝袑⒖丶蟿踊蚶L制到其圖面上。從最簡單的窗體開始…staticclassProgram//程序的入口{[STAThread]staticvoidMain(){Application.EnableVisualStyles(); //為應用程序啟用可視樣式
Application.SetCompatibleTextRenderingDefault(false);//在應用程序范圍內(nèi)設置控件顯示文本的默認方式Application.Run(newForm1()); //在當前線程上啟動消息循環(huán),并使某窗體可見}}提供static方法和屬性以管理應用程序,例如啟動和停止應用程序、處理Windows消息的方法和獲取應用程序信息的屬性。無法繼承此類。指定程序的主窗體,并在主窗體上啟動消息循環(huán)探究Form1代碼頁Form1繼承自Form類向Form1拖入一些控件后代碼的變化.designer.cs.csprivatevoidInitializeComponent(){
this.button1=newSystem.Windows.Forms.Button();
。。。
this.SuspendLayout();////button1//this.button1.Location=newSystem.Drawing.Point(103,126);this.button1.Name="button1";
。。。
this.button1.UseVisualStyleBackColor=true;
this.button1.Click+=newSystem.EventHandler(this.button1_Click);//
。。。
this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.ClientSize=newSystem.Drawing.Size(272,174);
this.Controls.Add(this.textBox3);…this.Controls.Add(this.button1);this.Name="Form1";this.Text="Form1";this.ResumeLayout(false);this.PerformLayout();}創(chuàng)建控件對象設置控件屬性注冊控件事件處理代碼將控件添加到控件集合中,使可見Windows的消息機制窗口以消息的形式接收窗口的輸入,窗口也用消息與其它窗口通訊.對消息的理解將是學習如何編寫windows程序必須逾越的障礙之一.例如:大多數(shù)windows程序都有大小合適的應用程序的窗口.用戶能夠通過鼠標拖動窗口的邊框來改變窗口的大小.通常,程序將通過改變窗口中的內(nèi)容來響應這種大小的變化.是Windows本身而不是應用程序正在處理與用戶重新調整窗口大小相關的全部代碼.續(xù)應用程序是如何知道用戶改變了窗口的大小的呢?問題的關鍵在于理解windows所使用的體系結構.當用戶改變窗口的大小時,windows給程序發(fā)動一條消息指出新窗口的大小.然后程序就可以調整窗口中的內(nèi)容,以反映大小的變化.其實,所謂windows給程序發(fā)送消息,是指windows調用程序中的一個函數(shù),該函數(shù)的參數(shù)描述了這個特定消息.這種位于windows程序中的函數(shù)被稱為窗口過程.續(xù)在面向對象的程序設計中,對象是代碼與數(shù)據(jù)的結合.窗口是一種對象,其代碼是窗口過程,數(shù)據(jù)是窗口過程保存的信息,以及windows為每個窗口系統(tǒng)中那個窗口類保存的信息.窗口過程處理給窗口發(fā)送消息.消息的目的是讓接受方執(zhí)行一段預先準備的代碼Windows程序開始執(zhí)行后,windows為該程序創(chuàng)建一個消息隊列,這個消息隊列用來保存該程序可能創(chuàng)建的各種不同窗口消息.程序中有一小段代碼,叫做消息循環(huán),用來從隊列中取出消息.并且將他們發(fā)送給相應的窗口過程.有些消息直接發(fā)送給窗口過程,不用放入消息隊列中.消息的處理
消息處理過程如下圖所示:
硬件消息系統(tǒng)隊列應用1消息隊列應用2消息隊列應用3消息隊列消息循環(huán)窗口過程缺省窗口過程發(fā)送消息派發(fā)消息應用3(1).當Windows應用程序開始執(zhí)行,操作系統(tǒng)在預定的入口與應用程序連接;(2).應用程序創(chuàng)立一個或更多的窗口,每個窗口(包括對話框)都有一個窗口過程函數(shù),程序通過窗口接收用戶的輸入和決定窗口顯示;(3).各種輸入產(chǎn)生的消息首先進入系統(tǒng)隊列,由系統(tǒng)根據(jù)產(chǎn)生消息的窗口將消息發(fā)至窗口所在應用程序的消息隊列;(4).程序的消息循環(huán)代碼段檢索從消息隊列中來的消息,并把它們返回Windows,由Windows發(fā)給適當?shù)拇翱谶^程函數(shù)進行處理,對于程序未響應的消息,發(fā)給缺省窗口過程函數(shù)進行處理。
“不論是在.Net或者Java中,GUI代碼都是事件驅動代碼。在.Net中我們有兩種GUI應用,WinForms和WebForms。WinForms表現(xiàn)傳統(tǒng)Windows桌面應用程序。在VisualStudio中,我們可以像VB6一樣對控件進行拖曳和編碼。”C#類庫使用“事件”封裝了消息事件驅動簡單的思路順序執(zhí)行方式(“劇本”)需要大量的時間用于輪詢用戶個人的行為(包括系統(tǒng)消息)被封裝在很多事件中,且根據(jù)用戶的行為隨機產(chǎn)生事件由操作系統(tǒng)來安排執(zhí)行順序對事件的處理代碼由程序員來設定,該代碼一般以回調函數(shù)的形式出現(xiàn),需要使用代理GUIAppeventeventeventevent別調用我,我會調用你System.Windows.Forms.ControlControl類是所有控件的基類,定義了很多事件,事件及其委托關系用hash表管理如何查看?事件處理事件被“事件處理器”(eventhandler)處理一般來說,處理器方法的代碼是寫在可視化界面的后面(“code-behind”).Net自動處理事件并生成一些基礎的調用事件處理器的代碼事件映射事件是如何映射到事件處理器的呢?通過Delegate機制privatevoidInitializeComponent(){
。。。。
this.button1=newSystem.Windows.Forms.Button(); this.button1.Location=newSystem.Drawing.Point(88,168); this.button1.Name="button1"; this.button1.Size=newSystem.Drawing.Size(136,40); this.button1.TabIndex=4; this.button1.Text="計算";
this.button1.Click+=newSystem.EventHandler(this.button1_Click);
。。。}事件委托類型委托執(zhí)行的函數(shù)含義:當button1被點擊時,調用button_Click方法事件、委托和事件處理器.net為每個控件、組件都預先定義了很多事件事件和事件處理器通過委托聯(lián)系起來委托其實是一種特殊的類.net中定義的最基本最常用的事件處理委托為EventHandler事件處理器EventHandler參數(shù)事件處理器有兩個參數(shù)Sender:表示哪個對象生成了該事件EventArgs:例外的特定事件信息(如果需要)privatevoidbutton1_Click(objectsender,System.EventArgse){ inta=0,b=0; try{ a=int.Parse(this.textBox1.Text); b=int.Parse(this.textBox2.Text); } catch{ MessageBox.Show("輸入字符串不是整數(shù),請重輸!"); return; } this.textBox3.Text=(a+b).ToString(); }什么是代理/委托DelegateC#不支持指針,如何實現(xiàn)回調函數(shù)呢?C#的委托是一種引用類型。使用delegate聲明,它類似于函數(shù),但是沒有函數(shù)體,在委托的對象實例中存放的不是數(shù)據(jù)的引用,而是對方法的引用,它相當函數(shù)指針。C#委托的聲明格式如下:修飾符delegate
函數(shù)返回值
委托名稱
(參數(shù)列表);例:publicdelegatevoidMyDelegate(inti);
//它匹配任何以一個整形為參數(shù)且無返回值的函數(shù)
//可以在沒有預先定義方法的時候先定義委托委托舉例(1)
delegate
void
Eatdelegate(stringfood);classMyDelegate{publicstaticvoidzsEat(stringfood){Console.WriteLine("張三吃"+food);}}classProgram{staticvoidMain(string[]args){
Eatdelegate
zs=newEatdelegate(MyDelegate
.zsEat);
zs("西瓜");}}用靜態(tài)方法名創(chuàng)建委托委托定義通過委托來調用方法,達到一樣的調用效果委托舉例(2)delegatevoidEatdelegate(stringfood);classMan{
privatestringname;publicMan(string_name){name=_name;}publicvoidEat(stringfood){ Console.WriteLine(name+"吃"+food);}}classProgram{staticvoidMain(string[]args){
ManZS=newMan("張三");ManLS=newMan("李四");ManWW=newMan("王五");Eatdelegatezs=newEatdelegate(ZS.Eat);Eatdelegatels=newEatdelegate(LS.Eat);Eatdelegateww=newEatdelegate(WW.Eat);EatdelegateeatChain;
eatChain=zs+ls+ww;eatChain("西瓜");}}用實例方法創(chuàng)建委托委托的多播,一組函數(shù)將被執(zhí)行委托舉例(3)delegatevoidEatdelegate(stringfood);classMyDelegate{publicstaticvoidzsEat(stringfood){Console.WriteLine("張三吃"+food);}publicstaticvoidlsEat(stringfood){Console.WriteLine("李四吃"+food);}publicstaticvoidwwEat(stringfood){Console.WriteLine("王五吃"+food);}}
classProgram{staticvoidMain(string[]args){Eatdelegatezs=newEatdelegate(MyDelegate.zsEat);Eatdelegatels=newEatdelegate(MyDelegate.lsEat);Eatdelegateww=newEatdelegate(MyDelegate.wwEat);Console.WriteLine("張三、李四和王五開座談會");EatdelegateeatChain;eatChain=zs+ls+ww;eatChain("西瓜");Console.WriteLine("李四出去接電話");
eatChain-=ls;eatChain("香蕉");Console.WriteLine("李四回來了");
eatChain+=ls;eatChain("桔子");}}將李四的方法從委托列表中排除事件Event事件發(fā)送者:一個事件發(fā)送者,其實就是一個對象,這個對象會自行維護本身的狀態(tài)信息。當本身狀態(tài)信息變動時,便觸發(fā)一個事件,并通知所有的事件接收者。事件接收者:對事件感興趣的對象,可以注冊感興趣的事件,通常需要提供一個事件處理程序,在事件發(fā)送者觸發(fā)一個事件后,會自動執(zhí)行這段代碼。加法器的例子中,誰是事件發(fā)送者,誰是接受者呢?開發(fā)商購房者購房者新樓開盤購房購房事件舉例在事件模型中,事件發(fā)送者起初并不知道哪個對象來接受這樣的事件。但又要通知到它,怎么辦呢?開發(fā)商起初并不知道有哪些購房者,當樓房開盤時,他是通過購房者的登記電話來找到購房者的。類似的,事件發(fā)送者也要這樣一個“登記本”,這在.Net里通過一個稱作委托(Delegate)的技術來實現(xiàn)的。事件舉例事件編程的主要步驟定義一個事件參數(shù)類定義一個委托定義事件發(fā)送者類定義一個事件定義觸發(fā)事件的方法定義事件接收者類定義事件處理方法定義測試類發(fā)送者,接收者的實例化將事件處理方法通過委托注冊到事件中
通常由系統(tǒng)實現(xiàn),除非要對現(xiàn)有控件、組件等擴展C#的事件編程框架(重點)1)定義事件參數(shù)類,它必須繼承自系統(tǒng)提供的System.EventArgs類
classNewHouseEventArgs:
EventArgs//聲明事件參數(shù)類,定義與事件有關的參數(shù)
2)定義與事件關聯(lián)的委托
delegatevoid
NewHouseEventHandler(objectsender,NewHouselEventArgse);
3)定義事件發(fā)送者類(包含事件的聲明、觸發(fā)事件的方法)
publicclassSalesMan{publiceventNewHouseEventHandlerNewHouseOpened;publicvoidOnNewHouseOpened(strings_name,stringh_name){//通過委托調用所有事件接收者注冊的方法}}
4)定義事件的接收者類(包含接收事件后的事件處理方法)
publicclassBuyer{//處理收到新樓開盤事件的方法,必須符合委托的定義
publicvoidBuyHouse(object
sender,
NewHouseEventArgse){Console.WriteLine(buyername+"已接收到"+e.housename+"樓盤的開盤信息!");}}5)定義一個測試類(含發(fā)送者,接收者實例化及注冊事件處理方法)
事件名+=(-=)new委托名(委托所指向的處理方法)
man1.NewHouseOpened+=new
N
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版電力工程設計咨詢合同2篇
- 二零二五年度高新技術企業(yè)承包商擔保合同3篇
- 二零二五版戶外用品促銷員活動策劃合同2篇
- 二零二五年度酒店前臺正規(guī)雇傭合同范本(含勞動合同變更及續(xù)簽規(guī)則)3篇
- 二零二五版港口安全評價與安全管理合同3篇
- 二零二五版環(huán)保工程保險合同3篇
- 二零二五版外資企業(yè)往來借款稅務籌劃合同3篇
- 二零二五年財務顧問企業(yè)財務管理咨詢合同3篇
- 二零二五版智能家居產(chǎn)品銷售安裝合同2篇
- 二零二五年度鋼筋行業(yè)購銷合同規(guī)范范本5篇
- 《阻燃材料與技術》課件 第8講 阻燃木質材料
- 低空經(jīng)濟的社會接受度與倫理問題分析
- JGJ120-2012建筑基坑支護技術規(guī)程-20220807013156
- 英語代詞專項訓練100(附答案)含解析
- GB/T 4732.1-2024壓力容器分析設計第1部分:通用要求
- 《采礦工程英語》課件
- NB-T31045-2013風電場運行指標與評價導則
- NB-T+10488-2021水電工程砂石加工系統(tǒng)設計規(guī)范
- 天津市和平區(qū)2023-2024學年七年級下學期6月期末歷史試題
- 微型消防站消防員培訓內(nèi)容
- (完整版)鋼筋加工棚驗算
評論
0/150
提交評論