单文档程序,一旦显示出来了非模态对话框后,主窗口似乎从windows的窗口管理器里消失了,就是按住ALT再按TAB时,就看不到主程序的窗口。
把主程序最小化后,点击任务栏图标也没法恢复,鼠标右击选菜单恢复可以,这是怎么回事呢。不能把非模框改成WS_CHILD,改成WS_CHILD后非模框不能输入了。
我设置非模框的父窗口为视图窗口,而不是主窗口,就是想让这个非模框只能在视图范围内移动,也不能覆盖主窗口的工具栏没搞清楚状况的就不要发言了,谢谢.为了省事,我直接把例子传到网上来了,地址如下, 请求高手帮助,万分感谢 qq2429302http://www.qianglian.cn/download/test.rar

解决方案 »

  1.   


    void CMainFrame::OnShow() 
    {
    // TODO: Add your command handler code here
    CForm * pForm;

    pForm = new CForm(this);
    pForm->Create(IDD_DIALOG1);
    //pForm->SetParent(GetActiveView()); // 把你的这个去掉
    pForm->ShowWindow(SW_SHOW);
    }
      

  2.   

    你说的这些我没有出现:
    单文档程序,一旦显示出来了非模态对话框后,主窗口似乎从windows的窗口管理器里消失了,就是按住ALT再按TAB时,就看不到主程序的窗口。
    把主程序最小化后,点击任务栏图标也没法恢复,鼠标右击选菜单恢复可以,这是怎么回事呢。我是XP,你是Win7吗?
    ============================================================================关于后面的问题,你要创建非模态对话框,设置主窗口为父窗口,但是后创建出来的,不能使WS_CHILD
      

  3.   

    VisualEleven:
      我说了:"我设置非模框的父窗口为视图窗口,而不是主窗口,就是想让这个非模框只能在视图范围内移动,也不能覆盖主窗口的工具栏"
    healer_kx: 我也是XP,难道是我机器有问题?
      

  4.   

    Sorry,我没仔细看
    pForm->Create(IDD_DIALOG1);
    --》
    pForm->Create(IDD_DIALOG1, GetDesktopWindow());
      

  5.   


    下了你的代码测试了,我的系统 Win7 ,没发现有你这个问题啊,从菜单里“显示非模态对话框”后,不管有把主界面最小化后,直接单击任务栏可以恢复主界面,按 Atl+Tab 依然可以恢复主界面。
    放到虚拟机里面的 XP SP3 系统测试,也正常,不知道楼主遇到的问题到底是什么导致的。
    囧,楼主的RP不会这么好吧。你可以测试下,把你的exe可执行文件,拷贝到 别人的电脑运行,看看是否会遇到同样的问题。
      

  6.   

    问题是这样的
    你现在实现的效果是当这个非模态对话框出现之后这个非模态对话框抢掉了焦点
    这个时候主窗口已经没有焦点了
    而当前焦点的popup的窗口却没有在任务栏所以就出现了你说的问题
    你点一下主窗口alt+tab就可以看到了
    我觉得这应该是微软的一个bug
    不过你得设计也有些问题
    一个程序内
    子窗口会抢掉主窗口的焦点
    这多少有些不合理
      

  7.   

    VisualEleven: 谢谢你!我按你说的修改后,果然Successful了!!!   但是我仍然是一头雾水,只知道其然,不知其所以然。 现在的代码如下:
    1. CForm * pForm;
    2. pForm = new CForm(this);
    3. pForm->Create(IDD_DIALOG1,GetDesktopWindow());
    4. pForm->SetParent(GetActiveView());
    5. pForm->ShowWindow(SW_SHOW);
       粗看第3句,第4句似乎有些矛盾,一个是设置桌面为父窗口,一个是设置主框架内的视图为父窗口。但是经过多次试验发现,要实现我要的效果,这2句缺一不可,
       到底那一句成功了呢,这个对话框的父窗口到底是哪个?  于是我加了3句调试如下:
    CWnd * p;       
             HWND hwnd;
    pForm->Create(IDD_DIALOG1,GetDesktopWindow());
    p = pForm->GetParent();
    TRACE("p=%x\n",p);
    pForm->SetParent(GetActiveView());
    p = pForm->GetParent();
    TRACE("p=%x\n",p);
             hwnd = ::GetParent(pForm->m_hWnd);
            TRACE("hwnd = %d\n",hwnd); 最后我发现输出的居然是:
    p = 0;
    p = 0;
    hwnd = 0;不知道Create和SetParent中指定的2个父窗口到底起了什么作用.
    再次感谢你。TandyT:
      我把程序发给一个装Vista系统的人测试,他也没发现这个问题。然后我又发给一个装XP的测试,情况和我一样,我的系统是XP SP3.现在按VisualEleven的方法,问题是解决了,原理还不清楚。
    xianglitian:
      你的分析很对。不过这就是我想要的效果,单文档程序实现多文档的效果。
      既然是非模态框,子窗口会抢掉主窗口的焦点有什么不合理呢. 现在问题是解决了,原理还不清楚。