在一个对话框程序中,我用Create动态创建了A、B、C三个子窗口。我想问的是:
1. 窗口显示时如何实现让A窗口始终保持显示在B窗口之上,让B窗口始终保持显示在C窗口之上?(30分)
2. 并且即使我用鼠标单击下层的窗口,它也仍旧保持原来的Z轴顺序不变?(20分)

解决方案 »

  1.   

    用模式对话框的方式调用(先动态创建ABC窗口,A中控制B的显示B中控制C的显示)
      

  2.   

    用SetWindowPos,子对话框就跑到所有窗口的前面了,也包括其它程序的窗口,那不是要出笑话啦???
      

  3.   

    用过了, SetForegroundWindow只能保证让一个子窗口在前,我这有多个子窗口~~
      

  4.   

    关于操作窗口的api函数我还没完全理解好其性能,最近也烦,不知microsoft为何整的如此复杂。
    可以参考的函数:
    setwindowpos,
    窗口的wm_activate,在其不再是活动状态时设置其pos你的要求有和用途,一个窗口永远在下面,他的内容显示不出来呀。
      

  5.   

    如果不了解Z轴的操作可以自己构造WM_NCACTIVATE/WM_ACTIVATE发送给窗体
    MAKELPARAM(wLow,wHigh);MAKEWPARAM(wLow,wHigh)
      

  6.   

    Z轴顺序可能被用户操作打乱,这是操作系统决定的,如果非要保持顺序,请把A窗口创建为B的子窗口,B创建为C的子窗口,这样Z轴顺序将维持不变。但问题是作为子窗口后就不能超过父窗口的边框范围。如果确实需要维持顺序,单独做一个函数,每次执行完操作时候执行以重排所有窗口的顺序
      

  7.   

    谢谢19楼的回复,但问题是这样的一个函数,应当怎样去写能够实现重排窗口,这是我要问的。在实际项目中,我有五个大小不一的窗口需要重排,每个窗口分别起着不同的作用,Z轴排列顺序不能够弄乱,用户可以不对它进行操作,但是每次显示必需按照一个固定的层次显示(就像Photoshop中的层),否则就会出现问题,这个问题中我只说有A、B、C三个窗口,实际上已经简化了问题。
      

  8.   

    SetWindowPos(Ahwnd,HWND_TOP,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE);
    SetWindowPos(Bhwnd,HWND_TOP,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE);
    SetWindowPos(Chwnd,HWND_TOP,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE);最后被执行的在最上面,最先执行的在最下面