вопрос по CDialog
Как сделать чтобы по окончанию вызова метода DoModal окно диалога не разрушалось, а прекращало модальный режим и скрывалось. При повтроном вызове начниался модальный режим и окно диалога просто отображалось. (например, как в делфях сделано ShowModal). Пробывал DoModal переписать, вроде все нормально, если системное меню главного окна приложения не трогать (приложение вылетает с ошибкой). Просьба на код не ругаться, просто он тестовый.
INT_PTR CAIDialog :: DoModal()
{
CWinApp* pApp = AfxGetApp();
if (m_bFirst)
{
// 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;
if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
TRY
{
// create modeless dialog
AfxHookWindowCreate(this);
if (CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle(hWndParent), hInst))
{
pApp -> EnableModeless(FALSE);
m_hWndOld = m_hWnd;
if (m_nFlags & WF_CONTINUEMODAL)
{
// enter modal loop
DWORD dwFlags = 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);
EndModalLoop(m_nModalResult);
EndModalState();
pApp -> EnableModeless(TRUE);
}
}
CATCH_ALL(e)
{
//DELETE_EXCEPTION(e);
m_nModalResult = -1;
}
END_CATCH_ALL
if (bEnableParent)
::EnableWindow(hWndParent, TRUE);
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
::SetActiveWindow(hWndParent);
// unlock/free resources as necessary
if (m_lpszTemplateName != NULL || m_hDialogTemplate != NULL)
UnlockResource(hDialogTemplate);
if (m_lpszTemplateName != NULL)
FreeResource(hDialogTemplate);
m_bFirst = FALSE;
return m_nModalResult;
}
else
{
/*
// 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;
if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}*/
HWND hWndOld = m_hWndOld;
m_hWnd = NULL;
// disable parent (before creating dialog)
HWND hWndParent = PreModal();
m_hWnd = hWndOld;
AfxUnhookWindowCreate();
BOOL bEnableParent = FALSE;
if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
TRY
{
// create modeless dialog
AfxHookWindowCreate(this);
/*if (CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle(hWndParent), hInst))
{*/
pApp -> EnableModeless(FALSE);
ShowWindow(SW_SHOW);
m_nModalResult = -1;
m_nFlags |= WF_CONTINUEMODAL;
if (m_nFlags & WF_CONTINUEMODAL)
{
// enter modal loop
DWORD dwFlags = 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);
EndModalLoop(m_nModalResult);
EndModalState();
pApp -> EnableModeless(TRUE);
//}
}
CATCH_ALL(e)
{
//DELETE_EXCEPTION(e);
m_nModalResult = -1;
}
END_CATCH_ALL
if (bEnableParent)
::EnableWindow(hWndParent, TRUE);
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
::SetActiveWindow(hWndParent);
return m_nModalResult;
}
}
Цитата:
Originally posted by antoniz
Может кто делал?
Как сделать чтобы по окончанию вызова метода DoModal окно диалога не разрушалось, а прекращало модальный режим и скрывалось. При повтроном вызове начниался модальный режим и окно диалога просто отображалось. (например, как в делфях сделано ShowModal). Пробывал DoModal переписать, вроде все нормально, если системное меню главного окна приложения не трогать (приложение вылетает с ошибкой). Просьба на код не ругаться, просто он тестовый.
...
Может кто делал?
Как сделать чтобы по окончанию вызова метода DoModal окно диалога не разрушалось, а прекращало модальный режим и скрывалось. При повтроном вызове начниался модальный режим и окно диалога просто отображалось. (например, как в делфях сделано ShowModal). Пробывал DoModal переписать, вроде все нормально, если системное меню главного окна приложения не трогать (приложение вылетает с ошибкой). Просьба на код не ругаться, просто он тестовый.
...
Ё! Зря Вы боретесь с MFC. Они Вас всё равно победят. Не здесь, так в другом месте какая-нибудь гадость вылезет. MFC сделано для того, чтобы его использовать, а не переписывать.
Нельзя ли это по-другому сделать? Например, сохранять параметры диалога, закрывать его, а потом снова открывать с учётом сохранённой конфигурации. Такой путь мне кажется более простым.
Ведь на самом деле все диалоги в MFC немодальные. MFC заставляет их выглядеть модальными при помощи некоторых ухищрений. А Вы хотите после этого добавить новые прибамбасы, которые снова заставят Ваши диалоги выглядеть модальными... не слишком ли это уже много?