MFC и OpenGL

MFC и OpenGL

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

Жанр: Программирование
Серии: -
Всего страниц: 2
ISBN: -
Год издания: Не установлен
Формат: Полный

MFC и OpenGL читать онлайн бесплатно

Шрифт
Интервал

"Подать сюда MFС!!! – кричил он, топая всеми 4-мя лапами."

Сижу тут как-то, программку сочиняю, тут смотрю, царь зверей пожаловал. Вопрос задать пришел. Спрашивает как же OpenGL в MFC то вставить? Сначала думал отмажусь, потом смотрю, настойчивый такой царь попался. Письма шлет, желает знать как же все-таки её туда вставить-то. Вот и решил я примерчик на MFC состроить дабы цари меньше утруждали себя, а больше на солнышке бы нежились, чтоб у царей спокойно и хорошо все было, тогда и нам, простым зверушкам жить хорошо будет. И так поехали.

Для начала сделаем приложение MFC как диалог. Я назвал его BitScroll. Как это делать? Смотрите шаги по MFC.

Теперь, при помощи визарда добавим функцию

>BOOL CBitScrollDlg::PreCreateWindow(CREATESTRUCT& cs) {

> cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

> return CDialog::PreCreateWindow(cs);

>}

Помните, мы устанавливали слиль окна в функции CreateWindow? Так вот это действие по смыслу тоже самое. Напомню как это выглядело в Win32API:

>hWnd = CreateWindow("Skeleton", "Skeleton", WS_OVERLAPPEDWINDOW |  WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 50, 50, 700, 400, NULL, NULL, hInst, NULL);

Теперь обратимся к функции OnInitDialog(). В ней сначала вызывается функция базового класса, т.е. CDialog, а потом устанавливаются иконки для диалога. Давайте вставим наш код между иконками и CDialog::OnInitDialog().

>SetWindowPos(&wndTop, 0, 0, WIDTH, HEIGHT, SWP_NOMOVE);

>pDC = GetDC();

>CenterWindow();

>Init(); SetTimer(1,SPEED, NULL);

Теперь посмотрим, что мы сделали. Сначала сделаем окно нужного нам размера (макросы WIDTH и HEIGHT объявлены так #define WIDTH 640 и #define HEIGHT 480 в заголовочном файле).

Затем получим контекст для рисования. Установимся в центр вселенной и… вот, тут самое интересное, тут мы вызываем нашу собственную функцию, которая будет инициализировать OpenGL (напоминаю, что тоже самое делала функция Initial в программе на Win32API).

А потом включаем таймер, чтобы обеспечить анимацию. Обратимся теперь к Init(). Выглядит она итак:

>void CBitScrollDlg::Init() {

> CRect rect;

> HGLRC hrc;

> if (!bSetupPixelFormat()) return;

> hrc = wglCreateContext(pDC->GetSafeHdc());

> ASSERT(hrc != NULL);

> wglMakeCurrent(pDC->GetSafeHdc(), hrc);

> GetClientRect(&rect);

> glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

> glClearDepth(1.0);

> glDepthFunc(GL_LESS);

> glEnable(GL_DEPTH_TEST);

> glShadeModel(GL_SMOOTH);

> glMatrixMode(GL_PROJECTION);

> glLoadIdentity();

> gluPerspective(45.0f, (GLfloat)rect.right / (GLfloat)rect.bottom, 0.1f, 100.0f);

> glMatrixMode(GL_MODELVIEW);

>}

Что мы тут делаем? Прежде всего вызываем ф-ию SetupPixelFormat(), это опять наша функция и мы посмотрим ее чуть позже.

Далее, как и раньше, получаем контекст рендеринга (маленькая деталь, ранее pDC(а точнее эта переменная называлась hDC) была объявлена как static HDC hDC, сейчас контекст рисования является пременной типа CDC, а ф-ция wglCreateContext и другие функции OpenGL требуют в качестве аргумента переменную типа HDC. Поэтому мы получаем этот hardware context с помощью pDC->GetSafeHdc()).

Затем делаем этот контекст текущим и настраиваем область отображения, так как это делалось в Initial() (Win32API)

Функция bSetupPixelFormat() содержит следующее:

>BOOL CBitScrollDlg::bSetupPixelFormat() {

> static PIXELFORMATDESCRIPTOR pfd = {

>  sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

>  1, // version number

>  PFD_DRAW_TO_WINDOW | // support window

>  PFD_SUPPORT_OPENGL | // support OpenGL

>  PFD_DOUBLEBUFFER, // double buffered

>  PFD_TYPE_RGBA, // RGBA type

>  24, // 24-bit color depth

>  0, 0, 0, 0, 0, 0, // color bits ignored

>  0, // no alpha buffer

>  0, // shift bit ignored

>  0, // no accumulation buffer

>  0, 0, 0, 0, // accum bits ignored

>  32, // 32-bit z-buffer

>  0, // no stencil buffer

>  0, // no auxiliary buffer

>  PFD_MAIN_PLANE, // main layer

>  0, // reserved

>  0, 0, 0 // layer masks ignored

> };

> int pixelformat;

> if ((pixelformat = ChoosePixelFormat(pDC->GetSafeHdc(), &pfd)) == 0) {

>  MessageBox("ChoosePixelFormat failed");

>  return FALSE;

> }

> if (SetPixelFormat(pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) {

>  MessageBox("SetPixelFormat failed");

>  return FALSE;

> }

> return TRUE;

>}

Как не трудно заметить, она почти полностью взята из Win32API приложения за исключением того, что hDC заменена на pDC->GetSafeHdc().

Теперь добавим в нашу программку обработчик от таймера (мы его недавно сделали в ф-ции Init())

>void CBitScrollDlg::OnTimer(UINT nIDEvent) {

> DrawScene();

> CDialog::OnTimer(nIDEvent);

>}

Все тривиально. По смыслу ясно, что каждый раз, когда срабатывает обработчик таймера (а делает он это часто) рисуется сцена. Таким образом получается анимация. Посмотрим на эту функцию:

>void CBitScrollDlg::DrawScene() {

> static GLfloat angle = 0;

> glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

> glLoadIdentity();

> glTranslatef(0.0f, 0.0f, –2.0f);

> glRotatef(angle, 1.0f, 0.5f, 0.3f);

> glBegin(GL_QUADS);

> glColor3f(1.0f, 0.0f, 1.0f);

> glVertex3f(-0.5f, 0.5f, 0.0f);

> glColor3f(1.0f, 1.0f, 1.0f);

> glVertex3f(0.5f, 0.5f, 0.0f);

> glColor3f(0.0f, 1.0f, 1.0f);

> glVertex3f(0.5f, –0.5f, 0.0f);

> glColor3f(0.0f, 0.0f, 1.0f);


Еще от автора Неизвестный Автор
Галчонок

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Призраки ночи

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


Саньтии Веды Перуна

Саньтии Веды Перуна (Книга Мудрости Перуна) одно из древнейших Славяно-Арийских Священных Преданий, сохраненных Жрецами-хранителями Древнерусской Инглиистической церкви Православных Староверов-Инглингов.


Закат  вечности

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Сборник рассказов о порке

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


mmmavro.org | День 131, Победа

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекомендуем почитать
Север

Для тех кто устал от бесконечной гомосятины. Суровые бородатые северяне, Волки ну и магия, само собой. Вторая книга из серии. 1) Империя 2) Север 3) Юг.


Вокруг света в пятьдесят дней

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Аристотель и оружие

Пришелец из будущего прибывает в древнюю Македонию, где встречается с будущим завоевателем Александром и его учителем Аристотелем. Александр умер на пятнадцать лет позже; его империя рухнула только через сто лет после его смерти. Но ХХ век, куда вернулся путешественник изменился далеко не в лучшую сторону...


Демоны на Радужном Мосту

Три империи и их сферы влияния расположились друг рядом с другом в одной галактике. Но как ни странно, три империи имели только одну общую черту: демонов. Во всех мирах существовали легенды о гуманоидных существах с копытами и рогами, олицетворяющих собой сверхестественную мощь и безграничное зло. Подобие легенд привело к появлению теории о том, что все они основаны на чем-то реальном. К сожалению, так и было…


Программирование приложений для мобильных устройств под управлением Android. Часть 1

Книга посвящена разработке программ для мобильных устройств под управлением операционной системы Android. Рассматривается создание приложений с использованием системных компонентов и служб Android. Приведены базовые данные о структуре приложений, об основных классах и их методах, сопровождаемые примерами кода. Часть 1 содержит шесть глав, описывающих основные принципы создания приложений, пользовательский интерфейс, полномочия приложений, а так же базовые классы: Activity, Intent, Fragment. Книга предназначена для программистов, владеющих языком программирования Java и желающих освоить написание приложений, работающих под ОС Android.


Платформа J2Me

Эта книга научит вас, как разрабатывать программное обеспечение для платформы J2ME компании «Sun Microsystems». Эта книга придерживается стиля учебного пособия, это не справочное руководство.Цель — дать вам твердую основу в понятиях и техниках, которая даст вам возможность решиться на самостоятельную разработку качественных приложений.


Обработка баз данных на Visual Basic.NET

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.


Исчерпывающее руководство по написанию всплывающих подсказок

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Создаем порт для FreeBSD своими руками. Часть II

Система сборки программ, используемая во FreeBSD, имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах?