Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.108.54] |
|
Страницы: (8) « Первая ... 6 7 [8] все ( Перейти к последнему сообщению ) |
Сообщ.
#106
,
|
|
|
Сообщ.
#107
,
|
|
|
Цитата Acvarif @ Фух.. Запустилось. |
Сообщ.
#108
,
|
|
|
По ходу возник актуальный вопрос. Если возникнет необходимость на GLUT нарисовать весь интерфейс с сеткой, кнопками, окнами прокрутки - можно-ли будет управлять кнопками, окнами с помощью мышки и клавиатуры? Или можно-ли встроить интерфейс сделанный в MFC в графическое окно GLUT?
|
Сообщ.
#109
,
|
|
|
Цитата Acvarif @ Или можно-ли встроить интерфейс сделанный в MFC в графическое окно GLUT? У GLUT есть свой цикл обработки сообщений, как их совместить с MFC циклом хз. Надо лезть в сорсы глут и изучать. |
Сообщ.
#110
,
|
|
|
Можно-ли поместить окно GLUT в окно Edit Contol MFC? Или просто жестко привязать - разместить на форме MFC.
|
Сообщ.
#111
,
|
|
|
Glut неплохо все рисует.
Прикреплённая картинка
Но возникла проблема с прорисовкой движения мети (зеленая полоска на изображении). Оказалось, что функция glutMainLoop() не имеет возврата. Если она вызывается, например, в потоке рисования то на ней все и застревает. // сетка с меткой void Display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_LINES); glColor3f(1.0, 1.0, 1.0); // по горизонтали for(int i = -WinWidth/2; i <= WinWidth/2; i += 5) { if(i%100 == 0 || i == 0) glColor3f(0.0, 1.0, 1.0); else glColor3f(0.5, 0.5, 0.5); glVertex2f(i, -WinHeight); glVertex2f(i, WinWidth); } glColor3f(0.5, 0.5, 0.5); // по вертикали for(int i = -WinWidth/2; i <= WinWidth/2; i += 100) { glVertex2f(-WinHeight, i); glVertex2f(WinHeight, i); } glEnd(); glColor3f( 0.0, 1.0, 0.0 ); glPolygonMode( GL_FRONT, GL_FILL ); glBegin( GL_POLYGON ); glVertex2i( x+0, y+1 ); glVertex2i( x+5, y+1 ); glVertex2i( x+5, y+0 ); glVertex2i( x+0, y+0 ); glEnd(); glFlush(); } //--------------------------------------------------------------------------- // Поток рисования DWORD WINAPI ImageThread(LPVOID lpParam) { counterRX = counterRX + 5; CString str_static10; // CWnd* pWnd = CWnd::FromHandle((HWND)lpParam); // получить указатель на IDC_STATIC10 CStatic* pText10 = (CStatic*)pWnd->GetDlgItem(IDC_STATIC10); str_static10.Format(_T("Прием %d"), counterRX); pText10->SetWindowText(str_static10); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, WinWidth, WinHeight); glutInitWindowSize(WinWidth, WinHeight); glutCreateWindow("Drawing with GLUT"); glutDisplayFunc(Display); glutMainLoop(); Sleep(1); return 0; } Для проверки в поток добавил счетчик counterRX с выводом на IDC_STATIC10. После запуска программы появляется рисунок но дальше явно все застревает на glutMainLoop(); поскольку счетчик останавливается на числе 5. При этом поток приема-передачи по COM работает нормально. Получается что в данном случае можно нарисовать только статическую картинку. Понимаю, что вопрос не в тему MFC, но может кто сталкивался с MFC+GLUT и динамическими картинками. Как решить вопрос MFC+GLUT_динамическое? |
Сообщ.
#112
,
|
|
|
думаю надо юзать glutIdleFunc и передать ей колбяк функцию:
void MyIdleProc() { /* Код, который меняет переменные, определяющие следующий кадр */ .... }; void MyDisplayProc() { /* Код OpenGL, который отображает кадр */ .... /* После отрисовки мы переставляем (заменяем) буфера */ glutSwapBuffers(); }; void main(int argcp, char **argv) { .... /* Регистрация вызываемых функций */ glutDisplayFunc(MyDisplay); glutIdleFunc(MyIdle); /* Запуск механизма обработки событий */ glutMainLoop(); } |
Сообщ.
#113
,
|
|
|
Спасибо. Пробую так. Весь код в файле MFCtestDlg.cpp
... int x = 0, y = 0; int counterTr; ... void Idle() { /* Код, который меняет переменные, определяющие следующий кадр */ x = x + 5; } Функция тображающая сетку с меткой в координатах x y void Display() { /* Код OpenGL, который отображает кадр */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2, -1.0, 1.0); // горизонтальные и вертикальные линии сетки glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_LINES); glColor3f(1.0, 1.0, 1.0); // по горизонтали for(int i = -WinWidth/2; i <= WinWidth/2; i += 5) { if(i%100 == 0 || i == 0) glColor3f(0.0, 1.0, 1.0); else glColor3f(0.5, 0.5, 0.5); glVertex2f(i, -WinHeight); glVertex2f(i, WinWidth); } glColor3f(0.5, 0.5, 0.5); // по вертикали for(int i = -WinWidth/2; i <= WinWidth/2; i += 100) { glVertex2f(-WinHeight, i); glVertex2f(WinHeight, i); } glEnd(); // зеленая мета с координатами x, y glColor3f( 0.0, 1.0, 0.0 ); glPolygonMode( GL_FRONT, GL_FILL ); glBegin( GL_POLYGON ); glVertex2i( x+0, y+2 ); glVertex2i( x+5, y+2 ); glVertex2i( x+5, y+0 ); glVertex2i( x+0, y+0 ); glEnd(); glFlush(); /* После отрисовки мы переставляем (заменяем) буфера */ glutSwapBuffers(); } Далее поток рисования DWORD WINAPI ImageThread(LPVOID lpParam) { // контроль работы потока по изменению counterRX counterTr = counterTr + 5; CString str_static10; // CWnd* pWnd = CWnd::FromHandle((HWND)lpParam); // получить указатель на IDC_STATIC10 CStatic* pText10 = (CStatic*)pWnd->GetDlgItem(IDC_STATIC10); //вывести сообщение об этом в строке состояния str_static10.Format(_T("Прием %d"), counterTr); pText10->SetWindowText(str_static10); // выполняется один раз после запуса программы if(!win) { win = 1; glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, WinWidth, WinHeight); glutInitWindowSize(WinWidth, WinHeight); glutCreateWindow("Drawing with GLUT"); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } // вызов функций рисования Display и смены координаты x Idle glutDisplayFunc(Display); glutIdleFunc(Idle); glutMainLoop(); Sleep(1); return 0; } Все прорисовывается нормально, но застревает на glutMainLoop() Счетчик counterTr останавливается на положении 5. Не врубаюсь, что я сделал не верно? |
Сообщ.
#114
,
|
|
|
Спасибо. Работает. Метка начала двигаться. По поводу встраивания окна Glut в MFC http://www.codeguru.com/cpp/cpp/cpp_mfc/tu...trol.htm#page-2
|
Сообщ.
#115
,
|
|
|
|
Сообщ.
#116
,
|
|
|
Цитата Acvarif @ По поводу встраивания окна Glut в MFC http://www.codeguru.com/cpp/cpp/cpp_mfc/tu...trol.htm#page-2 Хочу внести уточнение, на самом деле GLUT это независимая от платформы библиотека со своей оконной системой, поэтому ее нельзя было встроить в окно MFC или еще куда. А пример по ссылке приводится описание интеграции OpenGL и GLU (это не GLUT) в MFC через механизм Windows GL (WGL) На самом деле это даже более правильный способ использования OpenGL с MFC GLUT как правило используется в программировании игр, ну и хорошо подходит для изучения OpenGL. Сделал пример отрисовки OpenGL в окно MFC (максимально упростил ): Прикреплённый файлExample5.rar (67,49 Кбайт, скачиваний: 106) |
Сообщ.
#117
,
|
|
|
Спасибо за уточнение и пример.
|