大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> MFC消息响应机制分析

MFC消息响应机制分析

时间: 2021-07-31 作者:daque

浙江大学计划机系 胡朝日 陈奇 俞瑞钊  ---- 纲要: ---- mfc是windows下步调安排的最时髦的一个类库,然而该类库比拟宏大,更加是它的动静映照体制,更是波及到很多低层的货色,咱们在这边,对它的所有动静映照体制举行了体例的领会,不妨扶助步调开拓职员对mfc的动静映照体制有一个比拟精确的领会。 ---- 要害词:面向东西 动静映照 mfc 步调安排 一.弁言---- vc++的mfc类库本质上是windows下c++编制程序的一套最为时髦的类库。mfc的框架构造大洪量便了步调员的编制程序处事,然而为了越发灵验、精巧的运用mfc编制程序,领会mfc的体制构造常常不妨使编制程序处事一举两得。它有理的封装了win32 api因变量,并安排了一套简单的动静映照体制。但这套体制自己比拟宏大和搀杂,对它的领会和领会无疑无助于于咱们写出更为有理的高效的步调。这边咱们大略的领会mfc的动静相应体制,以领会mfc是怎样对windows的动静加以封装,简单用户的开拓。 二.sdk下的动静体制实行---- 这边大略的回忆一下sdk下咱们是怎样举行windows的步调开拓的。普遍来说,windows的动静都是和线程对立应的。即windows会把动静发送给和该动静对立应的线程。在sdk的形式下,步调是经过getmessage因变量从和某个线程对立应的动静部队内里把动静掏出来并放到一个特出的构造内里,一个动静的构造是一个如次的structure。 typedef struct tagmsg {                  hwnd   hwnd;                  uint   message;                   wparam wparam;                  lparam lparam;                  dword  time;                  point  pt; }msg;---- 个中hwnd表白和窗口进程关系的窗口的句柄,message表白动静的id号,wparam和lparam表白和动静关系的参数,time表白动静发送的功夫,pt表白动静发送时的鼠目标场所。 ---- 而后translatemessage因变量用来把虚键动静翻译成字符动静并放到相应的动静部队内里,结果dispatchmessage因变量把动静散发到关系的窗口进程。而后窗口进程按照动静的典型对各别的动静举行关系的处置。在sdk编制程序进程中,用户须要在窗口进程中领会动静的典型和跟动静一道的参数的含意,做各别的处置,对立比拟烦恼,而mfc把动静挪用的进程给封装起来,运用户不妨经过classwizard简单的运用和处置windows的百般动静。 三.mfc的动静实行体制---- 咱们不妨看到,在mfc的框架构造下,不妨举行动静处置的类的头文献内里城市含有declare_message_map()宏,这边重要举行动静映照和动静处置因变量的证明。不妨举行动静处置的类的实行文献里普遍都含犹如下的构造。 begin_message_map(cinheritclass, cbaseclass) //{{afx_msg_map(cinheritclass) //}}afx_msg_mapend_message_map()---- 这边重要举行动静映照的实行和动静处置因变量的实行。 ---- 一切不妨举行动静处置的类都是鉴于ccmdtarget类的,也即是说ccmdtarget类是一切不妨举行动静处置类的父类。ccmdtarget类是mfc处置吩咐动静的普通和中心。 ---- 同声mfc设置了底下的两个重要构造: afx_msgmap_entrystruct afx_msgmap_entry{ uint nmessage;   // windows message uint ncode;  // control code or wm_notify code uint nid;        // control id (or 0 for windows messages) uint nlastid;    // used for entries specifying a range of control id's uint nsig;       // signature type (action) or pointer to message # afx_pmsg pfn;    // routine to call (or special value)};和afx_msgmapstruct afx_msgmap{#ifdef _afxdll const afx_msgmap* (pascal* pfngetbasemap)();#else const afx_msgmap* pbasemap;#endif const afx_msgmap_entry* lpentries;};   个中afx_msgmap_entry构造包括了一个动静的一切关系消息,个中nmessage为windows动静的id号ncode为遏制动静的报告码nid为windows遏制动静的idnlastid表白即使是一个指定范畴的动静被映照的话,nlastid用来表白它的范畴。nsig表白动静的举措标识afx_pmsg pfn 它本质上是一个指向和该动静相映的实行因变量的南针。---- 而afx_msgmap重要效率是两个,一:用来获得基类的动静映照进口地方。二:获得自己的动静映照进口地方。 ---- 本质上,mfc把一切的动静一条条填入到afx_msgmap_entry构造中去,产生一个数组,该数组寄存了一切的动静和与它们关系的参数。同声经过afx_msgmap能获得该数组的首地方,同声获得基类的动静映照进口地方,这是为了当自己对该动静不相应的功夫,就挪用其基类的动静相应。 ---- 此刻咱们来领会mfc是怎样让窗口进程来处置动静的,本质上一切mfc的窗口类都经过钩子因变量_afxcbtfilterhook截获动静,而且在钩子因变量_afxcbtfilterhook中把窗口进程设定于afxwndproc。从来的窗口进程生存在分子变量m_pfnsuper中。 ---- 以是在mfc框架下,普遍一个动静的处置进程是如许的。 因变量afxwndproc接受windows操纵体例发送的动静。 因变量afxwndproc挪用因变量afxcallwndproc举行动静处置,这边一个超过是把对句柄的操纵变换成对cwnd东西的操纵。 因变量afxcallwndproc挪用cwnd类的本领windowproc举行动静处置。提防afxwndproc和afxcallwndproc都是afx的api因变量。而windowproc仍旧是cwnd的一个本领。以是不妨提防到在windowproc中仍旧没相关于句柄大概是cwnd的参数了。 本领windowproc挪用本领onwndmsg举行正式的动静处置,即把动静派送给关系的本领中去向理。动静是怎样派送的呢?本质上在cwnd类中都生存了一个afx_msgmap的构造,而在afx_msgmap构造中生存有一切咱们用classwizard天生的动静的数组的进口,咱们把传给onwndmsg的message和数组中的一切的message举行比拟,找到配合的那一个动静。本质上体例是经过因变量afxfindmessageentry来实行的。找到了谁人message,本质上咱们就获得一个afx_msgmap_entry构造,而咱们在上头仍旧提到afx_msgmap_entry生存了和该动静关系的一切消息,个中重要的是动静的举措标识和跟动静关系的实行因变量。而后咱们就不妨按照动静的举措标识挪用关系的实行因变量,而这个实行因变量本质上即是经过classwizard在类实行中设置的一个本领。如许就把动静的处置变化到类中的一个本领的实行上。举一个大略的例子,比方在view中对wm_lbuttondown动静的处置就变化成对如次一个本领的操纵。    void cinheritview::onlbuttondown(uint nflags, cpoint point)    {// todo: add your message handler code here and/or call default cview::onlbuttondown(nflags, point);   }提防这边cview::onlbuttondown(nflags, point)本质上即是挪用cwnd的default()本领。 而default()本领所做的处事即是挪用defwindowproc对动静举行处置。这本质上是挪用从来的窗口进程举行缺省的动静处置。 即使onwndmsg本领没有对动静举行处置的话,就挪用defwindowproc对动静举行处置。这是本质上是挪用从来的窗口进程举行缺省的动静处置。 ---- 以是即使平常的动静处置的话,mfc窗口类是实足摆脱了从来的窗口进程,用本人的一套体制构造实行动静的映照和处置。即先挪用mfc窗口类挂上去的窗口进程,再挪用向来的窗口进程。而且用户面临和动静关系的参数不复是固执的wparam和lparam,而是和动静典型简直关系的参数。比方和动静wm_lbuttondown对立应的本领onlbuttondown的两个参数是nflags和point。nflags表白在按下鼠标左键的功夫能否有其余虚键按下,point更大略,即是表白鼠目标场所。 ---- 同声mfc窗口类动静传播中还供给了两个因变量,辨别为walkpretranslatetree和pretranslatemessage。咱们领会运用mfc框架天生的步调,都是从cwinapp发端实行的,而cwinapp本质接受了cwinthread类。在cwinthread的运转进程中会挪用窗口类中的walkpretranslatetree本领。而walkpretranslatetree本领本质上即是从暂时窗口发端搜索承诺举行动静翻译的类,直到找到窗口没有父类为止。在walkpretranslatetree本领中挪用了pretranslatemessage本领。本质上pretranslatemessage最大的长处是咱们在动静处置前不妨在这个本领内里先做少许工作。举一个大略的例子,比方咱们蓄意在一个cedit东西里,把一切的输出的假名都以小写的情势展示。咱们只须要在pretranslatemessage本领中确定message能否为wm_char,即使是的话,把wparam(表白键值)由小写假名的值该为小写假名的值就实行了这个功效。 ---- 连接上头的例子,按照咱们对mfc动静体制的领会,咱们很简单获得除去上头的本领,咱们起码还不妨在其余两个场合举行操纵。 ---- 一:在动静的处置本领内里即onchar中,固然结果咱们不复挪用cedit::onchar(nchar, nrepcnt, nflags),而是径直挪用defwindowproc(wm_char,nchar,makelparam (nrepcnt,nflags))。由于从咱们上头的领会不妨领会cedit::onchar(nchar, nrepcnt, nflags)本质上也即是对defwindowproc本领的挪用。 ---- 二:咱们不妨径直重载defwindowproc本领,对message典型即是wm_char的,径直窜改nchar的值即可。 四.总结---- 经过对mfc类库的领会和领会,不只不妨使咱们更好的运用mfc类库,同声,对于咱们本人安排和实行框架和类,无疑也有十分大的扶助。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.