ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



Расставляем декорации - часть 8


void CMainFrame::RecalcLayout(BOOL bNotify) 40 iiy Глава 2. Расставляем декорации

\

/I Заново разместить служебные области

//и поместить трехмерное окно в центр.

// Размещение служебных областей выполняется

// обрамленным окном.

CFrameWnd::RecalcLayout(bNotify) ;

// Определить размеры свободного места //в клиентной области // для размещения трехмерного окна CRect re;

RepositionBars(О,

OxFFFF,

IDC_3DWND,

CWnd::reposQuery,

&rc) ;

if (IsWindow(m_wnd3d.GetSafeHwnd())) f m_wnd3d.MoveWindow(&rc, FALSE);

}

В сущности, данный фрагмент определяет размеры свободного места в клиент-ной области и использует его для размещения трехмерного окна. Более подробные объяснения можно найти в документации по MFC.

Уничтожение окна

Все хорошее когда-нибудь приходит к концу — в том числе и окна. Включая в программу функцию OnDestroy, мы сможем освободить память, занятую нашими объектами (для этого следует вызвать ClassWizard и указать обрабатываемое сообщение WM_DESTROY):

void CMainFrame::OnDestroy() {

CFrameWnd::OnDestroy() ;

// Уничтожить текущий макет m_wnd3d.SetScene(NULL) ;

if (m_pScene) { delete m_pScene;

}

Если при завершении программы не удалить объекты, созданные во время ее активности, это приведет к «утечке памяти». Благодаря механизму работы с памятью, который используется MFC в отладочных версиях программ, вы получите сообщение о таких «утечках» после завершения приложения, так что обнаружить их просто, а вот ликвидировать посложнее, так что давайте сразу будем программировать аккуратно.

Модификация главного окна '''^ 41

Подготовка к отображению трехмерного окна

Одна из самых интересных особенностей механизма визуализации DirectSD заключается в том, что он работает непосредственно с видеопамятью и не пользуется интерфейсом графических устройств Windows (GDI). Следовательно, крайне важно, чтобы механизм визуализации точно знал экранное положение того окна, с которым он работает. Если это положение будет указано неверно, то он либо не станет рисовать вообще, либо, что еще хуже, примется рисовать поверх других окон. Кроме того, механизм визуализации должен знать, активно приложение или нет и получило ли оно какие-либо сообщения, связанные с палитрой. Если приложение переходит в фоновый режим, механизм визуализации должен освободить палитру, чтобы ей могли воспользоваться другие приложения. Все эти требования выполняются функциями, предназначенными для обработки сообщений WM_ACIVATEAPP, WM_PALETECHANGED и WM_MOVE:




Содержание  Назад  Вперед