【问题标题】:Hide main MFC window while modal dialog is active?在模式对话框处于活动状态时隐藏主 MFC 窗口?
【发布时间】:2012-04-16 11:36:28
【问题描述】:

我有一个本机 C++ MFC 应用程序。它有一个基于 CWnd 的主窗口,用户操作可以创建一个模态对话框。当对话框处于活动状态时,我希望主窗口消失,对话框可见,并且主窗口的图标保留在任务栏中。

我怎样才能做到这一点?

如果我隐藏主窗口 (ShowWindow(SW_HIDE)),任务栏图标就会消失。如果我最小化主窗口 (SW_MINIMIZE),图标仍然存在。但是,由于对话框归主窗口所有,这也会隐藏对话框。

创建对话框后,单击任务栏图标使对话框可见。当然,我不想要求用户这样做。

即使我在对话框的 OnInit 处理程序中插入 ShowWindow(SW_SHOW),对话框仍然不可见。不过,Spy++ 显示其可见位已设置。如果我将 SetWindowActive 添加到 OnInit,也是如此。

我对更改 UI 设计不感兴趣。当对话框处于活动状态时,用户只与它交互,并且对主窗口中的任何内容都不感兴趣。因此,主窗口应该会消失。

在WinXP32下使用Windows VS2005。

【问题讨论】:

    标签: c++ mfc modal-dialog


    【解决方案1】:

    好吧,在您创建对话框并将其显示为模态的代码块中,您可以对应用的主窗口执行任何操作(显示/隐藏),只要您将桌面窗口设为您的父窗口即可对话。通常,CDialog 和派生类的构造函数为框架最终替换 AfxGetMainWnd() 的父窗口采用默认参数 NULL。而是将 CWnd::GetDesktopWindow() 作为对话框的父级传递,然后您应该能够隐藏主窗口。但是,您仍然可能对任务栏有疑问 - 但我会让其他人给出提示,因为我对此一无所知。

    【讨论】:

    • 隐藏在任务栏中:stackoverflow.com/questions/7219063/…
    • 将 GetDesktopWindow() 传递给模态对话框的构造函数会给出一个无主窗口 (Spy++),但模态窗口不可见。模式对话框的任务栏上的附加图标。在模式对话框的 OnInitDialog 处理程序中添加 ShowWindow(SW_SHOW) 和/或 SW_RESTORE 无效。单击任一任务栏图标可恢复相应的窗口。代码:'CMyDialog *pDlg=new CMyDialog(GetDesktopWindow()); // 以桌面为父创建 ShowWindow(SW_MINIMIZE); // 最小化主 pDlg->DoModal();'在 CMyDialog::OnInitDialog: 'ShowWindow(SW_RESTORE);显示窗口(SW_SHOW); //以防万一
    【解决方案2】:

    在 OnInitDialog 中,添加以下代码

    //Set windows size zero, the windows disappear.
    MoveWindow(0,0,0,0);
    
    //If you want it invisible on taskbar. add following codes.
    DWORD dwStyle = GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
    dwStyle &=~WS_EX_APPWINDOW;   
    dwStyle |= WS_EX_TOOLWINDOW;     
    SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, dwStyle);
    

    【讨论】:

      【解决方案3】:

      您正在与操作系统作斗争。根据定义,模态对话框禁用但不隐藏“主”(父)窗口。如果您想要 另一个 窗口,请创建第二个窗口,但不要告诉操作系统将其视为第一个窗口上的模式对话框。

      【讨论】:

        【解决方案4】:

        也许您可以将主窗口调整为非常小的尺寸,并始终将其保留在模态对话框的后面。

        【讨论】:

          猜你喜欢
          • 2019-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-03
          • 1970-01-01
          • 1970-01-01
          • 2017-06-07
          相关资源
          最近更新 更多