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

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

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

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

VisualStudio2008, лицензия.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2012, 23:34
Ответы с готовыми решениями:

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

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

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

21
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.02.2012, 13:41
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от 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
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.02.2012, 00:00
Вот проект, по моему в 9-ке Майкрос убрал GL из пакета(((, чтож прийдётся таскать либы с проектом или скопировать в стандартные каталоги, ниже рабочий проект
Миниатюры
OpenGL: Как рисовать на уже существующей форме?  
Вложения
Тип файла: rar GL_proj.rar (136.0 Кб, 188 просмотров)
2
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
23.02.2012, 23:16  [ТС]
Вопрос не решен он всё равно создает новую форму, а вот предположим у меня уже есть форма Form1, и в .cpp файле у меня она подключена (естественно),
C++
1
#include <Form1.h>
, далее я хочу нарисовать, предположим линию, уже именно на этой форме, где у меня есть свои элементы управления, кнопки и так далее
0
 Аватар для bretba
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
24.02.2012, 00:30
KokosSPb,а зачем тебе OpenGL,если ты хочешь рисовать на окне линии,окружности и тд?Для этого легче использовать GDI
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
24.02.2012, 08:54  [ТС]
Цитата Сообщение от bretba Посмотреть сообщение
KokosSPb,а зачем тебе OpenGL,если ты хочешь рисовать на окне линии,окружности и тд?Для этого легче использовать GDI
Просто далее я буду использовать OpenGL, мне нужно будет брать область экрана и перерисовывать её на пиксель левее, конечно можно рисовать через GDI, а потом переносить через OpenGL можно попробовать

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

Не по теме:

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

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

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  [ТС]
нашел сайт, там предлагают сделать заголовочный файл, в него впихнуть (пишу итоговое) "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
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
14.03.2012, 14:25
KokosSPb, в правильном направлении работаешь, только нужно не главное окно преобразовывать а дочернее окно в главном(эт я тебе подсказку даю)
Прикрепляю готовый экзешник и скрин работы
Миниатюры
OpenGL: Как рисовать на уже существующей форме?  
Вложения
Тип файла: rar OpenGLInAPI.exe.rar (14.9 Кб, 284 просмотров)
0
JoeFantor
19.10.2012, 16:05
Не если получилось, то выложите исходный код программы!
OlgaS777
20.02.2013, 21:35
-=ЮрА=-, Как создать на уже существующей Windows Form форму для рисования OpenGl в Visual Studio? у меня форма создается, но на ней фигура не рисуется((OpenGL: Как рисовать на уже существующей форме? - тут у тебя получилось это осуществить, не мог бы ты скинуть исходник посмотреть? заранее спасибо.
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.02.2013, 22:34
Цитата Сообщение от 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
Цитата Сообщение от bretba Посмотреть сообщение
KokosSPb,а зачем тебе OpenGL,если ты хочешь рисовать на окне линии,окружности и тд?Для этого легче использовать GDI
Вот это правильный ответ .

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

Решение

Как вариант, для 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  [ТС]
Долго копался в интернете, не нашел книг по GDI для С++ Visual Studio, только по Delphi, может кто подскажет чего полезного?

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


это на строчку
C++
1
using namespace Tao::FreeGlut;
Добавлено через 1 час 57 минут
или GDI это конкретно WinAPI?
0
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.02.2013, 13:22
Цитата Сообщение от 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
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2013, 15:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru