天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

WPF的消息機(jī)制(一)- 讓?xiě)?yīng)用程序動(dòng)起來(lái)

  前言

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

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

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

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

  (1)隱藏消息窗口

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

  (3)用于UI窗口繪制的可見(jiàn)窗口

  (4)用于用戶交互的可見(jiàn)窗口

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

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

  讓應(yīng)用程序動(dòng)起來(lái)

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

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

  首先,我們看一下一個(gè)WPF的Application在啟動(dòng)之后都走了哪些邏輯:

clip_image002

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

clip_image004

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

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

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

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

主站蜘蛛池模板: 日本xxx片免费高清在线 | 美国大臿蕉香蕉大视频 | 国产哺乳期奶水avav | 日本撒尿特写 | 久久青草在线视频精品 | 差差差差差差差差免费观看 | 精品久久久久中文字幕日本 | 久久精品日本免费线 | 国精产品一区二区三区有限公司 | S货SAO死你BL大点声叫BL | 超碰日韩人妻高清视频 | 午夜视频无码国产在线观看 | 成 人 片 免费播放 成 人 免费 黄 色 网站无毒下载 | 国产一区二区在线免费观看 | 6 10young俄罗斯| 国产精品久久久久久人妻香蕉 | 学生无码AV一区二区三区 | 老司机无码精品A | 一区二区三区高清视频 | 国产高清视频免费在线观看 | 99re10久久热 | 在线观看日韩一区 | 亚洲中文无码永久免费 | 国产一区二区三区内射高清 | 亚洲 欧美 制服 视频二区 | 亚洲网站视频在线观看 | 免费精品国偷自产在线在线 | 999人在线精品播放视频 | 一个人看的www视频动漫版 | 果冻传媒AV精品一区 | 丰满大爆乳波霸奶 | 国产无线乱码一区二三区 | 123超碰在线视频 | 北岛玲手机在线观看视频观看 | 伊人久久精品AV一区二区 | 亚洲无遮挡无码A片在线 | 亚洲黄色在线播放 | 国产成人免费a在线资源 | 美女搞鸡网站 | 美女胸禁止18以下看 | 大香伊蕉在人线国产97 |