Функция в качестве параметра для другой функции
Я реализую класс с именем 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 *)()"
даже писать код как glutDisplayFunc((_cdecl)RenderScene)
не помогло Как я могу исправить эту проблему и реализовать эту задачу в классе, который будет использоваться в приложениях MFC?
1 ответ
Во-первых, чтобы избавиться от этого заблуждения: GLUT не является частью OpenGL, и вам не нужно его использовать!
Вы не можете смешивать GLUT и MFC. И GLUT, и MFC делают примерно одно и то же:
- Обеспечить платформу для создания Windows и иметь дело с пользовательским вводом
- Управление основным циклом событий приложения
Вы не можете иметь две разные вещи в одной и той же программе, пытаясь сделать то же самое.
В любом случае, эта ошибка говорит вам следующее:
- glutDisplayFunc ожидает простой указатель на функцию в качестве обратного вызова
- То, что вы передаете glutDisplayFunc - это не указатель на функцию, а указатель на член класса, который сам по себе не имеет информации о том, к какому экземпляру класса он относится. Экземпляр должен быть передан в качестве дополнительного параметра или упакован с указателем члена - но glutDisplayFunc никогда не сможет с этим работать.
Или другими словами: то, что вы пытаетесь сделать, невозможно (без создания каких-либо оберток или использования грязных хаков).