MDIFrameWnd как чейто child - как сделать?
От: zxcv12  
Дата: 27.07.04 13:56
Оценка:
Здравствуйте

Есть задумка сделать несколько комплектов окон MDI в пределах одного приложения, которые должны все быть child-ами общего окна и показываться по очереди.
Вроде бы легко создаются и работают несколько штук, но проблема возникает даже с одним, когда я пытаюсь сделать его child-ом

Вот это я пишу в InitInstance
// (CMainWnd :public CFrameWnd)
pMain=(CMainWnd*) RUNTIME_CLASS(CMainWnd)->CreateObject(); 
pMain->LoadFrame(IDR_MAINFRAME);
pMain->ShowWindow(m_nCmdShow); // То что будет основным окном

CMDIFrameWnd* pFrame = new CMainFrame;
m_pMainWnd = m_pMainWnd1= pFrame;
if (!pFrame->LoadFrame(IDR_MAINFRAME,WS_VISIBLE)) // <------
   return FALSE;
pFrame->ShowWindow(m_nCmdShow);
pFrame->UpdateWindow();

А вот это в OnFileNew
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
CRuntimeClass* pCFrame=RUNTIME_CLASS(CChildFrmOpen);
pFrame->CreateNewChild(pCFrame, IDR_FBTYPE, m_hMDIMenu, m_hMDIAccel);


В таком варианте все работает, появляется 2 независимых окна, одно из которых нормально работает с MDI
Но как только пытаюсь в строчке отмеченной "<----" написать

if (!pFrame->LoadFrame(IDR_MAINFRAME,WS_VISIBLE|WS_CHILD,pMain))

прога вылетает на 3-ей строчке OnFileNew (первые две проходят нормально, pFrame и pCFrame ненулевые)
с access violation


Как поправить?
Re: MDIFrameWnd как чейто child - как сделать?
От: rus blood Россия  
Дата: 27.07.04 14:02
Оценка: 3 (1)
Здравствуйте, zxcv12, Вы писали:

1. Стиль WS_CHILD — это для окон, которые лежат внутри других окон. CFrameWnd создан для top-level окон, он с этим стилем работать не будет.
2. В m_pMainWnd лучше оставить "главное" окно. Зачем ты кладешь создаваемый фрейм в m_pMainWnd?
3. Стиль WS_CHILD тебе не нужен. Тебе нужно установить родителя pFrame->SetParent(m_pMainWnd); (где m_pMainWnd — это "главное" окно). А вообще, зачем это нужно? Заведи лучше отдельный массив для фреймов...
Имею скафандр — готов путешествовать!
Re[2]: MDIFrameWnd как чейто child - как сделать?
От: zxcv12  
Дата: 27.07.04 14:33
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>1. Стиль WS_CHILD — это для окон, которые лежат внутри других окон. CFrameWnd создан для top-level окон, он с этим стилем работать не будет.


Спасибо за ответ
Убрал WS_CHILD, добавил SetParent — заработало... почти
При этом окно MDIFrame все равно лежит внутри главного окна — вроде как и должно при WS_CHILD — ну да это непринципиально

RB>2. В m_pMainWnd лучше оставить "главное" окно. Зачем ты кладешь

создаваемый фрейм в m_pMainWnd?

Попробовал щас поставить туда главное окно — вылет в OnFileNew по ассерту в winmdi.cpp ln 510 : ASSERT_KINDOF(CMDIFrameWnd, pMainWnd);
(при этом в OnFileNew поправил получение мейнфрейма по pMainWnd1)
придется, видимо, перед созданием child-ов, подменять pMainWnd типа
CWnd* p1=m_pMainWnd;
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd1);
m_pMainWnd=m_pMainWnd1;
CRuntimeClass* pCFrame=RUNTIME_CLASS(CChildFrmOpen);
pFrame->CreateNewChild(pCFrame, IDR_FBTYPE, m_hMDIMenu, m_hMDIAccel);
m_pMainWnd=p1;

если только при создании такая подмена нужна то это мелочь

RB>3. Стиль WS_CHILD тебе не нужен. Тебе нужно установить родителя pFrame->SetParent(m_pMainWnd); (где m_pMainWnd — это "главное" окно). А вообще, зачем это нужно? Заведи лучше отдельный массив для фреймов...


Массив будет, главное чтоб оно с одним хотя бы окном заработало. Идея в нескольких независимых наборах MDI окон
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.