5

別のアプリケーションによって起動される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) 

しかし、それでもウィンドウは非表示になりません。

どうすればこのタスクを実行できますか?

4

6 に答える 6

3

どこかで別の問題があることをお勧めします。

まったく新しい空のMFCアプリ(Visual Studio 2010)を作成する場合、App :: InitInstanceで、SW_SHOWではなくSW_HIDEを設定する、結果のウィンドウが非表示になります。

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;
}
于 2012-10-12T10:30:16.817 に答える
2

電話をかけるとすぐにDoModal、ダイアログが表示される運命にあります。フォーカス/フリッカーの問題をうまく回避する回避策は1つだけです。ここで私の答えを参照してください:MFCダイアログボックスを非表示にする

したがって、コードは次のようになります。

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; 
} 
于 2012-10-13T13:03:55.570 に答える
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;
}
于 2012-10-12T13:49:49.810 に答える
1

ダイアログを内側から非表示にする必要があります。

  1. OnInitDialogをオーバーロード
  2. CDialogEx :: OnInitDialog()を呼び出す
  3. ウィンドウを非表示にして戻る

これがコードです

BOOL CMyAppDlg::OnInitDialog()
{
    BOOL result = CDialogEx::OnInitDialog();

    this->ShowWindow(SW_HIDE);

    return result;  // return TRUE  unless you set the focus to a control
}

番兵値YMMVを使用する別の方法があります。

于 2012-10-12T16:22:04.337 に答える
1

まず、以前のソリューションに関するいくつかの問題に対処しましょう。

chintan s: 関数がスコープ外になると、実際にダイアログが強制終了されます。ダイアログがアプリクラスのメンバー変数として宣言されている場合、これは有効な解決策になります。

Vikky: ダイアログはCWndから派生し、1つのパラメーター(showコマンド)のみを受け取るShowWindowメンバーを継承するため、WindowsAPIを呼び出す必要はありません。

ixe013: このソリューションは機能しますが、OnInitDialogが呼び出される前にShowWindowが呼び出されるため、ダイアログが非表示になる前に点滅します。

ピート: m_pMainWndに値が割り当てられる前にモーダルダイアログが開始されるため、これは機能しません。

解決策はixe013によって示されます。

これまでのところ機能する唯一の解決策ですが、記事で説明されているように、ダイアログクラスでメンバー変数を宣言する必要があります。

于 2012-10-13T13:44:38.113 に答える
0

showWindowメソッドには2つの変数があります。

  • 窓の取っ手
  • nCmdShow(ウィンドウの表示方法を制御します)

    BOOL WINAPI ShowWindow( In HWND hWnd、 In int nCmdShow);

    HWND hWnd = GetSafeHwnd();

    ShowWindow(hWnd、SW_HIDE);

こちらをご覧ください

于 2012-10-12T10:19:57.687 に答える