一种实现多个窗口同步移动的方法和装置与流程

文档序号:12176049阅读:1083来源:国知局
一种实现多个窗口同步移动的方法和装置与流程

本发明涉及Windows平台下界面开发技术领域,尤其涉及一种实现多个窗口同步移动的方法和装置。



背景技术:

在客户端界面程序中,经常需要处理多个弹出式窗口之间跟随移动的场景,比如鼠标拖动主界面窗口时,主界面上弹出的一个气泡提示窗口也需要跟着主界面窗口一起移动,保证气泡总是指向主界面窗口上的同一位置。

目前实现窗口跟随的一般有下面这两种方式:

宿主窗口响应位置改变事件:在宿主窗口中,响应自己的位置改变、大小改变事件,修改跟随窗口的位置和大小。这种实现方式不能通用,如果存在多个宿主窗口,则需要在每一个宿主窗口中添加相应的代码逻辑。该方法是在得到宿主窗口的移动事件后,再让跟随窗口进行跟随移动的。因此宿主窗口的移动和跟随窗口的移动之间存在一些的时间差,导致两者之间的移动不同步。

使用Hook拦截宿主窗口的位置改变事件:通过Windows Hook技术,拦截宿主窗口的位置改变事件,将这个事件通知给所有的跟随窗口,由跟随窗口完成自己的跟随移动逻辑。由于涉及到Hook,使得该方式比较复杂,容易出错,性能上也比单独处理宿主窗口消息的方式低,并且依然存在窗口之间的跟随不同步的问题。



技术实现要素:

本发明提供了一种实现多个窗口同步移动的方法和装置,以克服上述方法的不足,实现多个窗口没有时间差的同步移动。

依据本发明的一个方面,本发明提供了一种实现多个窗口同步移动的方法,该方法包括:

在宿主窗口移动或改变大小时,宿主窗口收到窗口正在改变的消息,所述消息中包括宿主窗口的新位置参数;

判断所述宿主窗口的跟随窗口列表中的跟随窗口数量是否为0,所述跟随列表中包括每个跟随窗口对应的跟随参数;

如果不为0,则改变所述窗口正在改变的消息的参数,阻止所述宿主窗口本次的位置改变;

根据所述宿主窗口的新位置参数计算所述宿主窗口的新位置和根据所述跟随窗口列表中每个跟随窗口的跟随参数计算所述每个跟随窗口的新位置;

开启多窗口同步移动操作,根据计算出的所述宿主窗口的新位置和所述跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动。

其中,所述方法还包括:判断所述宿主窗口的跟随窗口列表中的跟随窗口数量如果为0,则进行所述宿主窗口本次的位置改变。

其中,所述在宿主窗口移动或改变大小之前,所述方法还包括:

所述宿主窗口接收跟随窗口发送的注册消息,所述注册消息中携带所述跟随窗口的跟随参数;

所述宿主窗口将所述跟随窗口添加到跟随窗口列表中,并保存该跟随窗口的跟随参数。

其中,所述改变所述窗口正在改变的消息的参数,阻止所述宿主窗口本次的位置改变包括:

在所述窗口正在改变的消息中强制添加两个参数,一个为表示拒绝宿主窗口本次的位置修改的参数,另一个为表示拒绝宿主窗口本次的大小修改的参数,通过该两个参数阻止所述宿主窗口本次的位置改变。

其中,所述宿主窗口开启多窗口同步移动操作,根据计算出的所述宿主窗口的新位置和所述跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动包括:

所述宿主窗口计算出自己即将移动到的新位置,并计算出所述跟随窗口列表中的跟随窗口数量,开启多窗口同步移动操作;

遍历所述跟随窗口列表,计算每个跟随窗口的新位置,将每个跟随窗口和所述宿主窗口加入到所述多窗口同步移动操作中;

所述宿主窗口计算出自己最终移动到的新位置,完成所有窗口的同步移动操作。

依据本发明的另一方面,本发明提供了一种实现多个窗口同步移动的装置,该装置包括:

消息接收单元,用于在宿主窗口移动或改变大小时,宿主窗口收到窗口正在改变的消息,所述消息中包括宿主窗口的新位置参数;

跟随窗口数量判断单元,用于判断所述宿主窗口的跟随窗口列表中的跟随窗口数量是否为0,所述跟随列表中包括每个跟随窗口对应的跟随参数;;

移动处理单元,用于在跟随窗口数量不为0时,则改变所述窗口正在改变的消息的参数,阻止所述宿主窗口本次的位置改变;

多窗口同步移动单元,用于根据所述宿主窗口的新位置参数计算所述宿主窗口的新位置和根据所述跟随窗口列表中每个跟随窗口的跟随参数计算所述每个跟随窗口的新位置;以及开启多窗口同步移动操作,根据计算出的所述宿主窗口的新位置和所述跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动。

其中,所述移动处理单元,还用于在跟随窗口数量为0时,进行所述宿主窗口本次的位置改变。

其中,所述装置还包括:

跟随窗口注册单元,用于所述宿主窗口接收跟随窗口发送的注册消息,所述注册消息中携带所述跟随窗口的跟随参数;所述宿主窗口将所述跟随窗口添加到跟随窗口列表中,并保存该跟随窗口的跟随参数。

其中,所述移动处理单元具体用于,在所述窗口正在改变的消息中强制添加两个参数,一个为表示拒绝宿主窗口本次的位置修改的参数,另一个为 表示拒绝宿主窗口本次的大小修改的参数,通过该两个参数阻止所述宿主窗口本次的位置改变。

其中,所述多窗口同步移动单元包括:

同步移动开启模块,用于所述宿主窗口计算出自己即将移动到的新位置,并计算出所述跟随窗口列表中的跟随窗口数量,开启多窗口同步移动操作;

同步移动操作模块,用于遍历所述跟随窗口列表,计算每个跟随窗口的新位置,将每个跟随窗口和所述宿主窗口加入到所述多窗口同步移动操作中;

同步移动结束模块,用于所述宿主窗口计算出自己最终移动到的新位置,完成所有窗口的同步移动操作。

本发明实施例的有益效果是:本发明提供的实现多个窗口同步移动的方法和装置,当宿主窗口收到窗口正在改变的消息时,通过判断其跟随窗口列表中的跟随窗口数量是否为0判定本次是单个窗口的移动还是多个窗口的移动,若是多个窗口的移动,因为需要实现多个窗口的同步移动,所以不能让宿主窗口单独先完成或后完成自己的移动,则通过修改该窗口正在改变的消息的参数来阻止宿主窗口本次的位置改变;之后由宿主窗口开启多窗口同步移动操作,根据计算出的宿主窗口的新位置和跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动,由于该同步移动是将所有的窗口统一同时更新位置,所以不存在时间差,由此解决了现有技术中窗口之间的跟随不同步的问题。

附图说明

图1为本发明提供的一种实现多个窗口同步移动的方法流程图;

图2是本发明提供的实现多个窗口同步移动的方法的一个具体流程图;

图3是本发明提供的实现多个窗口同步移动的装置的结构示意图;

图4是本发明提供的实现多个窗口同步移动的装置中所述多窗口同步移动单元的结构示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。

本发明提供了一种实现多个窗口同步移动的方法和装置,以克服现有多窗口移动方案中各窗口之间移动存在时间差的问题,能够实现所有窗口的同步移动。

本发明的整体思路是:要实现多个窗口的同步移动,则应该将这些窗口作为一个整体进行移动,而不能在宿主窗口移动后,再依次移动各个跟随窗口。在Windows操作系统中,一个窗口位置改变的过程会触发以下一些消息:

WM_MOVING窗口正在移动

WM_SIZING窗口正在改变大小

WM_WINDOWPOSCHANGING窗口正在移动/改变大小

WM_WINDOWPOSCHANGED窗口已移动/改变大小

WM_MOVE窗口已移动

WM_SIZE窗口已改变大小。

其中,WM_MOVING消息在窗口移动时触发,WM_SIZING消息在窗口改变大小时触发,WM_MOVE消息与WM_SIZE消息在窗口已经移动/改变大小后触发,而WM_WINDOWPOSCHANGED消息是在窗口移动/改变大小后触发,因此WM_WINDOWPOSCHANGING消息最适合用于窗口同步移动。

在窗口正在移动/改变大小WM_WINDOWPOSCHANGING消息中,通过修改其参数可以阻止窗口的本次调整。暂时阻止宿主窗口的本次改变之后,再由宿主窗口调用DeferWindowPos系列API的方法实现拖动一个窗口,多个窗口同步移动,完成宿主窗口和跟随窗口的同步移动。

图1为本发明提供的一种实现多个窗口同步移动的方法流程图。

步骤S10:在宿主窗口移动或改变大小时,宿主窗口收到窗口正在改变的消息,所述消息中包括宿主窗口的新位置参数;

步骤S20:判断所述宿主窗口的跟随窗口列表中的跟随窗口数量是否为 0,所述跟随列表中包括每个跟随窗口对应的跟随参数;

步骤S30:如果不为0,则改变所述窗口正在改变的消息的参数,阻止所述宿主窗口本次的位置改变;

步骤S40:根据所述宿主窗口的新位置参数计算所述宿主窗口的新位置和根据所述跟随窗口列表中每个跟随窗口的跟随参数计算所述每个跟随窗口的新位置;

步骤S50:开启多窗口同步移动操作,根据计算出的所述宿主窗口的新位置和所述跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动。

本发明提供的实现多个窗口同步移动的方法,当宿主窗口收到窗口正在改变的消息时,通过判断其跟随窗口列表中的跟随窗口数量是否为0判定本次是单个窗口的移动还是多个窗口的移动,若是多个窗口的移动,因为需要实现多个窗口的同步移动,所以不能让宿主窗口单独先完成或后完成自己的移动,则通过修改该窗口正在改变的消息的参数来阻止宿主窗口本次的位置改变;之后由宿主窗口开启多窗口同步移动操作,根据计算出的宿主窗口的新位置和跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动,由于该同步移动是将所有的窗口统一同时更新位置,所以不存在时间差,由此解决了现有技术中窗口之间的跟随不同步的问题。

图2是本发明提供的实现多个窗口同步移动的方法的一个具体流程图。参见图2,该方法包括:

步骤S101:宿主窗口初始化。

步骤S102:跟随窗口计算出自己的跟随参数之后,向所述宿主窗口发送注册消息进行注册,所述宿主窗口将所述跟随窗口添加到跟随列表中,保存其跟随参数,并根据这些参数来调整该跟随窗口的位置与大小。

跟随参数主要用于标识跟随窗口在宿主窗口上的位置,包括:左对齐、右对齐、上对齐、下对齐、跟随窗口的宽度、跟随窗口的高度等。例如一个窗口上的气泡跟随参数可以设置为:(右对齐20px,上对齐20px,宽度200px, 高度50px),表示该气泡的位置总是位于距离窗口右侧20像素,距离窗口顶部20像素的地方,并且该气泡的大小固定为200像素宽,50像素高。

步骤S103:用鼠标拖动窗口,移动所述宿主窗口或改变所述宿主窗口大小。

步骤S104:所述宿主窗口收到窗口正在改变的消息:窗口正在改变的消息为WM_WINDOWPOSCHANGING,在该消息中包括宿主窗口的新位置参数。

步骤S105:判断跟随窗口列表数量,如果为0,判断没有跟随窗口则转到步骤S100,对WM_WINDOWPOSCHANGING消息不处理,交由系统继续完成本次宿主窗口的位置改变,之后结束操作;如果不为0,判断有跟随窗口则执行步骤S106。

步骤S106:所述宿主窗口从收到的WM_WINDOWPOSCHANGING消息中计算出自己即将移动到的新位置。

步骤S107:所述宿主窗口为所述WM_WINDOWPOSCHANGING消息强制添加两个参数:SWP_NOMOVE、SWP_NOSIZE,其中SWP_NOMOVE表示拒绝窗口本次的位置修改,SWP_NOSIZE表示拒绝窗口本次的大小修改,以阻止所述宿主窗口本次的位置改变。之后执行步骤S108。

在Windows操作系统中,修改窗口位置或大小的方法主要包含:

MoveWndow、SetWindowPos、BeginDeferWindowPos/DeferWindowPos/EndDefWindowPos等。

MoveWindow和SetWindowPos主要是针对单个窗口的调整,而DeferWindowPos系列函数则是针对一组窗口的调整,即批量调整。本发明使用的就是DeferWindowPos系列函数来达到宿主窗口和所有跟随窗口同步移动。

步骤S108:所述宿主窗口开启多窗口同步移动操作,计算出所述跟随窗口列表中的跟随窗口数量,记为count,调用BeginDeferWindowPos(count+1),表明将有count+1个窗口将要调整位置,+1表示宿主窗口也同步移动。之后 执行步骤S109。

步骤S109:所述宿主窗口遍历跟随窗口列表,判断所述跟随窗口列表中是否有未被读取的跟随窗口记录,若是,则读取该条记录,并执行步骤S110;否则,执行步骤S112。

步骤S110:根据所述宿主窗口的新位置和该跟随窗口的跟随参数,计算出该跟随窗口的新位置。

步骤S111:为该跟随窗口调用DeferWindowPos,将该跟随窗口加入到所述多窗口同步移动操作中;并返回步骤S109继续读取下一条跟随窗口记录。

步骤S112:所述宿主窗口调用DeferWindowPos,将自己也加入到所述多窗口同步移动操作中。

步骤S113:所述宿主窗口从收到的WM_WINDOWPOSCHANGED消息计算出自己最终移动到的新位置,调用EndDeferWindowPos,完成所有窗口的同步移动操作。

至此就完成了所有跟随窗口对宿主窗口的同步移动。

图3是本发明提供的实现多个窗口同步移动的装置的结构示意图;图4是本发明提供的实现多个窗口同步移动的装置中所述多窗口同步移动单元的结构示意图。参见图3、图4,该装置包括:

消息接收单元200,用于在宿主窗口移动或改变大小时,宿主窗口收到窗口正在改变的消息,所述消息中包括宿主窗口的新位置参数;

跟随窗口数量判断单元210,用于判断所述宿主窗口的跟随窗口列表中跟随窗口数量是否为0,所述跟随列表中包括每个跟随窗口对应的跟随参数;

移动处理单元220,用于在在跟随窗口数量不为0时,改变所述窗口正在改变的消息的参数,以阻止所述宿主窗口本次的位置改变;

多窗口同步移动单元230,用于根据所述宿主窗口的新位置参数计算所述宿主窗口的新位置和根据所述跟随窗口列表中每个跟随窗口的跟随参数计 算所述每个跟随窗口的新位置;以及开启多窗口同步移动操作,根据计算出的所述宿主窗口的新位置和所述跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动。

其中,所述移动处理单元220,还用于在跟随窗口数量为0时,进行所述宿主窗口本次的位置改变。

其中,所述装置还包括:

跟随窗口注册单元240,用于所述宿主窗口接收跟随窗口发送的注册消息,所述注册消息中携带所述跟随窗口的跟随参数;所述宿主窗口将所述跟随窗口添加到跟随窗口列表中,并保存该跟随窗口的跟随参数。

所述宿主窗口根据跟随窗口的跟随参数调整该跟随窗口的位置与大小。

其中,所述移动处理单元220具体用于,所述窗口正在改变的消息为WM_WINDOWPOSCHANGING消息,在跟随窗口数量不为0时,所述宿主窗口为所述WM_WINDOWPOSCHANGING消息强制添加两个标记:

SWP_NOMOVE、SWP_NOSIZE,其中SWP_NOMOVE表示拒绝宿主窗口本次的位置修改,SWP_NOSIZE表示拒绝宿主窗口本次的大小修改,以阻止所述宿主窗口本次的位置改变。

其中,参见图4,所述多窗口同步移动单元230包括:

同步移动开启模块310,用于所述宿主窗口计算出自己即将移动到的新位置,并计算出所述跟随窗口列表中的跟随窗口数量,记为count,调用BeginDeferWindowPos(count+1),开启多窗口同步移动操作;

同步移动操作模块320,用于所述宿主窗口遍历所述跟随窗口列表,根据所述宿主窗口的新位置和每个跟随窗口的跟随参数,计算出该跟随窗口的新位置,为该跟随窗口调用DeferWindowPos,将该跟随窗口加入到所述多窗口同步移动操作中;所述宿主窗口调用DeferWindowPos,将自己也加入到所述多窗口同步移动操作中;

同步移动结束模块330,用于所述宿主窗口计算出自己最终移动到的新位置,调用EndDeferWindowPos,完成所有窗口的同步移动操作。

其中,所述宿主窗口从收到的WM_WINDOWPOSCHANGING消息中计算出自己即将移动到的新位置,从收到的WM_WINDOWPOSCHANGED消息计算出自己最终移动到的新位置。

综上所述,本发明提供的一种实现多个窗口同步移动的方法和装置,当宿主窗口收到窗口正在改变的消息时,通过判断跟随窗口列表中的跟随窗口数量是否为0判定本次是单个窗口的移动还是多个窗口的移动,若是多个窗口的移动,因为需要实现多个窗口的同步移动,所以不能让宿主窗口单独先完成或后完成自己的移动,则通过修改该窗口正在改变的消息的参数来阻止宿主窗口本次的位置改变;之后由宿主窗口开启多窗口同步移动操作,根据计算出的宿主窗口的新位置和跟随窗口列表中每个跟随窗口的新位置,完成所有窗口的同步移动,由于该同步移动是将所有的窗口统一同时更新位置,所以不存在时间差,由此解决了现有技术中窗口之间的跟随不同步的问题。

本发明实施例首先通过修改WM_WINDOWPOSCHANGING的参数,阻止宿主窗口的位置改变,之后通过DeferWindowPos系列API实现拖动一个窗口,多个窗口的同步移动的效果,解决了时间差的问题,实现了所有窗口同时更新位置。可以预期的是,通过扩展跟随参数、监听宿主窗口或跟随窗口的位置移动范围可以实现更复杂的跟随逻辑,例如跟随窗口在某些情况下禁止跟随、窗口磁性吸附、磁性分离等。

以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1