формы — Как сделать фрейм openGL в C ++ Builder?

Я хочу инициализировать фрейм openGL внутри формы в C ++ Builder. Я попытался скопировать содержимое данного кода запуска openGL, приведенного здесь: http://edn.embarcadero.com/article/10528
Я попытался заменить TForm1 на TFrame1, а затем поместить его в дизайн формы, но это не сработало. Как это сделать правильно, есть опыт с этим?

0

Решение

просто, просто используйте TForm::Handle в качестве ручки окна …

Вот какой-то мой древний пример в BCB5 портирован на BDS2006:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"#include <gl/gl.h>
#include <gl/glu.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"TForm1 *Form1;
//---------------------------------------------------------------------------
int TForm1::ogl_init()
{
if (ogl_inicialized) return 1;
hdc = GetDC(Form1->Handle);             // get device context
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory( &pfd, sizeof( pfd ) );      // set the pixel format for the DC
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 24;
pfd.iLayerType = PFD_MAIN_PLANE;
SetPixelFormat(hdc,ChoosePixelFormat(hdc, &pfd),&pfd);
hrc = wglCreateContext(hdc);            // create current rendering context
if(hrc == NULL)
{
ShowMessage("Could not initialize OpenGL Rendering context !!!");
ogl_inicialized=0;
return 0;
}
if(wglMakeCurrent(hdc, hrc) == false)
{
ShowMessage("Could not make current OpenGL Rendering context !!!");
wglDeleteContext(hrc);          // destroy rendering context
ogl_inicialized=0;
return 0;
}
ogl_resize();
glEnable(GL_DEPTH_TEST);                // Zbuf
glDisable(GL_CULL_FACE);                // vynechavaj odvratene steny
glDisable(GL_TEXTURE_2D);               // pouzivaj textury, farbu pouzivaj z textury
glDisable(GL_BLEND);                    // priehladnost
glShadeModel(GL_SMOOTH);                // gourard shading
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);   // background color
ogl_inicialized=1;
return 1;
}
//---------------------------------------------------------------------------
void TForm1::ogl_exit()
{
if (!ogl_inicialized) return;
wglMakeCurrent(NULL, NULL);     // release current rendering context
wglDeleteContext(hrc);          // destroy rendering context
ogl_inicialized=0;
}
//---------------------------------------------------------------------------
void TForm1::ogl_draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

float x=0.5,y=0.5,z=20.0;
glBegin(GL_QUADS);

glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-x,-y,-z);
glVertex3f(-x,+y,-z);
glVertex3f(+x,+y,-z);
glVertex3f(+x,-y,-z);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-x,-y,+z);
glVertex3f(-x,+y,+z);
glVertex3f(+x,+y,+z);
glVertex3f(+x,-y,+z);

glEnd();glFlush();
SwapBuffers(hdc);
}
//---------------------------------------------------------------------------
void TForm1::ogl_resize()
{
xs=ClientWidth;
ys=ClientHeight;
if (xs<=0) xs = 1;                  // Prevent a divide by zero
if (ys<=0) ys = 1;
if (!ogl_inicialized) return;
glViewport(0,0,xs,ys);              // Set Viewport to window dimensions
glMatrixMode(GL_PROJECTION);        // operacie s projekcnou maticou
glLoadIdentity();                   // jednotkova matica projekcie
gluPerspective(30,float(xs)/float(ys),0.1,100.0); // matica=perspektiva,120 stupnov premieta z viewsize do 0.1
glMatrixMode(GL_TEXTURE);           // operacie s texturovou maticou
glLoadIdentity();                   // jednotkova matica textury
glMatrixMode(GL_MODELVIEW);         // operacie s modelovou maticou
glLoadIdentity();                   // jednotkova matica modelu (objektu)
ogl_draw();
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ogl_inicialized=0;
hdc=NULL;
hrc=NULL;
ogl_init();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
ogl_exit();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
ogl_resize();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
ogl_draw();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
ogl_draw();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelDown(TObject *Sender, TShiftState Shift,
TPoint &MousePos, bool &Handled)
{
glMatrixMode(GL_PROJECTION);
glTranslatef(0,0,+2.0);
ogl_draw();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, TShiftState Shift,
TPoint &MousePos, bool &Handled)
{
glMatrixMode(GL_PROJECTION);
glTranslatef(0,0,-2.0);
ogl_draw();
}
//---------------------------------------------------------------------------
  1. создать пустой проект 1-формы

  2. добавьте это, чтобы сформировать заголовок класса как его определенные пользователем члены

        int     xs,ys;
    HDC     hdc;            // device context
    HGLRC   hrc;            // rendering context
    int  ogl_inicialized;
    int  ogl_init();
    void ogl_exit();
    void ogl_draw();
    void ogl_resize();
    
  3. добавить таймер ~ 20-40 мс

  4. создавать события и копировать тела для изменения размера, перекраски, ontimer, … в соответствии с приведенным выше исходным кодом
  5. скомпилировать и запустить

Заметки

  • не требуется, чтобы все OpenGL материал является членом класса формы
  • таймер может иметь любой интервал
  • OpenGL может быть также только частью окна, а не только целиком
  • может сочетаться с VCL компоненты (используйте панели для кнопок и т. д. и измените размер OpenGL на площадь снаружи)
  • Если вы не можете заставить его работать, прокомментируйте меня, но я не вижу ничего сложного сделать …
  • Не забудьте включить gl.h !!!
  • если все работает, то вы должны увидеть зеленый квад в центре формы
  • колесо мыши перемещает камеру вперед / назад («увеличение»)

Когда ты будешь готов OpenGL 1.0 Взгляни на:

Повеселись …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]