2 つの OpenGL レンダリング コンテキストを含む Windows プログラム (以下を参照) を作成しています。通常、OpenGL を使用してプログラミングするときは、描画コンテキストの作成とコールバック登録に GLUT ライブラリ関数を使用します。
ただし、これらのコンテキストを Windows フォームに埋め込んでいるため (GLUT は、ウィンドウの最小、最大、および X ボタンを備えた独自のメイン ウィンドウをそれぞれ作成します)、System::Windows として、GLUT を使用せずにウィンドウを作成することを余儀なくされました。 ::Forms::NativeWindow は、wgl 関数を使用して OpenGL コンテキストとして有効化されています。
ただし、これらのビューでユーザー入力を処理するために、glutMouseFunc や glutPassiveMotionFunc などの関数を使用する必要があります (これらは、マウス入力を処理するために通常使用する関数です)。しかし、これらのウィンドウは glutCreateWindow を使用して作成されたものではないため、これらの GLUT 関数をそれらと関連付けて使用できるかどうかは真剣に疑問です。(私は glutCreatSubwindow で実験しましたが、これは別の GLUT で作成されたウィンドウのサブウィンドウを作成するだけです)
私が現在探しているのは、これらの OpenGL 対応フォーム / NativeWindow でマウス クリック、座標、および移動を処理する方法です。それがシステム名前空間を使用しているかどうかにかかわらず、私が知らない別のGLまたはGLUT関数か、それ以外のものです。また、両方のビューがコンストラクターを継承するコードの親クラスも含めて、作成方法を確認できるようにします。
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 it's position on the parent form
cp->X = 12;
cp->Y = 27;
cp->Height = iHeight;
cp->Width = iWidth;
//set the height and width for the benefit of the derived classes,
//so that they can find out their own size using the getHeight & width funcs
currentWidth = cp->Width;
currentHeight = cp->Height;
//Specify the form as the parent
cp->Parent = parentForm->Handle;
//create as a child of the specified parent
//and make OPENGL compliant
cp->Style = WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
//create the window
this->CreateHandle(cp);
m_hDC = GetDC((HWND)this->Handle.ToPointer());
if(m_hDC)
{
wglMakeCurrent(m_hDC,NULL);
MySetPixelFormat(m_hDC);
ReSizeGLScene(iWidth,iHeight);
InitGL();
}
}
virtual void Render()
{
//simple render, just refresh the buffers for now
glClearColor(1.0f,0.5f,0.5f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
void SwapOpenGLBuffers()
{
SwapBuffers(m_hDC);
}
protected:
HDC m_hDC;
HGLRC m_hglrc;
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;
}
bool InitGL(GLvoid) // All setup for opengl goes here
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,currentWidth,0,currentHeight); //these will be set be now so it's safe to use them
//also makes sure we're drawing from the bottom left
//glShadeModel(GL_SMOOTH); // Enable smooth shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black background
//glClearDepth(1.0f); // Depth buffer setup
glDepthFunc(GL_LEQUAL); // The type of depth testing to do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really nice perspective calculations
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//activate the alpha blending functionality
glLineWidth(2); // Width of the drawing line
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
return TRUE; // Initialisation went ok
}