0

2 つの OpenGL レンダリング コンテキストを含む Windows プログラム (以下を参照) を作成しています。通常、OpenGL を使用してプログラミングするときは、描画コンテキストの作成とコールバック登録に GLUT ライブラリ関数を使用します。

ただし、これらのコンテキストを Windows フォームに埋め込んでいるため (GLUT は、ウィンドウの最小、最大、および X ボタンを備えた独自のメイン ウィンドウをそれぞれ作成します)、System::Windows として、GLUT を使用せずにウィンドウを作成することを余儀なくされました。 ::Forms::NativeWindow は、wgl 関数を使用して OpenGL コンテキストとして有効化されています。

私が扱っている OGL ビューの種類

ただし、これらのビューでユーザー入力を処理するために、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
        }     
4

1 に答える 1