隐藏MFC对话窗口

时间:2012-10-12 10:16:40

标签: winapi visual-c++ mfc

我编写了一个基于MFC对话框的应用程序,该应用程序由另一个应用程序启动。目前,我还没有添加任何代码。它只是我得到的默认文件。另一个应用程序可以成功启动我的应用程序。

我试图在其他应用程序启动时隐藏我的应用程序窗口。

BOOL CMyApp::InitInstance()
{
    CMyAppDlg dlg;
    m_pMainWnd = &dlg;        

    INT_PTR nResponse = dlg.DoModal();

    if (nResponse == IDOK)
    {
    }
    else if (nResponse == IDCANCEL)
    { 
    }

    return FALSE;
}

我试图使用:

dlg.ShowWindow(SW_HIDE) 

但它仍然没有隐藏窗口。

我该如何完成这项任务?

6 个答案:

答案 0 :(得分:2)

我建议你在某个地方有另一个问题。

如果您创建一个全新的空白MFC应用程序(Visual Studio 2010),那么在App :: InitInstance中,设置SW_HIDE而不是SW_SHOW 导致隐藏结果窗口。

BOOL CProj1App::InitInstance()
{

// boilerplate code
      . . . 

// The one and only window has been initialized, so show and update it
m_pMainWnd->ShowWindow(SW_HIDE);   // WORKS!
m_pMainWnd->UpdateWindow();

return TRUE;
}

答案 1 :(得分:2)

一旦你致电DoModal,你的对话就注定要被显示出来。只有一种解决方法可以成功避免焦点/闪烁问题。请在此处查看我的回答:Hiding an MFC dialog box

因此,您的代码应如下所示:

BOOL CMyApp::InitInstance() 
{ 
    CMyAppDlg dlg;
    dlg.SetVisible(FALSE); // Sets m_visible flag to FALSE.

    m_pMainWnd = &dlg;         

    INT_PTR nResponse = dlg.DoModal(); 

    if (nResponse == IDOK) 
    { 
    } 
    else if (nResponse == IDCANCEL) 
    {  
    } 

    return FALSE; 
} 

答案 2 :(得分:1)

解决上述问题。 InitInstance代码应如下所示:

BOOL CMyApp::InitInstance()
{
    CWinApp::InitInstance();
    AfxEnableControlContainer();

    CMyAppDlg dlg;
    dlg.Create(IDD_MyAppUI_DIALOG,NULL);
    dlg.ShowWindow(SW_HIDE);
    dlg.UpdateWindow();
    m_pMainWnd = &dlg;

    return TRUE;
}

答案 3 :(得分:1)

您必须从内部隐藏对话框。

  1. 重载OnInitDialog
  2. 调用CDialogEx :: OnInitDialog()
  3. 隐藏窗口并返回
  4. 这是代码

    BOOL CMyAppDlg::OnInitDialog()
    {
        BOOL result = CDialogEx::OnInitDialog();
    
        this->ShowWindow(SW_HIDE);
    
        return result;  // return TRUE  unless you set the focus to a control
    }
    

    another method with a sentinel value,YMMV。

答案 4 :(得分:1)

首先让我解决先前解决方案的一些问题。

chintan s: 事实上,当功能超出范围时,对话框将被终止。如果将对话框声明为app类的成员变量,那将是一个有效的解决方案。

<强> Vikky: 无需调用Windows API,因为对话框是从CWnd派生的,它继承了只接受一个参数的ShowWindow成员:show command。

<强> ixe013: 这个解决方案可行,但是,在对话框隐藏之前,它会闪烁,因为在调用OnInitDialog之前调用了ShowWindow。

<强>皮特: 这不起作用,因为模态对话框在m_pMainWnd分配了任何值之前就开始了。

解决方案由ixe013指出。

这是迄今为止唯一可行的解​​决方案,但您必须在对话框类中声明成员变量,如本文所述。

答案 5 :(得分:0)

showWindow方法有2个变量。

  • 窗口句柄
  • nCmdShow(控制窗口的显示方式)

    BOOL WINAPI ShowWindow(   HWND hWnd中,        In int nCmdShow     );

    HWND hWnd = GetSafeHwnd();

    的ShowWindow(HWND,SW_HIDE);

请参阅HERE