一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

WPF的消息機(jī)制(一)- 讓應(yīng)用程序動起來

  前言

  談起“消息機(jī)制”這個詞,我們都會想到Windows的消息機(jī)制,系統(tǒng)將鍵盤鼠標(biāo)的行為包裝成一個Windows Message,然后系統(tǒng)主動將這些Windows Message派發(fā)給特定的窗口,實際上消息是被Post到特定窗口所在線程的消息隊列,應(yīng)用程序的消息循環(huán)再不斷的從消息隊列當(dāng)中獲取消息,然后再派發(fā)給特定窗口類的窗口過程來處理,在窗口過程中完成一次用戶交互。

  其實,WPF的底層也是基于Win32的消息系統(tǒng),那么對于WPF應(yīng)用程序來說,它是如何跟Win32的消息交互,這里到底存在一個什么樣的機(jī)制?接下來我會通過下面幾篇博文介紹這個消息機(jī)制:

  WPF的消息機(jī)制(一)-讓應(yīng)用程序動起來

  WPF的消息機(jī)制(二)-WPF內(nèi)部的5個窗口

  (1)隱藏消息窗口

  (2)處理激活和關(guān)閉的消息的窗口和系統(tǒng)資源通知窗口

 ?。?)用于UI窗口繪制的可見窗口

 ?。?)用于用戶交互的可見窗口

  WPF的消息機(jī)制(三)-WPF輸入事件的來源

  WPF的消息機(jī)制(四)-WPF中UI的更新

  讓應(yīng)用程序動起來

  談到WPF的消息,首先應(yīng)該知道DispactherObject以及Dispatcher在WPF系統(tǒng)中的作用。

  WPF大部分的對象都是從DispatcherObject派生的,從這里派生的對象具有一個明顯的特征,那就是:修改對象時所在的線程,和創(chuàng)建對象時所在線程必須為同一個線程,這就是微軟所謂的線程親緣性(Thread affinity)的最簡單理解。那么誰能保證線程親緣性呢?那就是Dispacher了。從DispatcherObject派生的類型繼承三個重要的成員:Dispatcher屬性,CheckAccess(), VerifyAccess()方法。其中后面兩個方法就是檢驗線程親緣性的。按照WPF的實現(xiàn),如果你自己定義了個WPF的類型,并且是DispatcherObject的子類,你就必須在public的成員定義的邏輯開始處,調(diào)用base.Dispatcher.VerifyAccess(),檢驗線程親緣性。那么Dispatcher到底還做了什么事情呢?

  首先,我們看一下一個WPF的Application在啟動之后都走了哪些邏輯:

clip_image002

  通過調(diào)用堆??梢钥闯?,藍(lán)色的部分是啟動了一個線程,VisualStudio在Host的進(jìn)程當(dāng)中運行當(dāng)前應(yīng)用程序;紅色的部分是從Application.Main函數(shù)開始執(zhí)行,經(jīng)過幾個函數(shù)到達(dá)Dispatcher.Run(),最后到達(dá)Dispather.PushFrameInpl()方法。那么一個Application在Run之后,為什么要調(diào)用Dispatcher.Run()呢,他做了些什么事情你?如果通過Reflector仔細(xì)查看Application.Run(),你會發(fā)現(xiàn)里面實際起作用的代碼并不多,最后都是Dispatcher.Run在做事情。那么一個Application啟動之后,按照以前對Win32的消息機(jī)制的理解,當(dāng)應(yīng)用程序啟動后,必須進(jìn)入消息循環(huán),對于WPF,也是一樣的。那么WPF應(yīng)用程序是在什么地方進(jìn)入消息循環(huán)呢?其實這就是Dispatcher.Run()做的事情。查看上圖最后一步Dispacther.PushFrameImpl()的代碼,你會看到有下面的一段代碼:

clip_image004

  很明顯,橙色的部分是一個循環(huán),看起來是不是很眼熟,跟Win32編程碰到的消息循環(huán)是否很像?對了,這就是WPF應(yīng)用程序進(jìn)入了消息循環(huán)。循環(huán)調(diào)用GetMessage方法從當(dāng)前線程的消息隊列當(dāng)中不停的獲取消息,取出一個msg之后,交給TranslateAndDispatchMessage方法Dispatch到不同的窗口過程去處理。這樣以來,任何需要應(yīng)用程序處理的消息通過這個過程,被不同的窗口處理了,應(yīng)用程序就動起來了。

  下面的一篇我會介紹WPF當(dāng)中的Win32窗口,正是這些窗口,處理著來自系統(tǒng),或者來自應(yīng)用程序內(nèi)部的消息。

NET技術(shù)WPF的消息機(jī)制(一)- 讓應(yīng)用程序動起來,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 天天添 | 美女视频黄色 | 高清成年美女黄网站色大 | 欧美视频在线观看免费播放 | 国产黄色网页 | 人人澡人人模人人添 | 成人观看的视频三级 | 大杳蕉伊人狼人久久一本线 | 99精彩免费观看 | 91免费视频版 | 日本精品久久久久久久 | 91精品免费久久久久久久久 | 六月婷婷精品视频在线观看 | 精品久久一 | 91久久国产综合精品 | www.99在线| 亚洲综合插插 | 国产精品资源手机在线播放 | 日本一区二区三区四区视频 | 日韩国产一区二区 | 国产自精品在线 | 加勒比一本大道香蕉在线视频 | 禁断の肉体乱爱中文字幕欧 | 凹凸精品视频分类国产品免费 | www.欧美在线观看 | 国内视频一区 | 视频一区二区不卡 | 亚洲精品网站在线 | 最新国产一区二区精品久久 | 美女胸又大又黄的网站 | 欧美另类xxx精品人妖 | 成人情趣视频无遮掩免费 | 美女特级毛片 | 美女一级ba大片免色无遮住 | 六月婷婷久久 | 国产91精品露脸国语对白 | 精品网址 | 久久久久综合网久久 | 日韩精品一区二区三区免费视频 | 成人免费黄色网址 | 欧美三级成人观看 |