Модераторы: Rickert, Alexeis, BorisVorontsov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окно для OpenGL и окно MFC 
:(
    Опции темы
Reptor
Дата 19.5.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Я вот токо вот начинаю изучать MFC и ещё OpenGL. Так вот у меня такой вопрос ну и задача:

Мне необходимо нарисовать какуюто фигуру в OpenGL но проблема не в этом проблема в том что наскоко я понял OpenGL создаёт своё окно для рисования а если делать какето GUI на MFC то там же окно по 2-ому создается.

Так вот мне надо что было место где рисовалась фигура и какието контролы для того что б ей управлять - это к примеру какойто toolBar с какимито кнопками маштабирвания поворота ну и тому подобное. 

Так вот как мне объеденить это всё в одно приложение. 
PM MAIL ICQ   Вверх
Graf_h
Дата 19.5.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



Цитата(Reptor @  19.5.2008,  15:46 Найти цитируемый пост)
OpenGL создаёт своё окно для рисования а если делать какето GUI на MFC то там же окно по 2-ому создается.

кто сказал что по другому? В Windows все окна одинаково создаются


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Reptor
Дата 19.5.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Graf_h, нет ну я не имел в виду по другому в плане кода по 2-ому. Ну или как в OpenGL  
Код

glutInit(&argc,argv);


а обычное окно в MFC что то типа такого (часть кода)

Код

BOOL CMyApp::InitInstance() // стандартная инициализация
{
m_pMainWnd=new CMainWnd();// создать класс окна
ASSERT(m_pMainWnd);// проверить его правильность
m_pMainWnd->ShowWindow(SW_SHOW);// Показать окно
m_pMainWnd->UpdateWindow();// Обновить окно
return TRUE;// Вернуть что все нормально
};

CMyApp theApp;


Добавлено через 22 секунды
это я так понимаю
PM MAIL ICQ   Вверх
Graf_h
Дата 19.5.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



Цитата(Reptor @  19.5.2008,  16:04 Найти цитируемый пост)
Graf_h, нет ну я не имел в виду по другому в плане кода по 2-ому. Ну или как в OpenGL  код C++1:glutInit(&argc,argv);

Это просто интерфейс для создания окна, реально оно также создается!Если очень нужно могу написать код окна для опенЖЛ! насчет контролов, то с ними в VisualC++ работать не приходилось, по мне так Borland C++ проще! хотя и  Visual C++ также есть готовые компоненты! 


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Reptor
Дата 19.5.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



 Graf_h, код окна для опенЖЛ я знаю как делать и знаю как в MFC тоже делать окна и кнопки а вот как это соеденить я что то не понимаю 
PM MAIL ICQ   Вверх
Solomon
Дата 19.5.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 471
Регистрация: 23.1.2006
Где: Украина Киев

Репутация: нет
Всего: 2



Когда мне подобное надо было я использовал немодальные окна.. т.е. само окно OpenGL, и отдельно создаешь еще одно типа как панелька в томже photoshop...


--------------------
Если не идти до конца к поставленным целям и не пытатся их достигнуть, каким бы тяжелым не казался путь, то лучше и не ставь их перед собой, но тот кто не ставит перед собой труднодоступные цели, никогда не ощутит эйфорию настоящей победы... победы над миром...
Соломон 2008
PM MAIL ICQ GTalk YIM   Вверх
bronislav
Дата 19.5.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Для того, чтобы включить инициализировать OpenGL в окне MFC надо действовать немного по другому, например так:
  1. Создаем Single Document
  2. Добавляем для линковки библиотеки OpenGL: glu32.lib, glaux.lib, opengl32.lib
  3. В файле stdafx.h добавляем заголовочные файлы
    Код

    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <gl\glaux.h>
  4. Устанавливаем стили окна для работы с OpenGL
    В функцию PreCreateWindow (класс C...View) добавляем следующий код
    Код

    //функция ав-томатически вызывается перед созданием окна приложения
    BOOL CView::PreCreateWindow(CREATESTRUCT& cs) 
    {     
        // TODO: Modify the Window class or styles here by modifying
        //  the CREATESTRUCT cs
        //устанавливаем  стили окна, необходимые для работы с OpenGL
        cs.style|=(WS_CLIPCHILDREN|WS_CLIPSIBLINGS); 
        return CView::PreCreateWindow(cs);
    }
  5. Описываем переменные для хранения размеров экрана и переменные для контекстов устройств
    В класс C...View добавляем переменные в секцию public:
    Код

    HGLRC hrc;
    CDC m_pdc;
    int windH;
    int windW;
  6. Настраиваем формат пикселей, выбираем контекст устройства и создаем на его основе контекст воспроизведения для работы с OpenGL
    В функцию C...View::OnCreate добавляем код
    Код

    //функция об-работки сообщения "Создание окна"
    int CView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CView::OnCreate(lpCreateStruct)==-1)
            return -1;
        // TODO: Add your specialized creation code here
        //Настраиваем формат пикселей для работы с OpenGL
        PIXELFORMATDESCRIPTOR pfd; //структура для описания формата пикселей
        memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR)); //для начала за-полняем все значения структуры нулями
        //Начинаем заполнение нужных нам значений структуры:
        pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); //размер структуры, ус-танавливаем равным размеру типа PIXELFORMATDESCRIPTOR
        pfd.nVersion=1;        //номер версии, для работы с OpenGL ставим 1
        pfd.dwFlags = PFD_DRAW_TO_WINDOW |           //рисовать в окне
        PFD_SUPPORT_OPENGL |                   //поддержка OpenGL
        PFD_DOUBLEBUFFER;                       //двойная буферизация
        pfd.iPixelType=PFD_TYPE_RGBA;    //режим для отображения цветов – цветовая  модель RGBA
        pfd.cColorBits=32;           //32-битовая глубина цвета
        pfd.cAlphaBits=8;            //компонента альфа цвета
        pfd.cAccumBits=32;        //буфер аккумулятора
        pfd.cDepthBits=32;         //буфер глубины (z- буфер)
        pfd.cStencilBits=8;         //трафарет
        pfd.iLayerType=PFD_MAIN_PLANE;            //тип плоскости – основная
        m_pdc=GetDC();                                           //создаем контекст устройства
        //Исходя из настройки пикселей и созданного контекста уст-ройства, получаем оптимальный, наиболее совпадающий с требуемым, формат пикселей:
        int nPixelFormat=ChoosePixelFormat(m_pdc->m_hDC,&pfd);
        if (nPixelFormat==0)
        {
            MessageBox("Ошибка при выборе формата пикселей");
            return FALSE;
        }
        BOOL bResult=SetPixelFormat(m_pdc->m_hDC,nPixelFormat,&pfd);
        //Устанавливаем полученный формат пикселей:
        if (!bResult)
        {
            MessageBox("Ошибка при установке формата пикселей");
            return FALSE;
        }
        if ((hrc=wglCreateContext(m_pdc->m_hDC))==NULL) //на основе контекста устройства создаем контекст воспроизведения
        return FALSE;
        if (wglMakeCurrent(m_pdc->m_hDC,hrc)==FALSE) //делаем его текущим
            return FALSE; 
        return 0;
    }
  7. Обеспечиваем удаление из памяти выбранных контекстов при завершении работы
    В функцию C...View::OnDestroy добавляем код
    Код

    //функция обработки сообщения "Уничтоже-ние окна"
    void CView::OnDestroy()
    {
        // TODO: Add your message handler code here
        //Убираем из текущего и удаляем контекст воспроизведения
        if (hrc==::wglGetCurrentContext()) //запрашиваем текущий контекст вос-произведения
        {
            wglMakeCurrent(NULL,NULL);         //делаем его не текущим
            wglDeleteContext(hrc);                     //удаляем контекст воспроизведения
            hrc=NULL;
        }
        CView::OnDestroy();       //для корректного завершения работы передаем управление вверх по иерархии
    }
  8. Определяем функцию для выделения прямоугольной области рисования командами OpenGL
    В класс С...View добавляем функцию InitViewport
    Код

    void CView::InitViewport(int x, int y, int width, int height)
    {
        glViewport(x, y, width, height);                                      //задаем видовое окно
        glMatrixMode(GL_PROJECTION);  //определяем матрицу проецирования
        glLoadIdentity();                                   //делаем ее единичной
        gluOrtho2D(-width/4, width/4, -height/2, height/2);   //задаем матрицу 2-х мерной ортографической проекции (окно отсечения),  коэффици-енты в знаменателе масштабируют изображение
        glMatrixMode(GL_MODELVIEW);           //режим работы с матрицей вида
    }
  9. Добавляем операторы для рисования
    В функцию OnDraw добавляем код
    Код

    void CView::OnDraw(CDC* pDC)
    {
        // TODO: add draw code for native data here
        CRect ClientRect;                //описываем переменную типа прямоугольник
        GetClientRect(&ClientRect);
        //определяем длину и ширину окна на основе его координат
        windW=abs(ClientRect.right-ClientRect.left);
        windH=abs(ClientRect.top-ClientRect.bottom);
        glClearColor(0.75, 0.75, 0.75, 1.0);   //задаем цвет фона окна, например, светло-серый
        glClear(GL_COLOR_BUFFER_BIT);                  //устанавливаем цвет фона
        InitViewport(0,0, windW, windH); //устанавливаем параметры видового окна
        glColor3f(1., 0., 0.);              //задаем цвет рисования, например, красный
        //далее следуют команды построения изображения
        //ВНИМАНИЕ ! В конце функции OnDraw обязательно бло-кируем выполнение программы до полного завершения всех вышеука-занных команд:
        glFinish();           //или       glFlush();
        SwapBuffers(wglGetCurrentDC()); //обеспечиваем перезапись содержимого внеэкранного буфера на экранный (основной)
    }
Если, что-то непонятно - пиши, буду исправлять

Это сообщение отредактировал(а) bronislav - 21.5.2008, 15:27


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Graf_h
Дата 20.5.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



bronislav, автор темы говорит что умеет все это делать! Он просто не может скомпоновать! Но если честно, я так и не понял что именно у него не получается


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
bronislav
Дата 20.5.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Цитата(Graf_h @ 20.5.2008,  14:14)
bronislav, автор темы говорит что умеет все это делать! Он просто не может скомпоновать! Но если честно, я так и не понял что именно у него не получается

Судя по использования библиотеки glut и него не получается рисовать в окне MFC (т.к. glut создает свое окно).

Мой же код позволяет рисовать непосредственно в окне MFC не создавая дополнительных окон.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Reptor
Дата 20.5.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



Graf_h, да я умею это делать но када оно всё отдельно.

Цитата

Судя по использования библиотеки glut и него не получается рисовать в окне MFC (т.к. glut создает свое окно).


Во в этом у меня была и проблема мне надо было опенЖЛ как то импортировать или вшить в MFC
bronislav, спасибо попробую разобраться что к чему.

Ди и сорри если неккоректно задал вопрос.

Добавлено через 56 секунд
bronislav,  да и ещё я тут смогу добовлять меню и тулбар ну может ещё что понадобится?
PM MAIL ICQ   Вверх
Rickert
Дата 21.5.2008, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Я сам неделю назад инжектил OGL в MFC. Мне надо было на модальном окне разложить 4 контекста OGL'а. Решается это просто: создаёшь на форме 4 статика и к при инициалиазции OGL подсовываешься вместо контекста устройства окна - контекст устройства статика.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Reptor
Дата 21.5.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



bronislav, а можно попросить приатаченный уже готовый файл? так как у меня не получается что то собрать это.
PM MAIL ICQ   Вверх
bronislav
Дата 21.5.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Цитата(Reptor @  21.5.2008,  15:22 Найти цитируемый пост)
bronislav, а можно попросить приатаченный уже готовый файл?


Конечно

Это сообщение отредактировал(а) bronislav - 21.5.2008, 15:25

Присоединённый файл ( Кол-во скачиваний: 87 )
Присоединённый файл  empty_project.zip 52,67 Kb


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
ProfessorBraz
Дата 23.5.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 17.7.2007

Репутация: нет
Всего: нет



Где бы взять такойже примерчик, только для Борланд С++? Может поделиться кто, т.к. такаяже ситуация, хочется рисовать во фрейме Виндовского окна.

PM MAIL   Вверх
bronislav
Дата 23.5.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



Цитата(ProfessorBraz @  23.5.2008,  18:45 Найти цитируемый пост)
Где бы взять такойже примерчик, только для Борланд С++? Может поделиться кто, т.к. такаяже ситуация, хочется рисовать во фрейме Виндовского окна.


Посмотри в прилагающихся примерах.
Насколько я знаю там есть пример использования OpenGL.



--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.