程序中有一个非模态对话框,用来显示多个模态对话框的结果,所以可能随时被任何一个模态对话框(不会在相同的时间内显示两个模态对话框)调用。我现在采用的方法是在主框架类中生成该非模态对话框,然后由主框架类生成其他的模态对话框,这时非模态对话框虽然能被模态对话框操作,但是总是显示在模态对话框的后面,曾尝试用SetParent()函数改变非模态对话框的父窗口,结果失败了,希望得到帮助,呵呵

解决方案 »

  1.   

    BOOL SetWindowPos(
      HWND hWnd,             // handle to window
      HWND hWndInsertAfter,  // placement-order handle
      int X,                 // horizontal position
      int Y,                 // vertical position
      int cx,                // width
      int cy,                // height
      UINT uFlags            // window-positioning flags
    );
    hWndInsertAfter 取 HWND_TOPMOST
      

  2.   

    在需要的时候,向那个非模态对话框发一个WM_ACTIVATE消息,应该可以使用处于Z-order的最前面.
      

  3.   

    应该用主框架窗口生成模态对话框,然后在模态对话框里放一个诸如CStatic的控件,把它放在你想放非模态对话框的位置,在模态对话框中创建非模态对话框,用SetWindowPos来将该对话框移动到CStatic的位置就可以了。
      

  4.   

    to:Zark(金陵五月) ,不行啊,还是无法获取焦点,我直接用SetActiveWindow()都不行,点击鼠标也不行;to:numen27(影子) ,我有多个模态对话框,但是非模态对话框从头到尾只有一个,所以我想不应该在某一个模态对话框中创建吧?谢谢解答!
      

  5.   

    这样看来可能是你的message loop中没有使用IsDlgMessage()造成的,这个问题光凭嘴说是挺难的(关键是手指头太累,打不了那么许多字),如果你愿意可以在MSDN中读读IsDlgMessage();如果你的代码不长,也可以发给我([email protected]).
      

  6.   

    不好意思,我在MSDN中搜索了一下,没有找到函数IsDlgMessage(),麻烦大侠再说一次,呵呵,多谢了现在这个程序已经很大了,编译后的.exe文件就有1M左右,而且,呵呵,导师接的项目,特意关照原码问题,所以,不好意思了,^_^。非常感谢!
      

  7.   

    抱歉,写得手顺了,应该是IsDialogMessage().
      

  8.   

    多谢了!^_^,我去学学,呵呵考虑了一天,问题已经解决,思路有些变化,大体如下:
    该非模态框的指针还是只定义一次,然后在每个模态框的初始化函数中用Create()函数生成该对话框,但是模态对话框结束的时候将该非模态对话框也销毁(不是隐藏),然后下一个模态对话框生成时再Create的,这样该非模态对话框的数据并没有消失,所以既保留了数据,也达到了适合各模态对话框的目的。多谢各位的关注,现在结贴!