欢迎来到天天文库
浏览记录
ID:43326153
大小:135.12 KB
页数:4页
时间:2019-09-29
《WPF的消息机制(二)-WPF内部的5个窗口之隐藏消息窗口》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、WPF的消息机制(-)-WPF内部的5个窗口之隐藏消息窗口目录WPF的消息机制(…)•讣应用程序动起来WPF的消息机制(二)・WPF内部的5个窗口(1)隐藏消息窗口(2)处理激活和关闭的消息的窗口和系统资源通知窗口(3)用于用户交互的可见窗口(4)用于UI窗口绘制的可见窗口WPF的消息机制(三)-WPF输入事件的來源WPF的消息机制(四)・WPF中UI的更新WPF内部的5个窗口对于Windows系统來说,它是一个消息系统,消息系统的核心就是窗口。对于WPF來说也是如此。那么WPF内部为什么需要窗口,又存在哪些窗口呢?在上-•篇,我们频縈的提及“线程”,“Dispatcher”其实
2、,运行WPF应用程序所在的线程就是WPF所谓的UI线程,在Application.RunZJn,调用Dispatcher.Run时会检査当前线程是否已经存在了一个Dispatcher对象,如果没冇就构造一个,在这里,一个线程对应一个Dispatcher。因此,WPF的对彖在获取this.Dispatcher属性时,不同对象取的都是同一个Dispatcher实例。另外,前面提到的“消息循环”,“消息队列”等都是Win32应用程序的概念,我们知道,提起这些概念,必然会跟Win32的“窗口”,“Handle”,“WndProc”Z类的概念离不开,那么WPF里而究竟有没有“窗体”,“Ha
3、ndle”,“WndProc”呢?我想说的是:有,还不止一个,只不过没有暴露出來,外面不需要关心这些。通常情况下,一个WPF应用程序在运行起來的时候,后台会创建5个Win32的窗口,帮助WPF系统來处理操作系统以及应用程序内部的消息。在这5个窗口中,只冇一个是可见的,可以处理输入事件与用户交互,其他4个窗口都是不可见的,帮助WPF处理來白其他方面的消息。接下來我会來介绍究竟这5个Win32的窗口如何帮助WPF处理消息,我会根据每个窗口创建的顺序來介绍。隐藏消息窗口创建时机:在Application的构造函数调用基类Dispatcherobject的构造两数的时候,会创建一个Dis
4、patcher对象,在Dispatcher的私有构造函数当中。川途:实现WPF线程模型的异步调用。谈到异步调用,相信许多人都不陌生。WinFormF,我们通常为了使一些花费较多时间的方法调用不影响UI的响应,会将这个操作分为很多步,然厉使用Beginlnvoke调用每一步,这样UI响应就不会被阻塞。Beginlnvoke的本质是往消息队列当中PostMessage,而不是直接调用,与此同时,UI行为(MouseMove)导致系统也往消息队列当中PostMessage更新UI,由丁•彼此花费的时间很短,就感觉两个消息是被同时处理似的,界而就不会觉得被阻塞TeWPF同样而临这样的问题
5、,他是如何解决的呢?在这里Window1#起着至关重要的作用。通过下面一副图我们來看看Window1#在做什么事情?MessageQueue〃修改UI状态voidSomeMethod()delegatevoidFooDelegate();privatevoidFoo()WMMouseMoveMsgProcessQueueWM_MouseMovethls.DispatchenBeginlnvoke(newFooDelegate(Foo),DispatcherPriorityQueue1・Disptache「将力法训用包装成一个Dispatcheroperation放入自己维护的•个
6、优先级臥列当中Dispatcherpriority.Normal,null):•说用PostMessage给线程的消息队列Post个MsgProcessQueue?^息,这个消息的HandleJiWIndowl#的HandleMsgProcessQueue•消息M坏从ifl您队列十中获収消您MessageLoopinDispatncer.PushFramelmpIDlpatrhprOnpratinnperatlonDlpatcherOperationDipatcherOperationDipatcherOperationO・Dispatch调用他的代理加WndProc(MSGms
7、g)if(ithis.GetMessage(refmsg,IntPtr.Zero,0,0)){break;>this.TranslateAndDispatchMessage(refmsg);}・将MsgProcessQueue消息派发到Window1#5•从优先队列叹-个Dispatcheroperation对彖〃从DispatcherPriorityQueue〃读取一个Dispatcheroperation〃执行关联的Delegate}window1#WPF也是通过Beginl
此文档下载收益归作者所有