基于QT跨平台的重用MFC消息映射代码的方法、设备及介质与流程

专利查询10天前  8


本发明涉及列车信号控制系统,尤其是涉及一种基于qt跨平台的重用mfc消息映射代码的方法、设备及介质。


背景技术:

1、基于信创的需求,既有的在用系统如调度集中系统、联锁系统、ats系统、监测系统等要逐步转移到国产软硬件设备上。国产操作系统是基于linux的,这对在windows平台上基于mfc开发的人机界面程序提出了较大的挑战,需要将既有的mfc程序转换成qt程序,移植的工作量是比较大的。特别的,既有mfc程序和移植后qt程序会在工程上同时部署,都将会有相同功能的维护更新需求。

2、mfc和qt的差别是巨大的,既有mfc程序和移植后qt程序在代码方面将会存在巨大的差别。这对于两者的维护更新是很麻烦的。如果既有mfc程序和移植后的qt程序的差别不是特别大,对软件的维护就很有利。

3、消息映射是mfc程序开发的基本方法,以mfc开发程序必然要使用到消息映射。on_message一般用于程序自定义的消息,这些消息通过windows api函数sendmessage向目标窗口发送,窗口过程接收到消息后再进行响应处理。当基于qt开发时,mfc的这些消息映射宏和sendmessage函数都不能使用。qt的基础是信号和槽函数,信号类似于windows的消息,槽函数类似于mfc的消息响应函数。mfc程序的消息映射要么改造为qt的信号和槽函数,要么直接使用c++的函数调用。如果采用c++函数调用方式,调用时需要具体的类而失去了抽象的特征,或者是抽象类定义虚函数而导致抽象类特别臃肿。如果采用信号和槽函数方式,不但要设计信号,还要在恰当的时机对信号和槽函数进行连接。这些都会带来比较大的代码变动。

4、如果既有的mfc程序不再维护,采用qt的信号和槽函数方式是可行的方案。然而mfc程序因为有大量既有工程应用是需要持续维护的,新移植的qt程序也是需要持续维护的,两个程序的代码差别越大,维护的难度和工作量就越大。

5、cn115914330a公开了一种基于nio异步线程模型的异构应用间通信方法,针对大型集成信息系统中应用软件跨语言开发,跨操作系统,且应用间需要针对不同业务场景需求进行实时通信的特点,结合了现有的通信协议与技术,提供了一种高效的应用间通信模型,为应用层提供了点对点,订阅发布,共享内存等多种通信方式。但是,其仅仅是跨平台的通信方法,并未给出跨平台程序移植的方案。


技术实现思路

1、本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种基于qt跨平台的重用mfc消息映射代码的方法、设备及介质,重用既有mfc程序的消息映射相关的代码,减少移植时的代码修改量,维持既有程序结构,提高同一功能的mfc程序和qt程序的相同代码段。

2、本发明的目的可以通过以下技术方案来实现:

3、根据本发明的第一方面,提供了一种基于qt跨平台的重用mfc消息映射代码的方法,该方法在将mfc程序移植到qt中时,保留mfc程序中与消息映射、消息响应和消息发送相关的代码,减少移植过程中的代码变动,包括以下步骤:

4、基于qt定义mfc消息映射相关的数据类型、函数指针类型;

5、基于qt定义新的事件类型wsmevent及其类型值;

6、基于qt定义消息发送函数,将消息内容封装到新定义的事件类型wsmevent中,并通过消息发送函数发送到目标;

7、定义事件处理函数,当事件处理函数收到qevent类型事件数据时,根据qevent类型事件的类型值判断并转换为wsmevent事件类型;

8、事件处理函数从wsmevent事件中取出消息id和消息参数数据,根据目标类的消息映射表查找消息id的匹配信息,即消息映射条目,获得消息映射条目中的消息响应函数;调用消息响应函数处理消息参数数据,返回处理结果,并将处理结果记录到wsmevent事件中;

9、基于消息发送函数将wsmevent事件中记录的处理结果返回给调用者;

10、改造mfc中的宏begin_message_map,使之与qt平台匹配,使得消息映射相关的宏declare_messagae_map、begin_message_map、end_message_map、on_message在qt仍能使用;

11、新增宏wm_decl_wndmsg、wm_impl_wndmsg,将事件处理相关的函数的声明和实现封装到宏代码中,使得事件处理函数的代码模式化。

12、作为优选的技术方案,所述的事件类型wsmevent的类型值与其它事件类型的类型值不重复,且按qt开发规则该类型值介于qevent::user=1000和qevent::maxuser=65535之间,一般可采用在qevent::user的基础上加一个预设的数值确定,或者调用qt的registereventtype函数返回一个类型值。

13、作为优选的技术方案,所述的事件类型wsmevent中定义有消息id、消息参数wparam和lparam、以及用于存储处理结果的成员变量lresult,其中,所述消息id、wparam、lparam的类型分别为uint、wparam、lparam,lresult的类型为lresult;所述的基于qt定义mfc消息映射相关的数据类型包括但不限于uint、wparam、lparam、lresult。

14、作为优选的技术方案,所述的事件处理函数是customevent虚函数,事件处理函数将wsmevent中的消息id、wparam、lparam数据传给消息处理函数,基于消息映射表查找消息响应函数然后调用消息响应函数并将消息响应函数的返回值存储到wsmevent的成员变量lresult中。

15、作为优选的技术方案,所述的消息处理函数从最终类的消息映射表开始查找消息响应函数,如果在当前层级的消息映射表中没有找到响应的消息响应函数,则继续在上一层级的消息映射表中查找,直至根层级消息映射表。

16、作为优选的技术方案,所述的消息映射表由afx_msgmap结构描述,包括上一层次或父类层次消息映射表的获取函数指针pfngetbasemap和消息映射条目数组,afx_msgmap保留mfc原有的形式和语义,消息映射表afx_msgmap数据由declare_message_map声明,由begin_message_map、end_message_map展开后设置数据。

17、作为优选的技术方案,所述的消息映射表通过调用函数指针pfngetbasemap获得上一层次的消息映射表,当pfngetbasemap为空指针时表示为根消息映射表。消息映射表afx_msgmap中的pfngetbasemap数据由begin_message_map展开后设置。

18、作为优选的技术方案,所述的消息处理函数通过afxfindmessageentry函数在消息映射条目数组中进行遍历查找消息响应函数,afxfindmessageentry保留mfc原有的形式和语义。

19、作为优选的技术方案,所述的消息映射条目中包括消息id、消息响应函数及其它必要的数据,由afx_msgmap_entry结构描述,该结构由on_message宏展开后在消息映射表中生成,afx_msgmap_entry和on_message保留mfc原有的形式和语义。

20、作为优选的技术方案,所述的调用消息响应函数具体为在消息处理函数查找到消息映射条目时,对消息映射条目中的响应函数指针进行类函数调用,并且将获得的消息参数wparam、lparam数据作为响应函数调用的参数。

21、作为优选的技术方案,所述的改造mfc中的宏begin_message_map是对mfc中的宏定义作适当修改使得消息映射相关的宏与qt平台匹配,具体为:begin_message_map的第二个参数是第一个参数的基类,当第二个参数是qt中的类时则将第二个参数改为与第一个参数相同,否则,保持其第二个参数和mfc程序中的参数一致。

22、作为优选的技术方案,所述的改造mfc中的宏begin_message_map,通过第二个参数与第一个参数是否相同来设置消息映射表afx_msgmap中的pfngetbasemap数据,当两个参数相同时pfngetbasemap置为空函数指针,否则pfngetbasemap指向第二个参数所声明的类的消息映射表的获取函数,即获取父类或上一层次消息映射表的函数。

23、作为优选的技术方案,所述的新增宏wm_decl_wndmsg用于展开事件处理函数的声明,新增宏wm_impl_wndmsg用于展开事件处理函数的实现。

24、作为优选的技术方案,所述的end_message_map、declare_message_map、on_message宏保留原有的mfc形式和语义。

25、作为优选的技术方案,根据应用的目标类类型进行不同处理,所述目标类类型包括消息映射最基类和消息映射继承类,所述的消息映射最基类是指具备消息映射机制或功能的最开始的类,此类之上的所有基类都不具备消息映射机制或功能;所述的消息映射继承类是指此类之上的某个直接基类或间接基类具备了消息映射机制或功能,此类也因此而具备消息映射机制或功能的类,消息映射继承类泛指消息映射最基类的所有继承类;判定一个类为消息映射最基类的方法是,此类的直接基类是qt中的类,且在mfc原程序中此类的直接基类是mfc中的类。

26、作为优选的技术方案,所述方法应用到消息映射继承类时,移植既有mfc程序的头文件和cpp文件,与消息映射相关代码保持mfc程序原样;方法应用到消息映射最基类时,移植既有mfc程序的头文件,在类定义中增加wm_decl_wndmsg宏应用;移植既有mfc程序的cpp文件,增加wm_impl_wndmsg宏应用,并且修改begin_message_map的第二个参数使其与第一个参数相同。

27、根据本发明的第二方面,提供了一种电子设备,包括存储器和处理器,所述存储器上存储有计算机程序,所述处理器执行所述程序时实现所述的方法。

28、根据本发明的第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现所述的方法。

29、与现有技术相比,本发明具有以下有益效果:

30、1、消息映射机制是mfc的基础技术,基于mfc开发的软件都存在着大量的消息映射代码,转换这些消息映射代码会带来大量的移植工作量。本发明以qt技术为基础,实现了mfc的消息映射机制,使得既有代码的消息映射部分可以重用,在将layoutx(mfc程序)移植到qt时,可以保留layoutx代码中与消息映射、消息响应和消息发送相关的代码,使得layoutx代码移植时变动较小。

31、2、本发明的基于qt的消息映射机制保留了原mfc程序代码的declare_message_map宏,原mfc程序头文件中与on_messag相关的函数都可以保留和重用。

32、3、本发明的基于qt的消息映射机制保留了原mfc程序代码的begin_message_map和end_message_map宏,仅对begin_message_map宏的第二个参数作了极小的修正:当本类是消息映射最基类,或者说本类的父类是qt框架类时,第二个参数与第一个参数相同。与既有mfc程序代码相比,仅一处修改,代码重用度高。

33、4、本发明的基于qt的消息映射机制保留了原mfc程序代码的on_message宏,这样begin_message_map和end_message_map之间的大量on_message相关的代码得以保留和重用。

34、5、本发明的基于qt的消息映射机制要求消息映射最基类在使用decalre_message_map的同时也使用wm_decl_wndmsg宏,新增的代码量小,代码重用度高。

35、6、本发明的基于qt的消息映射机制对于消息映射继承类不要求使用wm_decl_wndmsg宏,这使得消息映射继承类的头文件差异性小,代码重用度高。

36、7、本发明的基于qt的消息映射机制要求消息映射最基类在使用begin_message_map的同时也使用wm_impl_wndmsg宏,wm_impl_wndmsg的第二个参数为其c++基类,即qt框架中的类。

37、8、本发明的基于qt的消息映射机制对于消息映射继承类不要求使用wm_impl_wndmsg宏,这使得消息映射继承类的cpp文件差异性小,代码重用度高。

38、9、本发明避免了用qt的信号槽机制去重构既有应用的on_message相关函数。qt的信号槽机制要求在运行期对信号、槽、信号对象、槽对象做显示连接,连接的时机选择要恰当。基于qt的消息映射机制隐藏在代码的宏结构中,在进入main函数之前就建立了消息映射的结构,不需要关心连接的的时机,从而移植工作量小。

39、10、本发明的基于qt的消息映射机制使得既有程序与消息映射相关的代码相同度非常高,基于mfc和qt维护两套代码、新增功能时都将会有极大的便捷性。


技术特征:

1.一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,该方法在将mfc程序移植到qt中时,保留mfc程序中与消息映射、消息响应和消息发送相关的代码,减少移植过程中的代码变动,包括以下步骤:

2.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的事件类型wsmevent的类型值与其它事件类型的类型值不重复,且按qt开发规则该类型值介于qevent::user=1000和qevent::maxuser=65535之间,采用在qevent::user的基础上加一个预设的数值来确定,或者调用qt的registereventtype函数返回一个类型值。

3.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的事件类型wsmevent中定义有消息id、消息参数wparam和lparam、以及用于存储处理结果的成员变量lresult,其中,所述消息id、wparam、lparam的类型分别为uint、wparam、lparam,lresult的类型为lresult;所述的mfc消息映射相关的数据类型包括但不限于uint、wparam、lparam、lresult。

4.根据权利要求3所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的事件处理函数是customevent虚函数,事件处理函数将wsmevent中的消息id、wparam、lparam数据传给消息处理函数,消息处理函数基于消息映射表查找消息响应函数进行消息处理并将消息处理的返回值存储到wsmevent的成员变量lresult中。

5.根据权利要求4所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的消息处理函数从最终类的消息映射表开始查找消息响应函数,如果在当前层级的消息映射表中没有找到响应的消息响应函数,则继续在上一层级的消息映射表中查找,直至根层级消息映射表。

6.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的消息映射表由afx_msgmap结构描述,包括获得上一层次或父类层次消息映射表的函数指针pfngetbasemap和消息映射条目数组;afx_msgmap保留mfc原有的形式和语义,消息映射表afx_msgmap数据由declare_message_map声明,由begin_message_map、end_message_map展开后设置数据。

7.根据权利要求5或6所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的消息映射表通过调用函数指针pfngetbasemap获得上一层次的消息映射表,当pfngetbasemap为空指针时表示为根消息映射表,消息映射表afx_msgmap中的pfngetbasemap数据由begin_message_map展开后设置。

8.根据权利要求5或6所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的消息处理函数通过afxfindmessageentry函数在消息映射条目数组中进行遍历查找消息响应函数,afxfindmessageentry保留mfc原有的形式和语义。

9.根据权利要求1、5或6所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的消息映射条目中包括消息id、消息响应函数及其它必要的数据,由afx_msgmap_entry结构描述,该结构由on_message宏展开后在消息映射表中生成,afx_msgmap_entry、on_message保留mfc原有的形式和语义。

10.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的调用消息响应函数具体为在消息处理函数查找到消息映射条目时,对消息映射条目中的响应函数指针进行类函数调用,并且将获得的消息参数wparam、lparam数据作为响应函数调用的参数。

11.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的改造mfc中的宏begin_message_map是对mfc中的宏定义作适当修改使得消息映射相关的宏与qt平台匹配,具体为:begin_message_map的第二个参数是第一个参数的基类,当第二个参数是qt中的类时则将第二个参数改为与第一个参数相同,否则,保持其第二个参数和mfc程序中的参数一致。

12.根据权利要求11所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的改造mfc中的宏begin_message_map,通过第二个参数与第一个参数是否相同来设置消息映射表afx_msgmap中的pfngetbasemap数据,当两个参数相同时pfngetbasemap置为空函数指针,否则pfngetbasemap指向第二个参数所声明的类的消息映射表的获取函数,即父类或上一层次消息映射表的获取函数的指针。

13.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的新增宏wm_decl_wndmsg用于展开事件处理函数的声明,新增宏wm_impl_wndmsg用于展开事件处理函数的实现。

14.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的end_message_map、declare_message_map、on_message宏保留原有的mfc形式和语义。

15.根据权利要求1所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述的事件处理函数的代码模式化是指方法在进行应用时,使用已定义的消息映射相关宏来实现消息机制,达到重用mfc消息映射代码的目的;在应用已定义的消息映射相关宏时,根据应用的目标类类型进行不同处理,所述目标类类型包括消息映射最基类和消息映射继承类,所述的消息映射最基类是指具备消息映射机制或功能的最开始的类,此类之上的所有基类都不具备消息映射机制或功能;所述的消息映射继承类是指此类之上的某个直接基类或间接基类具备了消息映射机制或功能,此类也因此而具备消息映射机制或功能的类,消息映射继承类泛指消息映射最基类的所有继承类;判定一个类为消息映射最基类的方法是,此类的直接基类是qt中的类,且在mfc原程序中此类的直接基类是mfc中的类。

16.根据权利要求15所述的一种基于qt跨平台的重用mfc消息映射代码的方法,其特征在于,所述方法应用到消息映射继承类时,移植既有mfc程序的头文件和cpp文件,与消息映射相关代码保持mfc程序原样;方法应用到消息映射最基类时,移植既有mfc程序的头文件,在类定义中增加wm_decl_wndmsg宏应用;移植既有mfc程序的cpp文件,增加wm_impl_wndmsg宏应用,并且修改begin_message_map的第二个参数使其与第一个参数相同。

17.一种电子设备,包括存储器和处理器,所述存储器上存储有计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1~16中任一项所述的方法。

18.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1~16中任一项所述的方法。


技术总结
本发明涉及一种基于QT跨平台的重用MFC消息映射代码的方法、设备及介质,其中方法包括以下步骤:基于QT定义MFC消息映射相关的数据类型、函数指针类型以及新的事件类型及其类型值;定义消息发送函数,将消息内容封装到新定义的事件类型中,并通过消息发送函数发送到目标;定义事件处理函数,当事件处理函数根据QEvent类型事件的类型值判断并转换新的事件类型,取出事件中的消息ID和消息参数数据,根据目标类的消息映射表查找消息ID的消息映射条目,获得消息响应函数;调用消息响应函数处理消息参数数据,返回处理结果并存到事件中;基于消息发送函数将处理结果返回给调用者;改造MFC中的宏BEGIN_MESSAGE_MAP,使之与QT平台匹配,使得消息映射相关的宏在QT仍能使用;新增宏WM_DECL_WNDMSG、WM_IMPL_WNDMSG,将事件处理相关函数的声明和实现封装到宏代码中,使得事件处理函数的代码模式化。与现有技术相比,本发明重用既有MFC程序的消息映射相关的代码,减少移植时的代码修改量,提高了工作效率。

技术研发人员:王曙光,赵翠云,张奇峰,陈钰,胡琰瑜,陈宣,杨辉,张广宇
受保护的技术使用者:卡斯柯信号有限公司
技术研发日:
技术公布日:2024/12/5

最新回复(0)