(название обновлено)
Исходя из этого вопроса, теперь у меня есть более четкое представление о том, что происходит ...
У меня есть приложение MFC без основного окна, которое предоставляет API для создания диалогов. Когда я несколько раз вызываю некоторые из этих методов, созданные диалоги объединяются друг с другом вместо того, чтобы все сводиться к рабочему столу ... Я понятия не имею, почему.
Но в любом случае даже после создания я не могу изменить родительский элемент на NULL или CWnd :: GetDesktopWindow () ... если я вызываю SetParent, а затем GetParent, ничего не изменилось.
Итак, кроме действительно странного вопроса о том, почему Windows магически присваивает каждому диалогу последний созданный диалог, есть ли что-то, чего мне не хватает, чтобы иметь возможность установить эти окна как дочерние элементы рабочего стола?
ОБНОВЛЕНО : Я нашел причину для всего этого, но не решение. Из моего конструктора диалогов мы получаем:
BOOL CDialog::CreateIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd,
void* lpDialogInit, HINSTANCE hInst)
{
ASSERT(lpDialogTemplate != NULL);
if (pParentWnd == NULL)
pParentWnd = AfxGetMainWnd();
m_lpDialogInit = lpDialogInit;
return CreateDlgIndirect(lpDialogTemplate, pParentWnd, hInst);
}
Примечание: if (pParentWnd == NULL)pParentWnd = AfxGetMainWnd();
Стек вызовов из моего конструктора диалогов выглядит так:
- mfc80d.dll! CDialog :: CreateIndirect (const DLGTEMPLATE * lpDialogTemplate = 0x005931a8, CWnd * pParentWnd = 0x00000000, недействительно * lpDialogInit = 0x00000000, HINSTANCE 0 * 10 000 * h0)
- mfc80d.dll! CDialog :: CreateIndirect (void * hDialogTemplate = 0x005931a8, CWnd * pParentWnd = 0x00000000, HINSTANCE__ * hInst = 0x00400000)
- mfc80d.dll! CDialog :: Create (const char * lpszTemplateName = 0x0000009d, CWnd * pParentWnd = 0x00000000)
- mfc80d.dll! CDialog :: Create (без знака int nIDTemplate = 157, CWnd * pParentWnd = 0x00000000)
- MyApp.exe! CMyDlg :: CMyDlg (CWnd * pParent = 0x00000000)
При запуске в отладчике, если я вручную изменяю pParentWnd обратно на 0 в CDialog :: CreateIndirect, все работает нормально ... но как я могу остановить это в первую очередь?