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




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


void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask) {

CFrameWnd::OnActivateApp(bActive, hTask) ;

// Сообщить трехмерному окну об изменении состояния m_wnd3d.SendMessage(WM_ACTIVATEAPP, (WPARAM)bActive, (LPARAM)hTask) ;

}

void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) {

// Сообщить трехмерному окну об изменении палитры m_wnd3d.SendMessage(WM_PALETTECHANGED, pFocusWnd ?

(WPARAM)pFocusWnd->GetSafeHwnd() : 0);

\

void CMainFrame::OnMove(int x, int y) {

CFrameWnd::OnMove(x, y) ;

// Сообщить трехмерному окну о перемещении обрамленного

окна

m_wnd3d.SendMessage(WM_MOVE,

О,

MAKELPARAM(0, 0)) ;

Как видите, для нормальной работы DirectSD необходимо лишь, чтобы ваше приложение посылало сообщения трехмерному окну, которое берет на себя частные аспекты взаимодействия с механизмом визуализации.

42 'ЭДГ Глава 2. Расставляем декорации

Меню File

Остается лишь предусмотреть обработку команд меню File ¦ New и File ¦ Open. Ранее мы уже построили функцию для удаления текущего и создания нового макета, поэтому команда File ¦ New реализуется тривиально (воспользуйтесь ClassWizard для добавления идентификатора объекта ID_FILE_NEW):

void CMainFrame::OnFileNew()

{

NewScene ();

}

Команда File ¦ Open обрабатывается двумя следующими функциями:

BOOL CMainFrame::OpenFile(const char* pszPath) {

// Попытаться открыть файл с фигурой

C3dShape sh;

const char* pszFile = sh.Load(pszPath);

if (!pszFile) return FALSE;

// Создать новый макет NewScene ();

ASSERT(m pScene);

// Присоединить новую фигуру к макету m pScene->AddChild(&sh);

sh.SetRotation(l, 1, 1, 0.02);

// Включить имя в список последних открывавшихся файлов AfxGetApp()->AddToRecentFileList(pszFile) ;

return TRUE;

}

void CMainFrame::OnFileOpen() f

OpenFile(NULL) ;

}

Теперь давайте посмотрим, как работает функция OpenFile. Сначала мы создаем новый объект C3dShape и вызываем его функцию Load. Эта функция либо пытается открыть файл, либо, при отсутствии заданного имени файла, выводит окно диалога, в котором пользователю предлагается выбрать файл. В том случае, если файл имеет правильный формат, код класса C3dShape открывает его и создает трехмерный объект на основании данных из файла. Понятно, правда? Далее мы присоединяем новый объект к макету и приводим его во вращение, чтобы увидеть макет во всей красе. Имя файла заносится в список последних открывавшихся файлов, что облегчает его повторное открытие в будущем (вспомните, что функция OpenFile также вызывается в функции




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