Шаг 354 - Создание разных окон MDI

От: 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 на первом шаге. Добавляем диалоговое окно в ресурсы и на основе него создаем класс.

354_1.gif (3128 b)

Создадим кнопку на панели инструментов.

354_2.gif (2584 b)

Реакцию на нажатие кнопки в классе приложения.

354_3.gif (3375 b)

Так же нам нужно перегрузить функцию нажатия на кнопку Ok на диалоговом окне.

354_4.gif (4640 b)

Теперь нам нужно создать класс наследник от CMDIChildWnd назовем его CNewChild.

354_5.gif (1470 b)

Диалоговому окну надо указать стиль child.

354_6.gif (2807 b)

Создаем код

Объявим ссылку на наш диалог и объявим сам диалог.

// 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();
}

Программа в работе.

354_7.gif (7774 b)

Описание

Итак, мы создали свой класс от 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.

Проект прислал Антон.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.