本帖最后由 u013058273 于 2013-12-26 09:04:12 编辑

解决方案 »

  1.   

    BOOL SetWindowPos(          HWND hWnd,
        HWND hWndInsertAfter,
        int X,
        int Y,
        int cx,
        int cy,
        UINT uFlags
    );
    hWndInsertAfter 设为
    HWND_TOPMOST
      

  2.   

    最好通过setower达到目的
    如果窗口类你可控制的话
    也可以响应
    void CVirtualKioskDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
    {
    if( lpwndpos->hwnd == this->m_hWnd )
    {
    lpwndpos->hwndInsertAfter = hwndAwaysOntop;
    lpwndpos->flags |= SWP_NOACTIVATE;
    lpwndpos->flags &= ~SWP_NOZORDER;
    }//#endif
    CHtmlWidget::OnWindowPosChanging(lpwndpos);
    }
      

  3.   

    我用过这个函数了,效果不行。不是说设置ZOrder失败。而是:当我点击下面的窗口,操作系统首先把下面的窗口拖到最前来了,然后我再使用SetWindowPos来调整ZOrder,窗口又走下去了,这样造成了一个闪烁的效果缺陷。(就是说,他们的ZOrder曾经互换过)
    真正的拥有和被拥有的效果,无论你点击上面,或是下面的窗口,他们之间的ZOrder,是不会出现互换的过程的,一直保持上下关系的,不曾互换的。
      

  4.   

    我这里不能用SetOwner,因为,当其中owner窗口销毁,就销毁了owned窗口了。而这两个窗口,本身是兄弟关系,任何一个销毁,都不会导致另一个销毁的。至于你说的OnWindowPosChanging,我不是很懂你的过程做了什么。(而且这个是需要SetOwner吗?)
      

  5.   

    设置HWND_TOPMOST就更加不是我想要的效果了。这样会遮住别人的窗口。
      

  6.   

    所有popup类型的窗口 当它的zorder发生变化时 都会产生一个消息叫做WM_WINDOWPOSCHANGING
    我是假设你用的是MFC CDialog类
    那么你可以用IDE添加对于这个消息的响应函数 然后重写响应函数
    hwndAwaysOntop 指的是 你希望永远位于上边的窗口句柄
    这个操作 无需setowner
      

  7.   

    假设这两个窗口分别为A和B,B始终位于A的前面,那么A处理WM_ACTIVE消息时,判断A是否被激活,如果被激活的话,就调用SetAcitveWindow函数,参数为B窗口的句柄,将B窗口设置为激活状态