2012-02-29 3 views
0

Visual Studio 2010とMFC Doc/Viewアプリケーションを使用するSDIアプリケーションを完全に非表示にしておきたいときや、トレイアイコンから何らかのメッセージを受信して​​メインフレーム、ビューなどを表示したい。 m_pMainWnd->ShowWindow(SW_NORMAL);をにに変更しますが、アプリケーションを実行するとメインフレームがちょうどちらつき、この問題を回避し、いつでも私が望むようにメインフレームの表示能力を保つために、どうすればいいのかがわかります。あなたはVC2005を持っているか、それ以前の場合Doc/Viewアプリケーションを非表示にする

答えて

1

は、通常、次のように行います:m_nCmdShowが発生しないよう、フリッカーのためProcessShallCommand前に、SW_HIDEに設定する必要があることを

// Parse command line for standard shell commands, DDE, file open 
CCommandLineInfo cmdInfo; 
ParseCommandLine(cmdInfo); 

m_nCmdShow = SW_HIDE; 

// Dispatch commands specified on the command line. Will return FALSE if 
// app was launched with /RegServer, /Register, /Unregserver or /Unregister. 
if (!ProcessShellCommand(cmdInfo)) 
    return FALSE; 

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

注意を。

しかし、VC2010にバグがあるようです。私はこれをやってから興味をそそられ、新鮮なVC2010プロジェクトを試みましたが、それは機能しませんでした。私は、次のMFC関数で問題が深いことに気づいた。この関数の実行時

BOOL CFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, 
      CWnd* pParentWnd, CCreateContext* pContext) 
{ 
    // only do this once 
    ASSERT_VALID_IDR(nIDResource); 
    ASSERT(m_nIDHelp == 0 || m_nIDHelp == nIDResource); 

    m_nIDHelp = nIDResource; // ID for help context (+HID_BASE_RESOURCE) 

    CString strFullString; 
    if (strFullString.LoadString(nIDResource)) 
     AfxExtractSubString(m_strTitle, strFullString, 0); // first sub-string 

    VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)); 

    // attempt to create the window 
    LPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource); 
    CString strTitle = m_strTitle; 
    if (!Create(lpszClass, strTitle, dwDefaultStyle, rectDefault, 
     pParentWnd, ATL_MAKEINTRESOURCE(nIDResource), 0L, pContext)) 
    { 
     return FALSE; // will self destruct on failure normally 
    } 

    // save the default menu handle 
    ASSERT(m_hWnd != NULL); 
    m_hMenuDefault = m_dwMenuBarState == AFX_MBS_VISIBLE ? ::GetMenu(m_hWnd) : m_hMenu; 

    // load accelerator resource 
    LoadAccelTable(ATL_MAKEINTRESOURCE(nIDResource)); 

    if (pContext == NULL) // send initial update 
     SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE); 

    return TRUE; 
} 

m_nCmdShowはまだSW_HIDEされているが、if (!Create(lpszClass...ラインが実行されたときには、SW_SHOWNORMALに変わります。なぜVC2010プロジェクトでしか起こらないのか、私にはバグのように聞こえます。

サンプルプロジェクトはSDIでした。

+0

私はVisual studio 2010 sp1を使用しています。私のプロジェクトはSDIで、動作しません。私は質問にVS 2010を追加します。私の問題解決に役立つものがあれば、それを共有してください。 – AMCoded

0

これはダイアログベースのアプリケーションに由来しますが、Doc/Viewアプリケーションにも変換できるはずです。 OnWindowPosChangingイベントを処理する必要があります。キー行は、ifステートメント内のキー行です。これにより、私のアプリケーションは完全に隠れて見えるようになります。ここ

void CIPViewerDlg::OnWindowPosChanging(WINDOWPOS FAR* lpWindowPosition) 
{ 
    if(!m_bVisible) 
    { 
     lpWindowPosition->flags &= ~SWP_SHOWWINDOW; 
    } 

    CDialog::OnWindowPosChanging(lpWindowPosition); 

} 
2

は、SDI/MDIアプリケーションのためのソリューションである:(VC2010と)新しいMFCは、システムレジストリに格納された設定でm_nCmdShow値を上書き。この動作を変更するには、アプリケーションクラスのLoadWindowPlacement仮想関数をオーバーライドするだけです。

BOOL CAdVisuoApp::LoadWindowPlacement(CRect& rectNormalPosition, int& nFflags, int& nShowCmd) 
{ 
    BOOL b = CWinAppEx::LoadWindowPlacement(rectNormalPosition, nFflags, nShowCmd); 
    nShowCmd = SW_HIDE; 
    return b; 
} 
0

あなたが正しくのCMainFrame ::のPreCreateWindow(CREATESTRUCT & CS)でWS_VISIBLEビットをオフにしていることを確認します。我々は単にそれをオフにするのではなく、ビットを否定していた

cs.style &= ~WS_VISIBLE; 

、この関数は一度しか呼ばれていたので、我々は、VS 6.0に離れてそれで得た:このような何かが動作するはずです。これは、Visual Studioの新しいバージョンでは2回呼び出されています。したがって、2回目の呼び出しでは、すぐにそれを元に戻していました。 :-O

関連する問題