1.一种宿主程序与COM组件的图像同步显示的方法,其特征在于,包括步骤:
隐藏宿主程序的子窗口,只显示COM组件的图像;
获取子窗口的图像数据和位置信息;
按照所述图像数据和位置信息,在COM组件图像的相应区域,绘制子窗口的图像,使子窗口的图像与COM组件的图像融合;
获取子窗口的图像数据和位置信息的过程包括:
在COM组件中添加子窗口的注册函数;
通过所述注册函数将子窗口的句柄传递到COM组件内部;
在COM组件内部,通过所述句柄获取子窗口的图像数据和位置信息。
2.根据权利要求1所述的宿主程序与COM组件的图像同步显示的方法,其特征在于,还包括步骤:
当COM组件的图像发生变化时,对COM组件的图像与子窗口的图像进行重绘并融合;
当子窗口的图像发生变化时,重新获取子窗口的图像数据和位置信息,在COM组件内部的相应区域,重绘子窗口的图像,同时重绘COM组件的图像,将重绘后的子窗口图像与COM组件图像重新融合。
3.根据权利要求1或2所述的宿主程序与COM组件的图像同步显示的方法,其特征在于,还包括步骤:
监测COM组件上的鼠标操作;
当鼠标操作落在子窗口所在区域内时,向宿主程序发送鼠标消息,宿主程序重绘子窗口的图像,重新获取子窗口的图像数据和位置信息,在COM组件图像的相应区域,重绘子窗口的图像,同时重绘COM组件的图像;
将子窗口的重绘图像与COM组件的重绘图像重新融合。
4.根据权利要求3所述的宿主程序与COM组件的图像同步显示的方法,其特征在于,当鼠标操作落在子窗口所在区域内,且子窗口的图像变换具有渐变效果时,定时获取子窗口的图像数据,并绘制到COM组件中与COM组件重绘图像融合,直至子窗口的新图像全部绘制出来。
5.一种宿主程序与COM组件的图像同步显示的系统,其特征在于,包括:
子窗口隐藏控制模块,用于隐藏宿主程序的子窗口,只显示COM组件的图像;
子窗口信息获取模块,用于获取子窗口的图像数据和位置信息;
图像融合模块,用于按照所述图像数据和位置信息,在COM组件图像的相应区域,绘制子窗口的图像,使子窗口的图像与COM组件的图像融合;
所述子窗口信息获取模块按照以下过程获取子窗口的图像数据和位置信息:
在COM组件中添加子窗口的注册函数;
通过所述注册函数将子窗口的句柄传递到COM组件内部;
在COM组件内部,通过所述句柄获取子窗口的图像数据和位置信息。
6.根据权利要求5所述的宿主程序与COM组件的图像同步显示的系统,其特征在于,所述图像融合模块,还用于在COM组件的图像发生变化时,对COM组件的图像与子窗口的图像进行重绘并融合;当子窗口的图像发生变化时,重新获取子窗口的图像数据和位置信息,在COM组件内部的相应区域,重绘子窗口的图像,同时重绘COM组件的图像,将重绘后的子窗口图像与COM组件图像重新融合。
7.根据权利要求5或6所述的宿主程序与COM组件的图像同步显示的系统,其特征在于,还包括鼠标监测模块,用于监测COM组件上的鼠标操作,当鼠标操作落在子窗口所在区域内时,向宿主程序发送鼠标消息,宿主程序重绘子窗口的图像,通知图像融合模块重新获取子窗口的图像数据和位置信息;
图像融合模块接收通知并重新获取子窗口的图像数据和位置信息,在COM组件内部的相应区域,重绘子窗口的图像,同时重绘COM组件的图像,将子窗口的重绘图像与COM组件的重绘图像重新融合。
8.根据权利要求7所述的宿主程序与COM组件的图像同步显示的系统,其特征在于,所述图像融合模块在鼠标操作落在子窗口所在区域内,且子窗口的图像变换具有渐变效果时,定时获取子窗口的图像数据,并绘制到COM组件中与COM组件重绘图像融合,直至子窗口的新图像全部绘制出来。
宿主程序与COM组件的图像同步显示的方法与系统\n技术领域\n[0001] 本发明涉及计算机技术领域,特别是涉及一种宿主程序与COM组件的图像同步显示的方法与系统。\n背景技术\n[0002] 在Windows系统的软件开发中,COM组件技术是应用非常普遍和重要的技术。它把功能相同的代码封装为COM组件,这样使用不同编程语言开发的程序就可以很方便的通过调用该组件来实现某个功能,而这类程序就是该COM组件的宿主程序。比如一个地图组件,它的功能是显示电子地图,而宿主程序是C#开发的窗口应用程序,宿主程序使用了地图组件实现了地图相关的功能,同时它还可以创建其它窗口叠加到地图组件之上。这种软件架构是非常常用的设计,可以实现代码重用,把功能相同的模块封装成一个COM组件提供给不同的宿主程序使用。但是如果COM组件和宿主程序都涉及到各自的图像渲染,那么两者之间的图像同步往往是比较困难的。\n[0003] 在GIS领域,宿主程序在地图组件的某个地理位置之上叠加一个展示窗口,该窗口中嵌入了一个3D的演示程序来表现该位置的实际场景。但是这种展示有一个缺陷就是地图组件是允许用户进行地图的平移的,这样由于地理位置的改变,那么叠加在它之上的3D展示窗口的位置也应相应的变化,需要宿主程序对该窗口进行平移,这样地图的平移和宿主程序的窗口平移就存在不同步的现象,地图先移动,之后才是窗口移动,演示效果不佳。\n[0004] 产生这种问题的原因是电子地图是在地图组件中显示,而宿主程序中的演示是在展示窗口中,两者不是在同一个渲染环境中进行,因此出现了绘制显示时间上的差异。为了解决这种问题,传统的做法是在地图平移过程中,不移动而是隐藏窗口,在平移地图结束后再在新位置显示窗口。这种方法规避了平移图像和平移窗口存在的时间差异,但是窗口展示和COM组件中的图像不是同时显示的,没有从根本上解决图像同步的问题。\n发明内容\n[0005] 基于上述情况,本发明提出了一种宿主程序与COM组件的图像同步显示的方法与系统,使得宿主程序子窗口的图像与COM组件的图像达到同步显示的效果,为此,采用的方案如下。\n[0006] 一种宿主程序与COM组件的图像同步显示的方法,包括步骤:\n[0007] 隐藏宿主程序的子窗口,只显示COM组件的图像;\n[0008] 获取子窗口的图像数据和位置信息;\n[0009] 按照所述图像数据和位置信息,在COM组件图像的相应区域,绘制子窗口的图像,使子窗口的图像与COM组件的图像融合。\n[0010] 一种宿主程序与COM组件的图像同步显示的系统,包括:\n[0011] 子窗口隐藏控制模块,用于隐藏宿主程序的子窗口,只显示COM组件的图像;\n[0012] 子窗口信息获取模块,用于获取子窗口的图像数据和位置信息;\n[0013] 图像融合模块,用于按照所述图像数据和位置信息,在COM组件图像的相应区域,绘制子窗口的图像,使子窗口的图像与COM组件的图像融合。\n[0014] 本发明宿主程序与COM组件的图像同步显示的方法与系统,在COM组件内绘制宿主程序子窗口的图像,并将该图像与COM组件的图像融合,从而当鼠标平移COM组件图像时,宿主程序子窗口的图像与COM组件图像同步移动,避免了显示不同步的情况,改善了用户体验。\n附图说明\n[0015] 图1为本发明宿主程序与COM组件的图像同步显示的方法的流程示意图;\n[0016] 图2为本发明宿主程序与COM组件的图像同步显示的方法的一个实施例的流程示意图;\n[0017] 图3为在本发明宿主程序与COM组件的图像同步显示的方法为基础,进行子窗口的管理与控制的流程示意图;\n[0018] 图4为本发明宿主程序与COM组件的图像同步显示的系统的结构示意图。\n具体实施方式\n[0019] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不限定本发明的保护范围。\n[0020] 本发明宿主程序与COM组件的图像同步显示的方法,如图1所示,包括步骤:\n[0021] 步骤s101、隐藏宿主程序的子窗口,只显示COM组件的图像;\n[0022] 步骤s102、获取子窗口的图像数据和位置信息;\n[0023] 步骤s103、按照所述图像数据和位置信息,在COM组件图像的相应区域,绘制子窗口的图像,使子窗口的图像与COM组件的图像融合。\n[0024] 本发明将处于两种渲染环境的图像放到同一渲染环境中,叠加显示成一幅图像,从而作为一个整体响应鼠标平移操作,达到同步移动的效果。下面以一个具体实施例从头至尾详细解释本方法的过程。\n[0025] 假设有一个宿主程序P,它使用了一个显示图像的COM组件,它需要在COM组件的某个位置上叠加显示一个子窗口或者一个应用程序(应用程序也可以理解为一种窗口),并保证在组件进行图像平移过程中,该窗口或者应用程序能同步跟随图像移动。为了实现该目的,执行的操作如图2所示,详细的解释如下文所示。\n[0026] 步骤s201、宿主程序加载COM组件,组件进行它本身的图像绘制,假设该组件绘制区域:左上角为(x0,y0),宽为W,高为H,单位为像素。\n[0027] 步骤s202、宿主程序需要在组件的p位置(x,y)显示一个子窗口WND,该窗口叠加在COM组件之上,宽为w1,高为h1,单位为像素,因此宿主程序创建该窗口,并在该窗口上进行相关的显示,记录该窗口的数据结构为{HWND,x,y,w1,h1},其中HWND是该窗口的句柄。\n[0028] 以上是与传统方法相同的部分,以下是本方法针对传统方法做出的改进。\n[0029] 步骤s203、隐藏WND窗口,这时呈现出来的内容只有COM组件中的图像;\n[0030] 步骤s204、宿主程序进行子窗口的注册。\n[0031] 在COM组件中添加窗口的注册函数,宿主程序可以通过该函数进行窗口的注册:宿主程序获取到将要显示的窗口句柄HWND,并使用注册函数把该值传递到COM内部。例如:注册函数名为RegHostWnd(Long HWnd);\n[0032] 步骤s205、COM组件进行子窗口的注册处理。\n[0033] 在COM内部获取到窗口句柄HWND以后,通过句柄获取到窗口的位置和大小信息:窗口左上角(x,y)以及宽和高,另外通过句柄还获取到窗口DC(Device Context,是GDI内部的一个资料结构)上显示的图像数据,并把该数据拷贝到一个画布(或者内存DC,在此使用WndImageData表示),此时,在COM组件内部记录了该窗口的信息{HWND,x,y,w1,h1,WndImageData}。\n[0034] 步骤s204-s205与步骤S102对应,是为了获取子窗口的相关数据,为在COM组件内的绘制与融合做准备。\n[0035] 步骤s206、COM组件和宿主程序子窗口的图像融合。\n[0036] 首先,在COM组件中进行本身内容的绘制。比如如果是地图COM组件,就先绘制地图。\n[0037] 其次,绘制注册的子窗口:遍历COM组件内部记录,获取到每个已经注册的子窗口信息,把WndImageData数据绘制到{x,y,w1,h1}这个区域上,也就是说实现子窗口的数据和COM组件本身的数据是绘制在同一个渲染环境中(都绘制到COM组件的DC上)。这时候出来的内容包括组件以及子窗口本身的图像。步骤s2011-s206的目的是宿主程序仍然进行子窗口的后台显示(子窗口是隐藏的),同时宿主程序把子窗口的句柄传递给COM组件,在组件内部进行窗口数据的重现。这是本案的一个特点:子窗口在后台显示,子窗口的显示图像在前台组件的渲染环境中显示,保证了呈现出来的整个画面是在同一个渲染环境中绘制的。\n[0038] 步骤s207、处理COM组件的重绘事件,实时更新组件和子窗口的图像融合。\n[0039] 当COM组件发生图像变化的时候会触发重绘,比如在地图组件中进行平移或者其他操作,子窗口图像也应重绘,并与COM组件的重绘图像重新融合。当子窗口的位置发生变化时,需要重新获取子窗口的相关信息,并以新的信息重新绘制,同时COM组件也进行重绘,重绘后的子窗口图像与COM组件的图像再次融合成一幅新的图像。比如:COM组件中显示了一副北京地图,在地图中天安门的位置上显示一个子窗口,窗口中显示的是故宫的3D场景。\n当用户平移地图后,地图位置改变了,这时窗口也需相应的改变位置。因此,使用本方法只需在平移地图过程中,实时绘制子窗口。由于是在同一个渲染环境中绘制,因此地图和子窗口是同步呈现的,不会出现传统方法中的演示中断的问题。\n[0040] 步骤s208、子窗口的管理和控制。\n[0041] 虽然用户看到是子窗口和COM组件本身的显示内容,但实际上子窗口并没有在前台显示出来,本方法是把子窗口的图像和COM组件进行了融合显示。如果子窗口中包含了很多按钮,点击按钮时,子窗口的内容都会发生变化。这是仅仅按照s201-s207的方法是无法正常显示的,因为用户在界面中点击“按钮”时,该按钮并不是真实的子窗口的按钮,而只是COM组件模拟子窗口绘制出来的图像。因此,当用户需要操作子窗口时,本发明继续提供一种子窗口的事件分发控制的方法,如图3所示,包括以下步骤。\n[0042] 步骤s801、当用户在组件上进行鼠标操作时,获取鼠标光标的位置pos(mpx,mpy),原点是组件的左上角,即COM组件的左上角点为(0,0)点;\n[0043] 步骤s802、判断pos是否在某个子窗口内,即判断pos是否在子窗口{x,y,w1,h1}区域内,如果在则获取到该子窗口的信息{HWND,x,y,w1,h1,WndImageData};判断出是否需要对子窗口进行操作。\n[0044] 步骤s803、计算鼠标在子窗口中操作的相对位置。因为pos是相对于COM左上角的,而子窗口的事件位置则是相对于子窗口左上角。因此需要把pos转化为子窗口的相对坐标eventpos。方法是eventpos{pos-x,pos-y};\n[0045] 步骤s804、向子窗口的eventpos位置发送鼠标消息。可以使用SendMessageAPI实现。\n[0046] 步骤s805、隐藏的子窗口接收到该鼠标消息以后,会进行相应的重绘。注意由于子窗口是隐藏的,而COM中显示还是鼠标操作前的子窗口图像,因此需要进行COM的重绘。\n[0047] 步骤s806、在COM中开启一个定时器,比如该定时器的功能是COM组件往子窗口发送鼠标消息的同时每隔一个时间比如2毫秒,通过子窗口的句柄获取一次子窗口的图像,并绘制到COM中。如果子窗口的图像重绘是一个动态的过程,那么在COM中定时绘制子窗口的也能保持这种动态变化的过程。比如子窗口的图像如果是百叶窗效果的,那么利用这种方法在COM中显示的子窗口图像也能具有百叶窗效果。\n[0048] 步骤s807、当子窗口图像显示出来以后,关闭定时器。\n[0049] s209、至此,COM中显示了图像,并且也能控制子窗口。\n[0050] 以上是本发明宿主程序与COM组件的图像同步显示的方法的介绍,下面介绍与上述方法对应的系统,如图4所示,包括以下模块。\n[0051] 子窗口隐藏控制模块,用于隐藏宿主程序的子窗口,只显示COM组件的图像;\n[0052] 子窗口信息获取模块,用于获取子窗口的图像数据和位置信息;\n[0053] 图像融合模块,用于按照所述图像数据和位置信息,在COM组件图像的相应区域,绘制子窗口的图像,使子窗口的图像与COM组件的图像融合。\n[0054] 图像融合模块分别与子窗口隐藏控制模块和子窗口信息获取模块相连,构成本系统。\n[0055] 其中,所述图像融合模块,还可以用于在COM组件的图像发生变化时,对COM组件的图像与子窗口的图像进行重绘并融合;当子窗口的图像发生变化时,重新获取子窗口的图像数据和位置信息,在COM组件内部的相应区域,重绘子窗口的图像,同时重绘COM组件的图像,将重绘后的子窗口图像与COM组件图像重新融合。\n[0056] 作为一个优选的实施例,本系统还可以包括鼠标监测模块,用于监测COM组件上的鼠标操作,当鼠标操作落在子窗口所在区域内时,向宿主程序发送鼠标消息,宿主程序重绘子窗口的图像,通知图像融合模块重新获取子窗口的图像数据和位置信息;图像融合模块接收通知并重新获取子窗口的图像数据和位置信息,在COM组件内部的相应区域,重绘子窗口的图像,同时重绘COM组件的图像,将子窗口的重绘图像与COM组件的重绘图像重新融合。\n[0057] 作为一个优选的实施例,所述子窗口信息获取模块按照以下过程获取子窗口的图像数据和位置信息:\n[0058] 在COM组件中添加子窗口的注册函数;\n[0059] 通过所述注册函数将子窗口的句柄传递到COM组件内部;\n[0060] 在COM组件内部,通过所述句柄获取子窗口的图像数据和位置信息。\n[0061] 作为一个优选的实施例,所述图像融合模块在鼠标操作落在子窗口所在区域内,且子窗口的图像变换具有渐变效果时,定时获取子窗口的图像数据,并绘制到COM组件中与COM组件重绘图像融合,直至子窗口的新图像全部绘制出来。\n[0062] 本发明的方法与系统对比传统技术,有以下优点:\n[0063] 1、实现了子窗口和COM组件的图像同步显示。子窗口在后台显示,而在COM内部获取到子窗口的图像并进行COM自身图像和子窗口图像的融合,解决了子窗口和COM组件内部图像不能同步显示的问题。\n[0064] 2、在图像同步显示的同时,保证了原有子窗口的控制以及显示效果。通过对COM内部鼠标事件的分析计算出是否是子窗口事件,并给子窗口发送控制消息,同时通过定时获取子窗口图像,继承了子窗口的显示效果。\n[0065] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
法律信息
- 2022-05-17
未缴年费专利权终止
IPC(主分类): G06F 9/445
专利号: ZL 201410247926.0
申请日: 2014.06.05
授权公告日: 2017.07.18
- 2018-02-27
专利权人的姓名或者名称、地址的变更
专利权人由广东威创视讯科技股份有限公司变更为威创集团股份有限公司
地址由510670 广东省广州市广州高新技术产业开发区科珠路233号变更为510670 广东省广州市高新技术产业开发区科珠路233号
- 2017-07-18
- 2014-10-22
实质审查的生效
IPC(主分类): G06F 9/445
专利申请号: 201410247926.0
申请日: 2014.06.05
- 2014-09-24
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2013-04-10
|
2012-12-19
| | |
2
| |
2012-06-27
|
2011-12-15
| | |
3
| |
2009-08-12
|
2009-03-02
| | |
4
| |
2012-11-28
|
2012-07-24
| | |
5
| |
2005-12-07
|
2004-07-28
| | |
6
| |
2012-09-12
|
2012-03-28
| | |
7
| |
2012-09-12
|
2012-03-21
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |