主界面在程序运行时隐藏 DoModal的二三事

来源:互联网 发布:js checked=1 编辑:程序博客网 时间:2024/05/17 01:04

隐藏界面比较好的方案是重写DoModal
VS2008版
重写:

INT_PTR CIGoClientDlg::DoModal(){  // can be constructed with a resource template or InitModalIndirect  ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||    m_lpDialogTemplate != NULL);  // load resource as necessary  LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;  HGLOBAL hDialogTemplate = m_hDialogTemplate;  HINSTANCE hInst = AfxGetResourceHandle();  if (m_lpszTemplateName != NULL)  {    hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);    HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);    hDialogTemplate = LoadResource(hInst, hResource);  }  if (hDialogTemplate != NULL)    lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);  // return -1 in case of failure to load the dialog template resource  if (lpDialogTemplate == NULL)    return -1;  // disable parent (before creating dialog)  HWND hWndParent = PreModal();  AfxUnhookWindowCreate();  BOOL bEnableParent = FALSE;#ifndef _AFX_NO_OLE_SUPPORT  CWnd* pMainWnd = NULL;  BOOL bEnableMainWnd = FALSE;#endif  if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))  {    ::EnableWindow(hWndParent, FALSE);    bEnableParent = TRUE;#ifndef _AFX_NO_OLE_SUPPORT    pMainWnd = AfxGetMainWnd();    if (pMainWnd && pMainWnd->IsFrameWnd() && pMainWnd->IsWindowEnabled())    {      //      // We are hosted by non-MFC container      //       pMainWnd->EnableWindow(FALSE);      bEnableMainWnd = TRUE;    }#endif  }  TRY  {    // create modeless dialog    AfxHookWindowCreate(this);    if (CreateDlgIndirect(lpDialogTemplate,      CWnd::FromHandle(hWndParent), hInst))    {      if (m_nFlags & WF_CONTINUEMODAL)      {        // enter modal loop        ***DWORD dwFlags = 0; //MLF_SHOWONIDLE;***        if (GetStyle() & DS_NOIDLEMSG)          dwFlags |= MLF_NOIDLEMSG;        VERIFY(RunModalLoop(dwFlags) == m_nModalResult);      }      // hide the window before enabling the parent, etc.      if (m_hWnd != NULL)        SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW|        SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);    }  }  CATCH_ALL(e)  {    ***{ e->Delete(); } // DELETE_EXCEPTION(e);***    m_nModalResult = -1;  }  END_CATCH_ALL#ifndef _AFX_NO_OLE_SUPPORT    if (bEnableMainWnd)      pMainWnd->EnableWindow(TRUE);#endif  if (bEnableParent)    ::EnableWindow(hWndParent, TRUE);  if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)    ::SetActiveWindow(hWndParent);  // destroy modal window  DestroyWindow();  PostModal();  // unlock/free resources as necessary  if (m_lpszTemplateName != NULL || m_hDialogTemplate != NULL)    UnlockResource(hDialogTemplate);  if (m_lpszTemplateName != NULL)    FreeResource(hDialogTemplate);  return m_nModalResult;}

VS2013版

CigoAssistantDlg dlg;m_pMainWnd = &dlg;//INT_PTR nResponse = dlg.DoModal();dlg.Create(IDD_IGOASSISTANT_DIALOG);dlg.ShowWindow(SW_HIDE);INT_PTR nResponse = dlg.RunModalLoop();
0 0
原创粉丝点击