На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (8) « Первая ... 6 7 [8]  все  ( Перейти к последнему сообщению )  
> Visual Studio 2008 + COM Port
    Фух.. Запустилось. Толком и не понял в чем была проблема. Перезагрузил в системные папки Windows файлы .dll и в папки Lib и др. Visual Studio файлы скачанные из другого источника.
    Прикреплённая картинка
    Прикреплённая картинка
      Цитата Acvarif @
      Фух.. Запустилось.

      :good: :victory:
        По ходу возник актуальный вопрос. Если возникнет необходимость на GLUT нарисовать весь интерфейс с сеткой, кнопками, окнами прокрутки - можно-ли будет управлять кнопками, окнами с помощью мышки и клавиатуры? Или можно-ли встроить интерфейс сделанный в MFC в графическое окно GLUT?
        Сообщение отредактировано: Acvarif -
          Цитата Acvarif @
          Или можно-ли встроить интерфейс сделанный в MFC в графическое окно GLUT?

          У GLUT есть свой цикл обработки сообщений, как их совместить с MFC циклом хз. Надо лезть в сорсы глут и изучать.
            Можно-ли поместить окно GLUT в окно Edit Contol MFC? Или просто жестко привязать - разместить на форме MFC.
              Glut неплохо все рисует.
              Прикреплённая картинка
              Прикреплённая картинка

              Но возникла проблема с прорисовкой движения мети (зеленая полоска на изображении).
              Оказалось, что функция glutMainLoop() не имеет возврата. Если она вызывается, например, в потоке рисования то на ней все и застревает.
              ExpandedWrap disabled
                // сетка с меткой
                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_динамическое?
                думаю надо юзать glutIdleFunc и передать ей колбяк функцию:
                ExpandedWrap disabled
                  void MyIdleProc()
                      /* Код, который меняет переменные, определяющие следующий кадр */ 
                      .... 
                  }; 
                   
                  void MyDisplayProc()
                      /* Код OpenGL, который отображает кадр */ 
                      .... 
                      /* После отрисовки мы переставляем (заменяем) буфера */ 
                      glutSwapBuffers(); 
                  }; 
                   
                  void main(int argcp, char **argv)
                  {
                      ....
                   
                      /* Регистрация вызываемых функций */ 
                      glutDisplayFunc(MyDisplay);
                      glutIdleFunc(MyIdle);
                      
                      /* Запуск механизма обработки событий */ 
                      glutMainLoop(); 
                  }
                Сообщение отредактировано: Cfon -
                  Спасибо. Пробую так. Весь код в файле MFCtestDlg.cpp
                  ExpandedWrap disabled
                    ...
                    int x = 0, y = 0;
                    int counterTr;
                    ...
                    void Idle()
                    {
                      /* Код, который меняет переменные, определяющие следующий кадр */
                      x = x + 5;
                    }

                  Функция тображающая сетку с меткой в координатах x y
                  ExpandedWrap disabled
                    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();  
                    }


                  Далее поток рисования
                  ExpandedWrap disabled
                    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. Не врубаюсь, что я сделал не верно?
                  Сообщение отредактировано: Acvarif -
                    Спасибо. Работает. Метка начала двигаться. По поводу встраивания окна Glut в MFC http://www.codeguru.com/cpp/cpp/cpp_mfc/tu...trol.htm#page-2
                      :victory:
                        Цитата 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 (максимально упростил :D):
                        Прикреплённый файлПрикреплённый файлExample5.rar (67,49 Кбайт, скачиваний: 106)
                        Сообщение отредактировано: Cfon -
                          Спасибо за уточнение и пример.
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0473 ]   [ 21 queries used ]   [ Generated: 28.04.24, 16:30 GMT ]