Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вопрос по CDialog

10.0K
22 марта 2005 года
antoniz
1 / / 15.02.2005
Может кто делал?

Как сделать чтобы по окончанию вызова метода 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;
}
}
425
22 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by antoniz
Может кто делал?

Как сделать чтобы по окончанию вызова метода DoModal окно диалога не разрушалось, а прекращало модальный режим и скрывалось. При повтроном вызове начниался модальный режим и окно диалога просто отображалось. (например, как в делфях сделано ShowModal). Пробывал DoModal переписать, вроде все нормально, если системное меню главного окна приложения не трогать (приложение вылетает с ошибкой). Просьба на код не ругаться, просто он тестовый.
...

Ё! Зря Вы боретесь с MFC. Они Вас всё равно победят. Не здесь, так в другом месте какая-нибудь гадость вылезет. MFC сделано для того, чтобы его использовать, а не переписывать.

Нельзя ли это по-другому сделать? Например, сохранять параметры диалога, закрывать его, а потом снова открывать с учётом сохранённой конфигурации. Такой путь мне кажется более простым.

Ведь на самом деле все диалоги в MFC немодальные. MFC заставляет их выглядеть модальными при помощи некоторых ухищрений. А Вы хотите после этого добавить новые прибамбасы, которые снова заставят Ваши диалоги выглядеть модальными... не слишком ли это уже много?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог