128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
1

OpenGL: Как рисовать на уже существующей форме?

21.02.2012, 23:34. Показов 14211. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пишу програмку, где нужна визуализация приходящих данных, решил для этого использовать OpenGL, перерыл кучу книжек и форумов, везде есть исходники и объяснения только под консоль:
во время выполнения консоли создается новое окно вижуала, в котором происходит прорисовка линий, точек и всего остального.
Мне же надо на уже существующей форме выдать область, где и рисовать линии по заданным координатам, как это сделать - я не понял, может кто помочь подсказкой или примером?

VisualStudio2008, лицензия.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2012, 23:34
Ответы с готовыми решениями:

VisualStudio2008: Как рисовать линии в уже существующей форме?
Здравствуйте, пишу програмку, где нужна визуализация приходящих данных, решил для этого...

Добавить поле загрузки файлов к уже существующей форме
Здравствуйте! Появился такой вопрос. Я создаю блог. У меня есть форма для создания постов. Я хочу...

Как создать ячейку в уже существующей таблице
Извеняюсь за такой глупый вопрос, но как создать ячейку в уже существующей таблице? Т.е есь таблица...

Как рисовать на уже отрисованном QGraphicsItem?
QGraphicsLineItem *myLine = scene->addLine(10,10,25,25,QPen(Qt::black,3)); Подскажите, как после...

21
Заблокирован
Автор FAQ
22.02.2012, 13:41 2
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от KokosSPb Посмотреть сообщение
Здравствуйте, пишу програмку, где нужна визуализация приходящих данных, решил для этого использовать OpenGL, перерыл кучу книжек и форумов, везде есть исходники и объяснения только под консоль:
во время выполнения консоли создается новое окно вижуала, в котором происходит прорисовка линий, точек и всего остального.
Мне же надо на уже существующей форме выдать область, где и рисовать линии по заданным координатам, как это сделать - я не понял, может кто помочь подсказкой или примером?
VisualStudio2008, лицензия.
- очень просто используйте библиотеку Glaux.lib
Вот вам простенькой код использования консоли с окном OpenGL
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <windows.h>
#include "GL/gl.h"
#include "GL/glu.h"
#include "GL/glaux.h"
 
#pragma comment (lib,"Opengl32.lib")
#pragma comment (lib,"Glaux.lib")
 
extern "C" long _ftol( double ); //defined by VC6 C libs
extern "C" long _ftol2( double dblSource ) { return _ftol( dblSource ); }
 
 
void CALLBACK display(void); 
 
int main(int argc, char** argv)
{
    auxInitDisplayMode (AUX_SINGLE | AUX_RGB);
    auxInitPosition (0, 0, 500, 500);
    auxInitWindow ("Line 2D");
    auxMainLoop(display);
    return 0;
}
 
void CALLBACK display(void)
{
    glBegin(GL_LINES); 
    glVertex2f (0,0); 
    glVertex2f (100,100); 
    glEnd();
    glFlush();
}
PS:Код рассчитан под VisualStudio
3
Заблокирован
Автор FAQ
23.02.2012, 00:00 3
Вот проект, по моему в 9-ке Майкрос убрал GL из пакета(((, чтож прийдётся таскать либы с проектом или скопировать в стандартные каталоги, ниже рабочий проект
Миниатюры
OpenGL: Как рисовать на уже существующей форме?  
Вложения
Тип файла: rar GL_proj.rar (136.0 Кб, 188 просмотров)
2
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
23.02.2012, 23:16  [ТС] 4
Вопрос не решен он всё равно создает новую форму, а вот предположим у меня уже есть форма Form1, и в .cpp файле у меня она подключена (естественно),
C++
1
#include <Form1.h>
, далее я хочу нарисовать, предположим линию, уже именно на этой форме, где у меня есть свои элементы управления, кнопки и так далее
0
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
24.02.2012, 00:30 5
KokosSPb,а зачем тебе OpenGL,если ты хочешь рисовать на окне линии,окружности и тд?Для этого легче использовать GDI
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
24.02.2012, 08:54  [ТС] 6
Цитата Сообщение от bretba Посмотреть сообщение
KokosSPb,а зачем тебе OpenGL,если ты хочешь рисовать на окне линии,окружности и тд?Для этого легче использовать GDI
Просто далее я буду использовать OpenGL, мне нужно будет брать область экрана и перерисовывать её на пиксель левее, конечно можно рисовать через GDI, а потом переносить через OpenGL можно попробовать

Добавлено через 2 минуты
+ хочется сделать кроссплатформенную базу
0
Заблокирован
Автор FAQ
24.02.2012, 10:27 7
KokosSPb, тебе надо "врубить" контекст GL в контекст формы???Никак не возьму в толк что ж тебе надо
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
24.02.2012, 10:43  [ТС] 8
Вот предположим форма как на картинке, и синим выделена часть под работу с OpenGL
Миниатюры
OpenGL: Как рисовать на уже существующей форме?  
0
-=ЮрА=-
24.02.2012, 11:13
  #9

Не по теме:

Цитата Сообщение от KokosSPb Посмотреть сообщение
Вот предположим форма как на картинке, и синим выделена часть под работу с OpenGL
- хорошо будет тебе дочернее окно GL на форме(отпишусь как буду посвободней...)

1
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
25.02.2012, 11:26 10
На сколько я понял,ты хочешь изменить клиентную область окна.

C++
1
2
3
4
5
BOOL GetClientRect
( 
    HWND hWnd,      // указатель на окно
    LPRECT lpRect           // указатель на структуру с координатами
);
Вот функция работающая с клиентной областью.Если реализовать класс,который будет работать с "новой" клиентной областью,то можно сделать то,что ты хочешь.

Честно никогда такого не делал.
Можно просто сделать так:
К примеру вся клиентная область 300x300.А ты хочешь чтобы она была 100x100.В классе можно реализовать методы,которые будут работать с координатами клиентной области,и если рисование производится там где ты не хочешь,то просто установить запрет на это и рисовать только в координатах 100x100.
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
13.03.2012, 17:00  [ТС] 11
нашел сайт, там предлагают сделать заголовочный файл, в него впихнуть (пишу итоговое) "OpenGL.h":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#pragma once
 
#include <windows.h>
#include <GL/gl.h>    
 
using namespace System::Windows::Forms;
 
namespace OpenGLForm
{
    public ref class COpenGL: 
        public System::Windows::Forms::NativeWindow
            {
public:
    COpenGL(System::Windows::Forms::Form ^ parentForm, 
            GLsizei iWidth, GLsizei iHeight)
    {
        CreateParams^ cp = gcnew CreateParams;
 
        // Set the position on the form
        cp->X = 100;
        cp->Y = 100;
        cp->Height = iWidth;
        cp->Width = iHeight;
 
        // Specify the form as the parent.
        cp->Parent = parentForm->Handle;
 
        // Create as a child of the specified parent
        // and make OpenGL compliant (no clipping)
        cp->Style = WS_CHILD | WS_VISIBLE | 
                    WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
 
        // Create the actual window
        this->CreateHandle(cp);
 
        m_hDC = GetDC((HWND)this->Handle.ToPointer());
 
        if(m_hDC)
            MySetPixelFormat(m_hDC);
    }
 
virtual System::Void Render(System::Void)
{
    // Clear the color and depth buffers.
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f) ;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
 
System::Void SwapOpenGLBuffers(System::Void)
{
    SwapBuffers(m_hDC) ;
}
private:
    HDC m_hDC;
    HGLRC m_hglrc;
 
protected:
    ~COpenGL(System::Void)
    {
        this->DestroyHandle();
    }
 
    GLint MySetPixelFormat(HDC hdc)
    {
        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 
        }; 
    
        GLint  iPixelFormat; 
     
        // get the device context's best, available pixel format match 
        if((iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0)
        {
            MessageBox::Show("ChoosePixelFormat Failed");
            return 0;
        }
         
        // make that match the device context's current pixel format 
        if(SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
        {
            MessageBox::Show("SetPixelFormat Failed");
            return 0;
        }
    
        if((m_hglrc = wglCreateContext(m_hDC)) == NULL)
        {
            MessageBox::Show("wglCreateContext Failed");
            return 0;
        }
        
        if((wglMakeCurrent(m_hDC, m_hglrc)) == NULL)
        {
            MessageBox::Show("wglMakeCurrent Failed");
            return 0;
        }
    
        return 1;
    }
};
потом пишут:
Standard function to set a pixel format for a Win32 SDK / MFC Device Context. See OpenGL websites for more on this.

If you copy all of the snippets it should build fine, don't forget to add openGL32.lib, gdi32.lib, and User32.lib to your project (Project -> Properties -> Configuration -> All Configurations -> Linker -> Input).
я делаю это так:
C++
1
2
3
#pragma comment(lib, "opengl32.lib") 
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "user32.lib")
правильно?

Далее написано:
Open the code view to your form and add the header to your OpenGL class and add a member variable that is a pointer to the class in your Form. Next, change your Form's constructor:
я это делаю в файле form.h
#pragma once
#include "OpenGL.h"

namespace OpenGLWinForm {
правильно?

помогите пожалуйста

Microsoft VisualStudio 2008

Добавлено через 11 секундочек
сделал так: OpenGL.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#pragma once
 
#include <windows.h>
#include <GL/gl.h>    
#include <GL/glu.h> 
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "user32.lib")
 
using namespace System::Windows::Forms;
 
namespace OpenGLForm
{
    public ref class COpenGL: 
      public System::Windows::Forms::NativeWindow
          {
public:
    COpenGL(System::Windows::Forms::Form ^ parentForm, 
            GLsizei iWidth, GLsizei iHeight)
    {
        CreateParams^ cp = gcnew CreateParams;
 
        cp->X = 100;
        cp->Y = 100;
        cp->Height = iWidth;
        cp->Width = iHeight;
 
        cp->Parent = parentForm->Handle;
 
        cp->Style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
 
        this->CreateHandle(cp);
 
        m_hDC = GetDC((HWND)this->Handle.ToPointer());
 
        if(m_hDC)
            MySetPixelFormat(m_hDC);
    }
 
    virtual System::Void Render(System::Void)
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f) ;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
 
    System::Void SwapOpenGLBuffers(System::Void)
{
    SwapBuffers(m_hDC) ;
}
 
    private:
    HDC m_hDC;
    HGLRC m_hglrc;
 
    protected:
    ~COpenGL(System::Void)
    {
        this->DestroyHandle();
    }
    GLint MySetPixelFormat(HDC hdc)
    {
        PIXELFORMATDESCRIPTOR pfd = { 
            sizeof(PIXELFORMATDESCRIPTOR),
            1,                                
            PFD_DRAW_TO_WINDOW |
            PFD_SUPPORT_OPENGL |
            PFD_DOUBLEBUFFER,
            PFD_TYPE_RGBA,
            24,                   
            0, 0, 0, 0, 0, 0,   
            0,                     
            0,                     
            0,                     
            0, 0, 0, 0,          
            32,                   
            0,                     
            0,                     
            PFD_MAIN_PLANE,
            0,                      
            0, 0, 0                
        }; 
    
        GLint  iPixelFormat; 
     
 
        if((iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0)
        {
            MessageBox::Show("ChoosePixelFormat Failed");
            return 0;
        }
 
        if(SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
        {
            MessageBox::Show("SetPixelFormat Failed");
            return 0;
        }
    
        if((m_hglrc = wglCreateContext(m_hDC)) == NULL)
        {
            MessageBox::Show("wglCreateContext Failed");
            return 0;
        }
        
        if((wglMakeCurrent(m_hDC, m_hglrc)) == NULL)
        {
            MessageBox::Show("wglMakeCurrent Failed");
            return 0;
        }
    
        return 1;
    }
};
}
Form1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#pragma once
#include "OpenGL.h"
 
namespace OpenGLWinForm {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace OpenGLForm;
 
    /// <summary>
    /// Сводка для Form1
    ///
    /// Внимание! При изменении имени этого класса необходимо также изменить
    ///          свойство имени файла ресурсов ("Resource File Name") для средства компиляции управляемого ресурса,
    ///          связанного со всеми файлами с расширением .resx, от которых зависит данный класс. В противном случае,
    ///          конструкторы не смогут правильно работать с локализованными
    ///          ресурсами, сопоставленными данной форме.
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: добавьте код конструктора
            //
            OpenGL = gcnew COpenGL(this, 640, 480);
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
 
    private: System::ComponentModel::IContainer^  components;
     protected:
    private: System::Windows::Forms::Timer^  timer1;
 
    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
   
        OpenGLWinForm::COpenGL ^ OpenGL;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            this->components = (gcnew System::ComponentModel::Container());
            this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
            this->SuspendLayout();
            // 
            // timer1
            // 
            this->timer1->Enabled = true;
            this->timer1->Interval = 10;
            this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(795, 489);
            this->Name = L"Form1";
            this->Text = L"OpenGL on a Windows Form using Managed C++";
            this->ResumeLayout(false);
 
        }
        
#pragma endregion
    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e)
             {
                 UNREFERENCED_PARAMETER(sender);
                 UNREFERENCED_PARAMETER(e);
                 OpenGL->Render();
                 OpenGL->SwapOpenGLBuffers();
             }
    private: System::Void timer1_Tick_1(System::Object^  sender, System::EventArgs^  e) {
                 UNREFERENCED_PARAMETER(sender);
                 UNREFERENCED_PARAMETER(e);
                 OpenGL->Render();
                 OpenGL->SwapOpenGLBuffers();
             }
    };
   }
Но теперь выскакивает ошибка:
Необработанное исключение типа "System.NullReferenceException" произошло в OpenGLWinForm.exe

Дополнительные сведения: В экземпляре объекта не задана ссылка на объект.
и он её пишет явно на
C++
1
OpenGL->Render();
0
Заблокирован
Автор FAQ
14.03.2012, 14:25 12
KokosSPb, в правильном направлении работаешь, только нужно не главное окно преобразовывать а дочернее окно в главном(эт я тебе подсказку даю)
Прикрепляю готовый экзешник и скрин работы
Миниатюры
OpenGL: Как рисовать на уже существующей форме?  
Вложения
Тип файла: rar OpenGLInAPI.exe.rar (14.9 Кб, 284 просмотров)
0
JoeFantor
19.10.2012, 16:05 13
Не если получилось, то выложите исходный код программы!
OlgaS777
20.02.2013, 21:35 14
-=ЮрА=-, Как создать на уже существующей Windows Form форму для рисования OpenGl в Visual Studio? у меня форма создается, но на ней фигура не рисуется((OpenGL: Как рисовать на уже существующей форме? - тут у тебя получилось это осуществить, не мог бы ты скинуть исходник посмотреть? заранее спасибо.
Комп_Оратор)
Эксперт по математике/физике
8945 / 4699 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
20.02.2013, 22:34 15
Цитата Сообщение от KokosSPb Посмотреть сообщение
Open the code view to your form and add the header to your OpenGL class and add a member variable that is a pointer to the class in your Form. Next, change your Form's constructor:
Если я не ошибся, это значит, что в хэдере OpenGL-класса, нужен хэдер Form'ы (#include "Form1.h") , чтобы передать указатель (он в качестве аргумента конструктора объявлен) :
Только тогда аргумент объявленный как ук. на базовый:
System::Windows::Forms::Form^ parentForm
примет указатель Form1^ myComcretForm при вызове и возможно, перед извлечением нативного дескриптора окна, нужно будет явно преобразовать parentForm к Form1^ , вроде:
dynamic_cast<Form1^>( parent_form )->Handle;
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
21.02.2013, 01:26 16
Цитата Сообщение от bretba Посмотреть сообщение
KokosSPb,а зачем тебе OpenGL,если ты хочешь рисовать на окне линии,окружности и тд?Для этого легче использовать GDI
Вот это правильный ответ .

Ребята не занимайтесь ерундой . Зачем в OpenGL WinForm ?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
21.02.2013, 06:43 17
Лучший ответ Сообщение было отмечено как решение

Решение

Как вариант, для NET есть библиотека Tao Framework, можно использовать OpenGL
c ее помощью
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#pragma once
 
namespace TaoFrameworkCLI {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace Tao::OpenGl;
    using namespace Tao::FreeGlut;
    using namespace Tao::Platform::Windows;
 
    /// <summary>
    /// Сводка для Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: добавьте код конструктора
            //          
            MyInitializeComponent();
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::Button^  button2;
    private: Tao::Platform::Windows::SimpleOpenGlControl^ glControl;
 
    private: System::ComponentModel::IContainer^  components;
    protected: 
 
    private:
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
 
        #pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            this->SuspendLayout();
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(284, 262);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);
 
        }
#pragma endregion
 
#pragma region 
    
        void MyInitializeComponent(void)
        {
            this->glControl = gcnew Tao::Platform::Windows::SimpleOpenGlControl();
            this->glControl->InitializeContexts();
            this->glControl->Location = Point(0, 0);
            this->glControl->Dock = DockStyle::Fill;
            this->glControl->Visible = true;
            // 
            // SimpleOpenGlControl
            //
            this->button1 = (gcnew System::Windows::Forms::Button());
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(210, 195);
            this->button1->Text = L"Show";
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // Form1
            // 
            this->ClientSize = System::Drawing::Size(304, 262);
            this->Controls->Add(this->button1);
            this->Controls->Add(this->glControl);
 
            this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
 
        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
                Gl::glLoadIdentity();
                Gl::glColor3f( 0.1f, 0.7f, 1.0f);
 
                Gl::glPushMatrix();
                Gl::glTranslated(0,0,-6);
                Gl::glRotated(45, 1, 1, 0);
 
                Glut::glutWireSphere(2, 32, 32);
 
                Gl::glPopMatrix();
                Gl::glFlush();
                this->glControl->Invalidate();
             }
    
    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
            
        Glut::glutInit();
        Glut::glutInitDisplayMode(Glut::GLUT_RGB | Glut::GLUT_DOUBLE | Glut::GLUT_DEPTH);
 
        Gl::glViewport(0, 0, glControl->Width, glControl->Height);
 
        Gl::glMatrixMode(Gl::GL_PROJECTION);
        Gl::glLoadIdentity();
        Glu::gluPerspective(45, (float)glControl->Width / (float)glControl->Height, 0.1, 200);
        Gl::glMatrixMode(Gl::GL_MODELVIEW);
        Gl::glLoadIdentity();
        Gl::glEnable(Gl::GL_DEPTH_TEST);
             }
};
}
Миниатюры
OpenGL: Как рисовать на уже существующей форме?  
3
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
25.02.2013, 12:44  [ТС] 18
Долго копался в интернете, не нашел книг по GDI для С++ Visual Studio, только по Delphi, может кто подскажет чего полезного?

Добавлено через 1 час 12 минут
Кликните здесь для просмотра всего текста
error C2039: FreeGlut: не является членом "Tao"


это на строчку
C++
1
using namespace Tao::FreeGlut;
Добавлено через 1 час 57 минут
или GDI это конкретно WinAPI?
0
Заблокирован
Автор FAQ
25.02.2013, 13:22 19
Цитата Сообщение от KokosSPb Посмотреть сообщение
или GDI это конкретно WinAPI?
GDI это ГДИ а API это API, другое дело, что у мелкоcофта с windows.h тянутся и АПИ и ГДИ функции, вот и выходит что любой проект АПИ автоматом поддерживает GDI, вот почитай
http://ru.wikipedia.org/wiki/GDI
http://ru.wikipedia.org/wiki/И... приложений

Не по теме:

KokosSPb, ты же ведь уже умеешь рисовать GL-ем в окне, что в шарпе не даёт сделать такую же дырку в контексте окна как для разобранного нами проекта?

1
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
25.02.2013, 15:12 20
Цитата Сообщение от KokosSPb Посмотреть сообщение
может кто подскажет чего полезного?
MSDN http://msdn.microsoft.com/ru-r... fascx.aspx

Цитата Сообщение от KokosSPb Посмотреть сообщение
это на строчку
Что не понятно ? Просит Freeglut

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Не по теме:
KokosSPb, ты же ведь уже умеешь рисовать GL-ем в окне, что в шарпе не даёт сделать такую же дырку в контексте окна как для разобранного нами проекта?
Хорошая идея но
ИМХО не легкое это дело .NET классы соединять с OpenGl

KokosSPb, определитесь что вам нужно :

2D - значит винформс GDI достаточно

Если трехмерное изображение .
То TAO Framework задействовать
есть и др варианты для .NET , тут гугл в помощь .
Можно и WPF .

Если кроссплатформ то о каком .NET может идти речь
OpenGL и никаких винформс .
1
25.02.2013, 15:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2013, 15:12
Помогаю со студенческими работами здесь

Как рисовать в С++ средствами OpenGL
Здравствуйте! Мне необходимо нарисовать треугольник в WinApi. У меня в программе выводится окно с...

Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде
Привет! Есть mysql3.sqlite (импортировал данные из csv). Нужно из приложения подключится к sqlite...

Как с помощью OpenGL рисовать на TBitmap?
Доброго времени суток. Может кому то покажется поставленный ниже вопрос глупым, но я на него...

Как рисовать текстуру и квадрат (GLUT и OpenGL)
Я хочу нарисовать текстуру и квадрат, но цвета не корректно отображаются. Если я удаляю Таймер,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru