精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

探討WinForm不同代碼的實(shí)現(xiàn)

開(kāi)發(fā) 后端
本文將通過(guò)對(duì)不同方法的WinForm代碼進(jìn)行對(duì)比,希望能對(duì)大家更好的了解WinForm有所幫助。

WinForm看上去有些深?yuàn)W,在這里我們將探討WinForm二三事,希望通過(guò)以下的文字,能讓大家在開(kāi)發(fā)過(guò)程中對(duì)WinForm有更深入的了解和認(rèn)識(shí)。

在進(jìn)入正文之前,想請(qǐng)大家先欣賞下面兩段代碼:

  1. //這是一個(gè)控制臺(tái)程序,請(qǐng)先添加System.Windows.Form.dll的引用   
  2. using System.Windows.Form;       
  3. public class ConsoleApplicationShowDialog    
  4. {     
  5.    static void Main()    
  6.     {     
  7.         Form frm = new Form();    
  8.        frm.ShowDialog();    
  9.   }    
  10.  }    

兩個(gè)代碼片段都是控制臺(tái)程序(編譯的時(shí)候,請(qǐng)選擇ConsoleApplication類(lèi)型編譯)。這兩段程序***的區(qū)別就在于顯示窗體的時(shí)候***個(gè)使用ShowDialog(就是所謂的模態(tài)窗體),第二個(gè)使用Show(也就是所謂的非模態(tài)窗體)。

經(jīng)過(guò)測(cè)試我們發(fā)現(xiàn),使用Show顯示出來(lái)的窗體一顯示就死在那里了,不響應(yīng)用戶的輸入,如果你在窗體上放一個(gè)按鈕,甚至發(fā)現(xiàn)按鈕都無(wú)法顯示,點(diǎn)擊也無(wú)任何響應(yīng)。而是用ShowDialog顯示出來(lái)的窗體卻不一樣,可以響應(yīng)用戶的輸入。這是什么原因呢?

為了找到問(wèn)題的根源,我們來(lái)看看Show方法和ShowDialog方法實(shí)現(xiàn)的區(qū)別。Show方法是在Control里定義的,F(xiàn)orm間接的派生自Control類(lèi)(看起來(lái)這里是一個(gè)組合模式哦),Show方法代碼:

  1. public void Show()    
  2.  {     
  3.      this.Visible = true;    
  4.  }  

Show方法的代碼相當(dāng)?shù)暮?jiǎn)單,做的工作僅僅就是將窗體顯示出來(lái),那前面第二段代碼應(yīng)該與下面的代碼作用是一樣的:

  1. //這是一個(gè)控制臺(tái)程序,請(qǐng)先添加System.Windows.Form.dll的引用     
  2.  using System.Windows.Form;   
  3. public class ConsoleApplicationShow     
  4. {    
  5.   static void Main()   
  6.     {     
  7.         Form frm = new Form();    
  8.     frm.Visible = true;   
  9.   }    

現(xiàn)在再來(lái)看看ShowDialog方法,ShowDialog方法有些復(fù)雜,但是在這百來(lái)行代碼中,應(yīng)該有一條你很熟悉:

  1. public DialogResult ShowDialog(IWin32Window owner)     
  2. {     
  3.     //...省略     
  4.      Application.RunDialog(this);     
  5.     //...省略     
  6.  } 

哦,這行代碼跟我們千千萬(wàn)萬(wàn)個(gè)WinForm程序的啟動(dòng)部分相當(dāng)類(lèi)似:

  1. public class Program     
  2. {     
  3.    static void Main()     
  4.      {    
  5.          Form frm = new Form();     
  6.          Application.Run(frm);    
  7.     }     
  8. }  

MSDN對(duì)Application.Run的說(shuō)明是:

Begins running a standard application message loop on the current thread, and makes the specified form visible.在當(dāng)前的線程上啟動(dòng)一個(gè)標(biāo)準(zhǔn)的應(yīng)用程序“消息循環(huán)”,并且顯示指定的窗體,下面是Application.Run的代碼:

  1. public static void Run(Form mainForm){    
  2. ThreadContext.FromCurrent().RunMessageLoop(-1, new   
  3. ApplicationContext(mainForm));  
  4. }  

哦?什么是消息循環(huán)?如果你是直接進(jìn)入.Net開(kāi)發(fā)的,沒(méi)有經(jīng)過(guò)Win32時(shí)代的洗禮,那可能對(duì)這個(gè)消息循環(huán)并不是很清楚,在你眼里只有注冊(cè)事件,處理事件。雖然.Net通過(guò)封裝,簡(jiǎn)化了消息循環(huán)這種處理用戶點(diǎn)擊等事件的編程模型,但是.Net底下還是Win32,有的時(shí)候我們還是得了解一下,對(duì)理解有些問(wèn)題可能有幫助(后面會(huì)提到)。

消息循環(huán)(Message Loop)

說(shuō)Application.Run啟動(dòng)一個(gè)消息循環(huán),那么什么是消息循環(huán)呢?看下面的代碼:

  1. MSG msg;   
  2. while(GetMessage(&msg,NULL,0,0)){   
  3.    TranslateMessage(&msg);      
  4. DispatchMessage(&msg);  

這是一段幾乎所有使用Win32 API編寫(xiě)Windows Application的程序里都有的代碼。這就是一個(gè)消息循環(huán)。你不需要透徹的理解上面這段代碼,你只需要了解這么一個(gè)意思:

Windows為每個(gè)Windows程序都維護(hù)了一個(gè)消息隊(duì)列,當(dāng)有用戶輸入事件的時(shí)候,Windows就把這個(gè)事件轉(zhuǎn)換為一個(gè)稱之為“消息”的東東(也就是上面代碼中的MSG結(jié)構(gòu)),在這個(gè)消息里包含有一些信息,比如鼠標(biāo)點(diǎn)擊的點(diǎn)啊,消息的類(lèi)型啊等等。而上面的while循環(huán)中的GetMessage方法就是不斷的從這個(gè)消息隊(duì)列里取消息出來(lái),然后處理,這樣窗體就能響應(yīng)用戶的輸入了。

通過(guò)上面的討論,我們現(xiàn)在大概明白了為啥Show和ShowDialog區(qū)別這么大呢,原來(lái)ShowDialog啟動(dòng)了一個(gè)消息循環(huán),這樣用ShowDialog顯示出來(lái)的窗體就能響應(yīng)用戶的輸入事件了,而Show僅僅是設(shè)置一下窗體的Visible屬性,并沒(méi)有啟動(dòng)一個(gè)消息循環(huán),使用Show顯示出來(lái)的窗體也就無(wú)法響應(yīng)用戶的輸入事件了,也就是死在那里了。

上面說(shuō),GetMessage取出消息,然后處理,那在哪兒處理呢?在Win32程序中我們還可以看到這樣的片段:

  1. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM   
  2. wParam,LPARAM lParam){   
  3.    switch(message)    {        
  4.   case WM_CREATE:            //處理窗體創(chuàng)建事件                
  5.  return 0;          
  6. case WM_PAINT:            //處理窗體繪制事件              
  7. return 0;                //更多事件,比如按鈕點(diǎn)擊等      
  8. }  

啊,好丑陋的處理方式。原來(lái)是根據(jù)message的類(lèi)型,做出不同的處理,而Windows定義了一大堆WM_開(kāi)頭的東東。可我們可愛(ài)的.Net,WinForm里面優(yōu)美的事件處理模型就是基于這個(gè)之上的,通過(guò)上面的代碼,和你在.Net里使用事件的感觸你是否能想象出.Net是如何封裝這個(gè)過(guò)程的?

WinForm中的消息處理

實(shí)際上在.Net的WinForm中,消息處理的影子還是存在的,并沒(méi)有消失得無(wú)影無(wú)蹤,在Form中還有這么一個(gè)protected的方法:

  1. protected override void WndProc(ref Message m){   
  2.    switch (m.Msg)    {          
  3. case 0x10://......          
  4. case 0x11:        //....     
  5.  }      
  6. base.WndProc(ref m);} 

哦,原來(lái)與Win32里面的那個(gè)一模一樣。實(shí)際上通過(guò)重寫(xiě)這個(gè)方法我們可以實(shí)現(xiàn)一些正常做法難以實(shí)現(xiàn)的東東。

為什么耗時(shí)操作要異步

談了這么多,我們來(lái)談一點(diǎn)我們身邊的事情。你應(yīng)該碰到過(guò)這樣一個(gè)場(chǎng)景:編寫(xiě)一個(gè)程序,點(diǎn)擊一個(gè)按鈕之后要做一個(gè)比較耗時(shí)的操作,比如要更新一大批數(shù)據(jù)到數(shù)據(jù)庫(kù),這個(gè)時(shí)候程序就像本文開(kāi)頭那個(gè)程序一樣,死掉了。用戶不管怎么點(diǎn)擊,程序變成灰色,標(biāo)題欄上還顯示一個(gè)“沒(méi)有響應(yīng)”,有的程序甚至連個(gè)提示都不給,用戶以為真的死掉了,氣急敗壞的啪嚓一下把程序關(guān)了,耗時(shí)操作進(jìn)行到一半就這樣被無(wú)情終止。這是為什么呢?

通過(guò)前面的討論,我們知道,響應(yīng)用戶的輸入就是靠消息循環(huán),而消息循環(huán)就是在當(dāng)前的線程上,也就是我們所謂的那個(gè)UI線程,如果一個(gè)耗時(shí)操作也同在UI線程上,那么消息循環(huán)就“卡著”了,也就無(wú)法處理后續(xù)的消息,程序也就假死了。

那我們?nèi)绾翁幚磉@種耗時(shí)操作呢?當(dāng)然就是將這個(gè)耗時(shí)操作放到另外一個(gè)線程中,不占用UI線程,讓消息循環(huán)得以繼續(xù)的進(jìn)行下去。

原文標(biāo)題:WinForm二三事

鏈接:http://www.cnblogs.com/yuyijq/archive/2009/11/04/1595775.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2019-06-03 09:00:25

Kubernetes部署金絲雀版本

2024-08-20 08:05:14

WinformWndProc?Windows

2024-04-19 00:47:07

RabbitMQ消息機(jī)制

2010-12-22 11:19:09

Java字節(jié)代碼

2024-10-10 08:32:28

Redis高并發(fā)Lua

2009-12-02 19:42:24

PHP頁(yè)面自動(dòng)跳轉(zhuǎn)

2009-12-01 16:34:21

PHP表單

2024-05-11 08:20:23

2009-11-23 10:31:25

PHP使用JSON

2009-11-30 18:59:52

PHP數(shù)組排序

2010-01-04 17:29:00

Silverlight

2010-02-03 10:50:33

C++多態(tài)

2009-09-01 10:35:59

C# WinForm控

2009-09-03 17:01:04

C#回車(chē)切換焦點(diǎn)

2022-02-21 08:18:38

option編程模式

2024-10-15 16:01:19

SpringBoot緩存預(yù)熱

2021-01-05 13:23:39

數(shù)據(jù)中心數(shù)據(jù)中心節(jié)能碳中和

2009-11-30 17:49:51

PHP函數(shù)preg_s

2010-01-20 09:14:49

C語(yǔ)言模塊化

2012-08-21 11:26:17

Winform
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

超碰个人在线| 日韩成人在线免费视频| 高清亚洲高清| 一区二区三区日韩欧美| 国内成+人亚洲| 欧美成人精品网站| 欧美a级一区| 日韩毛片在线看| 亚洲一级片网站| 国产白丝在线观看| 欧美激情中文字幕| 成人动漫视频在线观看免费| 国产成人无码av| 亚洲乱码电影| 亚洲欧美一区二区三区四区| 国产精品久久久久久久av福利| 波多野结衣中文在线| 日本一区二区免费在线观看视频| 亚洲a在线观看| 波多野结衣视频网站| 97精品在线| 亚洲国产欧美一区二区三区同亚洲 | 人人干人人干人人| 国产丝袜在线观看视频| 国产精品网站在线| 国产一区二区三区四区五区加勒比| 国模私拍一区二区| 在线欧美一区| 美女视频黄免费的亚洲男人天堂| 熟女俱乐部一区二区视频在线| 日韩成人18| 欧美午夜寂寞影院| 女性女同性aⅴ免费观女性恋| 二区在线播放| 国产精品欧美综合在线| 久久99精品久久久久久秒播放器 | 日本在线观看一区| 欧美一级特黄aaaaaa| 另类综合日韩欧美亚洲| 日本久久久a级免费| 国产在线拍揄自揄拍| 91久久电影| 在线观看视频亚洲| 88久久精品无码一区二区毛片| 99久久香蕉| 日韩午夜在线观看| 欧美xxxxxbbbbb| 四虎影视成人精品国库在线观看| 日本福利一区二区| 欧美日韩第二页| 97人人爽人人澡人人精品| 亚洲精品自拍动漫在线| 9999在线观看| 老司机精品影院| 亚洲欧洲另类国产综合| 亚洲人成人77777线观看| 国产一区二区三区不卡在线| 久久综合色8888| 国产精品麻豆免费版| 亚洲爱情岛论坛永久| 国产精品一区一区三区| 3d动漫精品啪啪一区二区三区免费 | 国产精品magnet| 欧美国产日本在线| 精品处破女学生| 影音先锋中文字幕一区二区| 国内精品一区二区三区| xxxx.国产| 老牛嫩草一区二区三区日本| 日本精品中文字幕| 中文字幕人妻色偷偷久久| 欧美a级一区二区| 成人性生交大片免费观看嘿嘿视频| 国产精品人妻一区二区三区| 国产精品夜夜爽| 国产乱码精品一区二区三区不卡| 天天综合网天天综合| 久久久99免费| 亚洲一区二区三区精品在线观看| 精品欧美色视频网站在线观看| 亚洲欧美日韩一区二区三区在线观看| 国产午夜精品视频一区二区三区| 日本一本在线免费福利| 欧美日韩国产限制| 999精品视频在线| 国产精品一区二区精品| 欧美mv日韩mv国产网站| 中文字幕一区二区久久人妻网站 | 亚洲无线码在线一区观看| 婷婷综合在线视频| 欧美成人久久| 欧美一区亚洲一区| 在线观看国产小视频| 国产精品一区专区| 免费精品视频一区| 欧美成人三区| 午夜久久久久久久久久一区二区| 久久国产乱子伦免费精品| 欧洲成人一区| 欧美成人国产一区二区| 蜜桃传媒一区二区亚洲av | 在线精品国产欧美| 国产精品成人免费观看| 奶水喷射视频一区| 91亚洲人电影| 欧美69xxxxx| 亚洲麻豆国产自偷在线| 国产在线青青草| 亚洲电影二区| 亚洲欧洲第一视频| 免费网站看av| 麻豆专区一区二区三区四区五区| 国产伦一区二区三区色一情| 1024视频在线| 欧美视频在线视频| 日本泡妞xxxx免费视频软件| 国产videos久久| 久久久久久中文字幕| 在线观看亚洲国产| 久久综合色综合88| 国产精品入口芒果| 婷婷精品久久久久久久久久不卡| 日韩国产欧美区| 久久久综合久久| 极品少妇xxxx偷拍精品少妇| 久久综合婷婷综合| 丝袜国产在线| 91麻豆精品久久久久蜜臀| 免费一级做a爰片久久毛片潮| 欧美不卡一区| 91青草视频久久| h视频网站在线观看| 欧美日韩国产一区中文午夜| 999热精品视频| 97国产成人高清在线观看| 日韩av电影在线免费播放| 欧美一级特黄aaaaaa| 亚洲精品第1页| 在线看免费毛片| 日韩av片子| 国产精品久久一区| 国产在线91| 91黄色免费观看| 新91视频在线观看| 先锋影音久久久| 麻豆久久久9性大片| 妞干网免费在线视频| 亚洲精品在线网站| 久久亚洲成人av| 国产91精品精华液一区二区三区| 最新av网址在线观看| 国产精区一区二区| 欧美成人午夜影院| av中文字幕免费在线观看| 亚洲天堂成人网| 天天做天天干天天操| 天天久久综合| 亚洲综合日韩中文字幕v在线| 国产在线观看91| 日韩欧美一级在线播放| 中文日韩电影网站| 久久久久中文字幕亚洲精品| 911久久香蕉国产线看观看| 国产日韩欧美视频在线| 黄色网址在线免费| 日韩亚洲电影在线| 国产一二三四在线| 91丨porny丨国产入口| 黄色国产精品视频| 成人区精品一区二区婷婷| 国产精品偷伦免费视频观看的| 高清在线观看av| 欧美日韩成人综合| 久久无码精品丰满人妻| 波多野结衣在线一区| 国产男女在线观看| 国产伦精品一区二区三区千人斩| 国产精品精品一区二区三区午夜版| 阿v免费在线观看| 7777精品伊人久久久大香线蕉超级流畅| 三上悠亚作品在线观看| 国产成人免费在线视频| 浮妇高潮喷白浆视频| 欧洲乱码伦视频免费| 成人国产精品av| www.51av欧美视频| 中国人与牲禽动交精品| 99国产精品久久久久久久成人| 亚洲综合一二区| 欧美图片一区二区| 国产尤物一区二区在线| 免费毛片网站在线观看| 成人情趣视频| 国产欧美亚洲日本| 国产美女久久| 国外成人在线直播| 国产在线色视频| 欧美一级欧美三级| 欧美精品韩国精品| 亚洲精品中文在线| 在线观看福利片| 国产综合一区二区| 国产av无码专区亚洲精品| 久久久久国产精品| 久久久久久久久久久一区| 日韩黄色三级在线观看| 97色在线视频| 黄色小网站在线观看| 亚洲欧美日韩一区二区三区在线| 国产jzjzjz丝袜老师水多| 欧美性极品xxxx娇小| 唐朝av高清盛宴| 中文一区二区完整视频在线观看| 91九色蝌蚪porny| 蜜臀久久99精品久久久画质超高清 | 五月天婷婷影视| 亚洲一区不卡| av一区二区三区免费观看| 北条麻妃国产九九九精品小说| 超碰国产精品久久国产精品99| 亚洲综合在线电影| 欧美一级淫片aaaaaaa视频| 在线看女人毛片| 综合国产在线视频| 色综合免费视频| 日韩视频中午一区| 在线亚洲欧美日韩| 日韩欧美主播在线| 国产一卡二卡在线| 免费在线一级片| 黄色软件在线| 欧美一级片免费看| 亚洲成人av网址| 欧美性猛交xxxx乱大交蜜桃 | 亚洲色图欧洲色图婷婷| 国产伦理片在线观看| 不卡视频在线观看| 色哟哟在线观看视频| 国内成人免费视频| 中日韩av在线播放| 久久精品国产亚洲aⅴ| 妺妺窝人体色www在线观看| 一本色道久久综合| 日本精品久久久久久久久久| 欧美福利网址| 伊人久久在线观看| 欧美女激情福利| 真实国产乱子伦对白视频| 综合日韩在线| 中文字幕色呦呦| 午夜国产精品视频| 亚洲爆乳无码精品aaa片蜜桃| 你懂的亚洲视频| 热久久最新网址| 好看的av在线不卡观看| 菠萝蜜视频在线观看入口| 欧美久久九九| 国产高清av在线播放| 亚洲乱亚洲高清| 东京热加勒比无码少妇| 天堂在线一区二区| 日韩一级理论片| 久久99精品国产麻豆婷婷洗澡| 在线观看免费不卡av| 国产中文字幕一区| 2018国产精品| 91日韩一区二区三区| 国产中年熟女高潮大集合| 国产女主播在线一区二区| 国产美女网站视频| 亚洲女人的天堂| 国产一级特黄a高潮片| 午夜影院久久久| 亚洲欧美日韩一区二区三区四区| 欧美三区在线观看| 99在线精品视频免费观看20| 精品福利一二区| 毛片在线能看| 色偷偷9999www| 欧美videossex| 国产不卡精品视男人的天堂| 亚洲综合伊人| 国产综合欧美在线看| 亚洲精华一区二区三区| 亚洲成人在线视频播放| 每日在线更新av| 亚洲欧美日韩视频二区| 亚洲国产精品三区| 国产99一区视频免费| 亚洲天堂久久新| 亚洲色图制服丝袜| 黄色大片网站在线观看| 欧美日韩一区视频| 黑人乱码一区二区三区av| 亚洲视频一区二区三区| 成人福利片网站| 欧美性资源免费| 麻豆精品在线| 日韩av一区二区三区在线| 91精品在线观看国产| 毛片在线视频播放| 久久精品二区亚洲w码| 欧美 变态 另类 人妖| 亚洲素人一区二区| 中文字幕在线观看视频网站| 欧美片网站yy| 欧洲毛片在线| 欧美人交a欧美精品| 日韩高清不卡| 精品免费视频123区| 亚洲人体av| 99热手机在线| 99久久精品免费| 青青操国产视频| 欧美日韩精品福利| 青青草在线免费观看| 欧美激情亚洲自拍| 欧美高清你懂的| 欧美日韩国产不卡在线看| 国产精品99一区二区| 亚洲一二三av| 国产欧美久久久精品影院| 亚洲 欧美 视频| 精品国产乱码久久| 最新国产在线拍揄自揄视频| 国产精品久久久久久久久| 欧美成人一区在线观看| www.avtt| 国产精品夜夜嗨| 天天综合天天做| 欧美嫩在线观看| www.av在线播放| 国产91在线播放精品91| 亚洲第一福利专区| 自拍日韩亚洲一区在线| 国产成人亚洲综合色影视| 999精品在线视频| 欧美日韩一区二区三区四区五区| 日本视频在线免费| 青青草97国产精品麻豆| aa视频在线播放| 不卡一卡二卡三乱码免费网站| 欧美日韩精品亚洲精品| 欧美一级免费观看| 在线观看三级视频| 亚洲一区二区三区777| 91久久电影| 国产一级二级av| 亚洲综合视频在线| 亚洲国产综合网| 97精品一区二区视频在线观看| 久久超级碰碰| 国产精品97在线| 国产亚洲一本大道中文在线| 成人h动漫精品一区二区下载| 亚洲性av在线| 日韩护士脚交太爽了| 黑人巨茎大战欧美白妇| 国产成人在线视频播放| 日本三级午夜理伦三级三| 亚洲精品mp4| 欧洲av一区二区| 伊人久久99| 国产成人免费xxxxxxxx| 久久夜靖品2区| 亚洲欧洲高清在线| 4438五月综合| 久久99久久久久久| 久久综合九色综合97_久久久| 69xxxx国产| 欧美成人三级视频网站| 欧美三级电影在线| 欧美自拍小视频| 亚洲激情自拍视频| 亚洲欧美色视频| 午夜a成v人精品| 蜜臀av粉嫩av懂色av| 亚洲va欧美va人人爽午夜| 日本一级在线观看| 国产精品麻豆va在线播放| 中文字幕一区二区三区乱码图片| 人妻互换一二三区激情视频| 欧美日韩在线免费观看| 欧洲美女少妇精品| 国产精品一区二区三区免费| 日韩激情av在线| 欧美黑人一级片| 尤物yw午夜国产精品视频| 日本免费精品| 国产视频一区二区三区在线播放| 亚洲激情在线激情| 国产日产精品久久久久久婷婷| 999日本视频| 午夜在线视频一区二区区别 | 不卡影院免费观看| 亚洲免费在线观看av| 久久久精品一区| 国产成人短视频在线观看| 老司机久久精品| 色婷婷亚洲综合|