经典老有关问题:一个窗口怎么始终保持在另一个窗体之上
经典老问题:一个窗口如何始终保持在另一个窗体之上?
首先有个前提,窗体之间必须是平级的,不是任何形式的父子关系。如果是父子关系的话,那么MDI或者设置子窗体的owner即可实现,但这样的话,“子”窗体停止响应的时候,“父”窗体也跟着死掉了。所以下面描述的主窗体、子窗体的概念仅仅是为了描述方便。
IE就是这种结构,页面窗体和UI主窗体是平级的。
目前的方案:
处理主窗体的WM_WINDOWPOSCHANGING消息,用SetForegroundWindow设置子窗体到顶层(前置)(这个函数好像是异步的,效果最好),然后将WINDOWPOS的hwndInsertAfter设置为子窗体的句柄。这个看起来相对“完美”,点击主窗体上的控件等,都没有太大的问题。
但是,有个无法接受的现实:主窗体根本无法“获得焦点”,比如无法接受任何键盘消息。比如将光标点击在主窗体的文本框,输入,没任何反应。在主窗体上点出一个下拉菜单,之后点击子窗体,主窗体的菜单也不消失,看来又是没有“失去焦点”。
前面说相对完美是因为主窗体上的按钮尽管可以点击,但鼠标移动上去的时候,其工具提示不会显示。这本质上就是无法获得焦点所致。
目前研究这种结构的人应该不少,所以来此请教。
------解决方案--------------------
难道不设置父子关系,窗体A主线程阻塞,窗体B不会死掉?
不都是在主线程中么.除非多线程,窗体在线程中开.
------解决方案--------------------
IE是一个窗口在另一个窗口上,并且还是多进程么?似乎不是吧。
你在什么软件中看到你说的效果了?
如果你说到IE,它使用的是多顶级窗口界面(区别于sdi mdi),Multiple Top Level Windows
你可以Google下。
------解决方案--------------------
你必须确定,如果崩溃或产生不可遇料的结果时,谁负责处理后事,如果父子都确定不了的话,就需要引入一个第三方仲裁机构来处理双方的各种纠纷,都由他来管理.
首先有个前提,窗体之间必须是平级的,不是任何形式的父子关系。如果是父子关系的话,那么MDI或者设置子窗体的owner即可实现,但这样的话,“子”窗体停止响应的时候,“父”窗体也跟着死掉了。所以下面描述的主窗体、子窗体的概念仅仅是为了描述方便。
IE就是这种结构,页面窗体和UI主窗体是平级的。
目前的方案:
处理主窗体的WM_WINDOWPOSCHANGING消息,用SetForegroundWindow设置子窗体到顶层(前置)(这个函数好像是异步的,效果最好),然后将WINDOWPOS的hwndInsertAfter设置为子窗体的句柄。这个看起来相对“完美”,点击主窗体上的控件等,都没有太大的问题。
但是,有个无法接受的现实:主窗体根本无法“获得焦点”,比如无法接受任何键盘消息。比如将光标点击在主窗体的文本框,输入,没任何反应。在主窗体上点出一个下拉菜单,之后点击子窗体,主窗体的菜单也不消失,看来又是没有“失去焦点”。
前面说相对完美是因为主窗体上的按钮尽管可以点击,但鼠标移动上去的时候,其工具提示不会显示。这本质上就是无法获得焦点所致。
目前研究这种结构的人应该不少,所以来此请教。
------解决方案--------------------
难道不设置父子关系,窗体A主线程阻塞,窗体B不会死掉?
不都是在主线程中么.除非多线程,窗体在线程中开.
------解决方案--------------------
IE是一个窗口在另一个窗口上,并且还是多进程么?似乎不是吧。
你在什么软件中看到你说的效果了?
如果你说到IE,它使用的是多顶级窗口界面(区别于sdi mdi),Multiple Top Level Windows
你可以Google下。
------解决方案--------------------
你必须确定,如果崩溃或产生不可遇料的结果时,谁负责处理后事,如果父子都确定不了的话,就需要引入一个第三方仲裁机构来处理双方的各种纠纷,都由他来管理.