MFC и OpenGL

MFC и OpenGL

Авторы:

Жанр: Программирование

Циклы: не входит в цикл

Формат: Полный

Всего в книге 2 страницы. У нас нет данных о годе издания книги.

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

Читать онлайн 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);


С этой книгой читают
Как писать драйвера

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


Графика для Windows средствами DirectDraw

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


Программирование мобильных устройств на платформе .NET Compact Framework
Автор: Иво Салмре

Книга известного профессионала в области компьютерных технологий посвящена разработке приложений для широкого спектра мобильных устройств с использованием популярной и постоянно развивающейся платформы .NET Compact Framework. Уникальность этой книги состоит в том, что в ней гармонично переплетены теоретические сведения обо всем цикле разработки программного обеспечения с практическими примерами применения на языках С# и Visual Basic. Подробно рассматриваются концепции, лежащие в основе самой платформы .NET Compact Framework, а также вопросы, связанные с созданием эффективного пользовательского интерфейса, управлением памятью, производительностью и надежностью.


Извлекаем архив из fb2
Автор: Юрий Карпов

Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...


Рекурсия
Автор: Юрий Карпов

Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...


Идиомы и стили С++

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


Драгоценности Медичи

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


Точка разрыва
Автор: Джим Браун
Жанр: Триллер

Дебютный роман талантливого американского журналиста, блестящего репортера «Ассошиэйтед Пресс». Впечатляющий триллер, созданный в духе «романов ужасов» Дина Кунца. После того как в городе появился таинственный бродяга, жители оказываются во власти необъяснимых, зловещих явлений природы и душераздирающих кровавых расправ…


Умный огород

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


Крик совы перед концом сезона

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


Другие книги автора
Галчонок
Жанр: Эротика

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


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

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


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

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


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

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