0

FilesWorkFlow という名前のクラスを実装しています。

//this function is called by other functions of the class to set openGL data type
//based on GDAL data type
void FilesWorkFlow::setOpenGLDataType(void)
{
    switch (eType)
    {
    case GDT_Byte:
        type = GL_UNSIGNED_BYTE;
        break;
    case GDT_UInt16:
        type = GL_UNSIGNED_SHORT;
        break;
    case GDT_Int16:
        type = GL_SHORT;
        break;
    case GDT_UInt32:
        type = GL_UNSIGNED_INT;
        break;
    case GDT_Int32:
        type = GL_INT;
    }
}


//this function is called by other functions of the class to draw scene
void FilesWorkFlow::RenderScene(void)
{
    GLint iWidth = (GLint)RasterXSize;
    GLint iHeight = (GLint)RasterYSize;
    setOpenGLDataType();
    glClear(GL_COLOR_BUFFER_BIT);
    glRasterPos2i(0,0);
    glDrawPixels(iWidth,iHeight,format,type,pImage);
    glFlush();
}


//this function is called by other functions of the class to setup the 
//rendering state
void FilesWorkFlow::SetupRC(void)
{
    glClearColor(0.0f,0.0f,0.0f,1.0f);
}

void FilesWorkFlow::Show(void)
{
    int argc = 1;
    char **argv;
    argv[0] = "OPENGL";
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutCreateWindow("Image");
    glutDisplayFunc(RenderScene);
    SetupRC();
    glutMainLoop();
}  

これは、MFC アプリケーションでウィンドウを作成して tiff イメージをレンダリングするために使用されるクラスの一部ですが、行glutDisplayFunc(RenderScene)でエラーが発生します

argument of type "void (FilesWorkFlow::*)()" is incompatible with parameter of type "void (__cdecl *)()"  

コードを as として書いてもglutDisplayFunc((_cdecl)RenderScene)役に立ちませんでした。この問題を修正し、MFC アプリケーションで使用されるクラスにこのタスクを実装するにはどうすればよいですか?

4

1 に答える 1

1

最初にその誤解を解いてください: GLUT はOpenGL の一部ではないため、使用する必要はありません!

GLUT と MFC を混在させることはできません。GLUT と MFC はどちらもほぼ同じことを行います。

  • Windows を作成し、ユーザー入力を処理するためのフレームワークを提供する
  • アプリケーションのメイン イベント ループを管理する

同じプログラムで 2 つの異なることを実行して、まったく同じことを実行することはできません。


とにかく、あなたが得ているそのエラーはあなたに次のことを伝えます:

  • glutDisplayFuncは、コールバックとして単純な関数ポインタを想定しています
  • glutDisplayFuncに渡すのは関数ポインターではなく、クラス メンバー ポインターであり、それ自体では参照するクラスのインスタンスに関する情報が不足しています。インスタンスは、追加のパラメーターとして渡すか、メンバー ポインターでパックする必要がありますが、glutDisplayFuncはそれを処理できません。

言い換えれば、あなたがやろうとしていることは不可能です (いくつかのラッパーを構築したり、いくつかの汚いハックを使用したりしない限り)。

于 2013-08-04T11:14:32.593 に答える