От: Anton <moth@mail.primorye.ru> Кому: KaevArtem <Kaev@yandex.ru> Тема: Почти конец... Дата: 27 июля 2001 г. 6:54 Привет Артем. Все таки пришлось писать через MDI, многовато будет работы, если в каждом диалоге описывать общее меню в каждом новом диалоге. Завел свой ChaildFrame, и диалог. Диалог привязал к фрайму. По нажатию на Ok диалог и фрайм закрываются. void CMothDialog::OnOK() Проблематично было на максимизацию фрейма прорисовать максимизацию диалога. void CMothChild::OnPaint() но решение как всегда оказалось простым. С уважением. Антон.
Итак, на основе проекта присланного Антоном я делаю описание. Создаем проект с именем 354, как MFC AppWizard, не забудьте про MDI на первом шаге. Добавляем диалоговое окно в ресурсы и на основе него создаем класс.
Создадим кнопку на панели инструментов.
Реакцию на нажатие кнопки в классе приложения.
Так же нам нужно перегрузить функцию нажатия на кнопку Ok на диалоговом окне.
Теперь нам нужно создать класс наследник от CMDIChildWnd назовем его CNewChild.
Диалоговому окну надо указать стиль child.
Объявим ссылку на наш диалог и объявим сам диалог.
// NewChild.h : header file // #include "MdiDialog.h" // класс диалогового окна ////////////////////////////////////////////////// // CNewChild frame class CNewChild : public CMDIChildWnd { ...... public: CMdiDialog m_dialog; // наш класс диалога ...... }
Изменим функцию OnCreate нашего нового класса.
int CNewChild::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_dialog.Create(IDD_DIALOG1,this)) // создаем диалог { TRACE0("Failed to create view window\n"); // не удачно return -1; // вернуть ошибку } SetWindowText("123"); // заголовок окна m_dialog.ShowWindow(SW_SHOWMAXIMIZED); // показать return 0; }
Реакция на нажатие кнопки на панели инструментов.
//////////////////////////////// // CMy354App message handlers void CMy354App::OnButton32771() { CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd); // указатель на класс рамки pFrame->CreateNewChild(RUNTIME_CLASS(CNewChild), IDR_MY354TYPE, NULL, NULL); // создать окно }
И реакция нажатия на кнопку ОК диалогового окна.
/////////////////////////////// // CMdiDialog message handlers void CMdiDialog::OnOK() { CMdiDialog::GetParent()->SendMessage(WM_CLOSE); // послать сообщение родителю о закрытии //CDialog::OnOK(); }
Программа в работе.
Итак, мы создали свой класс от CMDIChildWnd. CMDIChildWnd является базовым классом для классов подчиненных окон в MDI приложении. Дальше мы описали создание окна. То есть вписали наше диалоговое окно в CMDIChildWnd. Не зря мы указали в диалоговом окне то, что оно будет child и при создании диалога указали this. На данном этапе в этом легко убедиться, попробовав изменить размер. Под диалоговым окном будет обычное окно. При нажатии на кнопку мы вызываем CreateNewChild(). Эта функция в MSDN не документирована, а только упоминается несколько раз. Как догадываетесь создаем новое окно Child. Найти ее описание можно в описании класса CMDIFrameWnd в afxwin.h:
class CMDIFrameWnd : public CFrameWnd { ............. void MDICascade(int nType); CMDIChildWnd* CreateNewChild(CRuntimeClass* pClass, UINT nResource, HMENU hMenu = NULL, HACCEL hAccel = NULL); // Overridables ............
Наш класс от CMDIChildWnd.
При необходимости перегрузка OnCreate().
Вызов функции CreateNewChild.
Проект прислал Антон.