Запуск Doc / View приложения скрыт - PullRequest
0 голосов
/ 29 февраля 2012

Использование приложений Visual Studio 2010 и MFC Doc / View. Я хочу, чтобы мое приложение SDI запускалось полностью скрытым, и по прошествии некоторого времени или при получении какого-либо сообщения из значка в трее он отображает мейнфрейм, вид и т.Я изменяю строку m_pMainWnd->ShowWindow(SW_NORMAL); на m_pMainWnd->ShowWindow(SW_HIDE); в BOOL CMyApp::InitInstance(), но основной кадр просто мигает после выполнения приложения и затем показывает, что я должен сделать, чтобы избежать этой проблемы и сохранить возможность отображения основного кадра, когда я захочу.

Ответы [ 5 ]

2 голосов
/ 24 июня 2013

Вот решение для приложения SDI / MDI: новый MFC (с VC2010) заменяет значение m_nCmdShow настройкой, хранящейся в системном реестре.Чтобы изменить это поведение, просто переопределите виртуальную функцию LoadWindowPlacement в классе приложения.

BOOL CAdVisuoApp::LoadWindowPlacement(CRect& rectNormalPosition, int& nFflags, int& nShowCmd)
{
    BOOL b = CWinAppEx::LoadWindowPlacement(rectNormalPosition, nFflags, nShowCmd);
    nShowCmd = SW_HIDE;
    return b;
}
1 голос
/ 01 марта 2012

Обычно, если у вас VC2005 или более ранняя версия, будет делать следующее:

// 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();

Обратите внимание, что m_nCmdShow должен быть установлен в SW_HIDE до ProcessShallCommand, чтобы мерцание не происходило.

Этопохоже, что в 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, когда эта функция выполняется, но она изменяется на SW_SHOWNORMAL, когда выполняется строка if (!Create(lpszClass....Я не знаю, почему это происходит только в проекте VC2010, для меня это звучит как ошибка.

Мой пример проекта был SDI.

0 голосов
/ 31 августа 2018

Я перепробовал все для Visual Studio 2010 и закончил с:

class CMainFrame : public CFrameWndEx
{
// ...
// Attributes
public:
   BOOL m_bForceHidden;
   // ...
// Overrides
public:
   virtual void ActivateFrame(int nCmdShow = -1);
   //...
};

CMainFrame::CMainFrame() : m_bForceHidden(TRUE)
{
   // ...
}

void CMainFrame::ActivateFrame(int nCmdShow)
{
   if(m_bForceHidden)
   {
      nCmdShow = SW_HIDE;
      m_bForceHidden = FALSE;
   }
   CFrameWndEx::ActivateFrame(nCmdShow);
}

Другие приемы у меня не сработали.

Нашел решение по адресу: http://forums.codeguru.com/showthread.php?478882-RESOLVED-Can-a-Doc-view-be-hidden-at-startup

0 голосов
/ 08 февраля 2014

Убедитесь, что вы правильно отключаете бит WS_VISIBLE в CMainFrame :: PreCreateWindow (CREATESTRUCT & cs).Примерно так должно выглядеть:

cs.style &= ~WS_VISIBLE;

Мы просто отрицали бит вместо его отключения, и нам это удалось в VS 6.0, потому что эта функция была вызвана только один раз.Он вызывается дважды в новых версиях Visual Studio, поэтому во втором вызове мы снова включили его снова.: -О

0 голосов
/ 03 марта 2012

Это происходит из диалогового приложения, но вы также сможете преобразовать его в приложение Doc / View. Вам нужно обработать событие OnWindowPosChanging. Ключевая строка - это та, что внутри оператора if. Это позволяет моему приложению полностью скрыться от глаз.

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

    CDialog::OnWindowPosChanging( lpWindowPosition );

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...