• Viernes 15 de Noviembre de 2024, 06:47

Autor Tema:  Error Funcion Glutmousefunc  (Leído 6687 veces)

Perla_kiko

  • Miembro MUY activo
  • ***
  • Mensajes: 114
    • Ver Perfil
Error Funcion Glutmousefunc
« en: Lunes 24 de Enero de 2005, 16:45 »
0
hola tengo el siguiente codigo:

void CGlView::onMouse(int button, int state, int x, int y)
{
if((button== GLUT_LEFT_BUTTON) & (state== GLUT_DOWN))
{
   x0=x;y0=y;
}
}
y depues la llamada a :

glutMouseFunc(onMouse);

Cuando compilo me da el siguiente error alguien sabe pq?

error C2664: 'glutMouseFunc' : cannot convert parameter 1 from 'void (int,int,int,int)' to 'void (__cdecl *)(int,int,int,int)'
        None of the functions with this name in scope match  the target type

Ruben3d

  • Moderador
  • ******
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error Funcion Glutmousefunc
« Respuesta #1 en: Lunes 24 de Enero de 2005, 20:27 »
0
Hola.

glutMouseFunc() pide como parámetro un puntero a una función, y tú le estás pasando el nombre de un método de una clase (aunque me resulta un poco confuso el mensaje de error).

La única forma de pasar un método es si es estático, y hay que hacerlo con el calificativo completo:

CGlView::onMouse

Si no lo haces así, la única opción es pasar una función normal.

Un saludo.

Ruben3d

Perla_kiko

  • Miembro MUY activo
  • ***
  • Mensajes: 114
    • Ver Perfil
Re: Error Funcion Glutmousefunc
« Respuesta #2 en: Miércoles 26 de Enero de 2005, 09:33 »
0
lo he probado y me da el mismo error,

Como hago para pasar un funcion normal? perdona si la pregunta parece obvia pero soy nueva en esto! :D

lo he probado asi:

glutMouseFunc(CGlView::onMouse);
glutMotionFunc(CGlView:onMotion);

Ruben3d

  • Moderador
  • ******
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error Funcion Glutmousefunc
« Respuesta #3 en: Miércoles 26 de Enero de 2005, 13:06 »
0
El método sólo lo puedes pasar si es estático, pero me da que no lo es (aun sin haber visto la declaración).

Para usar una función has de hacerla así:

Código: Text
  1. void onMouse(int button, int state, int x, int y)
  2. {
  3.     if((button== GLUT_LEFT_BUTTON) & (state== GLUT_DOWN))
  4.     {
  5.         x0=x; y0=y;
  6.     }
  7. }
  8.  
  9. glutMouseFunc(onMouse);
  10.  

Si tienes problemas de visibilidad con el método de la clase, haz lo siguiente (pero sólo si te diera algún problema):
Código: Text
  1. glutMouseFunc(::onMouse);
  2.  

Un saludo.

Ruben3d

Perla_kiko

  • Miembro MUY activo
  • ***
  • Mensajes: 114
    • Ver Perfil
Re: Error Funcion Glutmousefunc
« Respuesta #4 en: Miércoles 26 de Enero de 2005, 16:40 »
0
no hay manera! ahora no me da error de compilador, pero cuando cargo la pantalla de OPENGL me da un error de sistema que te adjunto en el fichero..

Perdon por las molestias, pq hay alguna otra manera de controlar el mouse?

Te explico un poco como va mi programa, por si te ayuda un poco

Tengo una plicacion hecha en visual c++ ,donde un usuario introduce unos datos en un dialogo y segun estos datos a partir de ese dialogo se abre otro dialogo con la simulacion, todo lo relacionado lo tengo en una libreria aparte donde el metodo principal es el siguiente:

void CDialogo_simulacionDlg::OnButton1()
{
   //   OpenGL in Picture in a Dialog
   CPaintDC dc(this); // device context for painting
   CStatic *pclStatic = (CStatic *)GetDlgItem(IDC_OPENGLWIN);
   CGlView *pclGlView = new CGlView(pclStatic);
   HDC m_hDC;
    m_hDC = ::GetDC(this->m_hWnd);

    RECT rect;
   GetClientRect(&rect);

    int iWidth = -(rect.right - rect.left);
    int iHeight = rect.top - rect.bottom;

   pclGlView->OnCreate();
   pclGlView->ReSizeGLScene(iWidth, iHeight);
   pclGlView->InitGL();
   pclGlView->DrawGLScene();
   


}

y la funcion initgl:
void onMouse(int button, int state, int x, int y)
{
if((button== GLUT_LEFT_BUTTON) & (state== GLUT_DOWN))
{
   x0=x;y0=y;
}
}

void onMotion(int x, int y)
{
alpha=(alpha+(y-y0));
beta=(beta+(x-x0));
x0=x;y0=y;
}
int CGlView::InitGL(GLvoid)                              // All Setup For OpenGL Goes Here
{
   glShadeModel(GL_SMOOTH);                     // Enable Smooth Shading
   glClearColor(0.0f, 0.0f, 0.0f, 0.5f);            // Black Background
   glClearDepth(1.0f);                           // Depth Buffer Setup
   glEnable(GL_DEPTH_TEST);                     // Enables Depth Testing
   glDepthFunc(GL_LEQUAL);                        // The Type Of Depth Testing To Do
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Really Nice Perspective Calculations
   glutMouseFunc(onMouse);
   glutMotionFunc(onMotion);
   return TRUE;                              // Initialization Went OK
}

int CGlView::DrawGLScene(GLvoid)               // Here's Where We Do All The Drawing
{
   glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   glMatrixMode (GL_MODELVIEW);
   glLoadIdentity ();
   glPushMatrix ( );
   glColor4f ( 1.0, 1.0, 1.0, 1.0 );
   glTranslatef(mx,my,mz);
   glRotatef(alpha,1.0f,0.0f,0.0f);
   glRotatef(beta,0.0f,0.0f,1.0f);
   glRotatef(r2,.0f,0.0f,1.0f);
   
   //PintarEjes();
   glColor3f(1.0f, 1.0f, 1.0f);//blanco
   Cargar_Res("prova.res");
   Cargar_Ase();
   SwapBuffers(m_hDC);
   return TRUE;                              // Keep Going
}

Espero que no te haya liado aún mas!
 :lol:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Ruben3d

  • Moderador
  • ******
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error Funcion Glutmousefunc
« Respuesta #5 en: Miércoles 26 de Enero de 2005, 19:28 »
0
Pues no sé de dónde surge el error, ya que:
  • a) Nunca he usado el Glut, aunque cuando veo código intuyo cómo va.</li>
  • b) Nunca he usado MFC, ni sé cómo va.</li>
El error tiene pinta de ser de MFC, y no sé de dónde puede surgir. Te recomiendo que, como manera alternativa, prescindas del GLUT y MFC y lo hagas con el API básica, como se explica en NeHe (http://nehe.gamedev.net/).

Un saludo.

Ruben3d

Perla_kiko

  • Miembro MUY activo
  • ***
  • Mensajes: 114
    • Ver Perfil
Re: Error Funcion Glutmousefunc
« Respuesta #6 en: Jueves 27 de Enero de 2005, 09:07 »
0
tu como harias para controlar el mouse en el OPENGL entonces?

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Error Funcion Glutmousefunc
« Respuesta #7 en: Jueves 27 de Enero de 2005, 11:03 »
0
Hola  :hola:

Aqui te dejo una clase que implementa una Vista de OpenGl sobre una aplicacion visual c++, viene con algunos comandos de interaccion con el raton

Para implementar la clase en una aplicacion SDI debes hacer lo siguiente:

1) Crear una aplicaion SDI,desactivando en el wizard la opcion Document/View architecture support

2)Una vez creada debes tener 3 clases (el mainframe el app y childview , bueno y tb el dialogo de ayuda)

3)Ahora incluyes los 2 archivos de la clase VistaGL al proyecto y linkas al proyecto las siguientes librerias opengl32.lib y glu32.lib que se supones tendras instaladas en el pc

4)Vas al CChildView.cpp e incluyes la cabecera de VistaGL y cambias la herencia de CCHildView que se hereda de CWnd por VistaGL, algo asi:

Código: Text
  1.  
  2.  
  3. #include &#34;VistaGL.h&#34;
  4. class CChildView : public VistaGL
  5. {
  6.  
  7.  

5) Ahora te vas al metodo onpaint de CChildView y le decimos que a la hora de pintar en pantalla recurra al metodo onpaint de vistaGL, de esta forma:

Código: Text
  1.  
  2.  
  3. void CChildView::OnPaint()
  4. {
  5. CPaintDC dc(this); // device context for painting
  6. // TODO: Add your message handler code here
  7. VistaGL::OnPaint(); // &#60;==== ESTA LINEA ES LA QUE DEBES METER
  8. // Do not call CWnd::OnPaint() for painting messages
  9. }
  10.  
  11.  
  12.  

6)Una vez hecho esto ya podras pintar usando por ejemplo el metodo pintaescena() de la clase VistaGL o simplemente desde el propio constructor de la clase
Ahora lo que haremos sera permitir a la clase VistaGL controlar los eventos de la clase CChildVies como por ejemplo los eventos de raton
En el siguiente trozo de codigo de CCHildView.cpp debes cambiar Cwnd por VistaGL

Código: Text
  1.  
  2.  
  3. BEGIN_MESSAGE_MAP(CChildView,CWnd ) //&#60;== AQUI cambia CWnd por VistaGL
  4. //{{AFX_MSG_MAP(CChildView)
  5. ON_WM_PAINT()
  6. //}}AFX_MSG_MAP
  7. END_MESSAGE_MAP()
  8.  
  9.  
  10.  

Y ya esta ¡¡¡ eso es todo

Los metodos implementados para hacer uso del raton son los que proveen las MFC

OnMouseMove(UINT nFlags, CPoint point)
OnLButtonDown(UINT nFlags, CPoint point)

etc etc

buscalos en CChildView.cpp y te haces una idea de como van

Espero que te sea de ayuda ,un saludo  :hola:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Ruben3d

  • Moderador
  • ******
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Error Funcion Glutmousefunc
« Respuesta #8 en: Jueves 27 de Enero de 2005, 12:47 »
0
Bueno, lo que ha puesto Diodo tiene buena pinta. Si a pesar de tener eso quieres saber cómo leer los eventos del ratón con el API básica de Windows, avisa.

Un saludo.

Ruben3d

Perla_kiko

  • Miembro MUY activo
  • ***
  • Mensajes: 114
    • Ver Perfil
Re: Error Funcion Glutmousefunc
« Respuesta #9 en: Lunes 31 de Enero de 2005, 13:43 »
0
Si tb me iria bien saber como tratar los eventos del mouse con las api de windows gracias

Perla_kiko

  • Miembro MUY activo
  • ***
  • Mensajes: 114
    • Ver Perfil
Re: Error Funcion Glutmousefunc
« Respuesta #10 en: Lunes 31 de Enero de 2005, 13:58 »
0
hola diodo elproblema es que yo no lo pongo directamente en lapantalla de sdi , sino que lo pongo dentro de un dialogo. heprobado hacer lo que tu me dices pero como lo hago dentro de un dialogo?

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Error Funcion Glutmousefunc
« Respuesta #11 en: Lunes 31 de Enero de 2005, 15:38 »
0
Hola

Perdona, no vi lo de que querias hacerlo con dialogos, bueno aqui te dejo un ejemplo de una ventana opengl metida dentro de un dialogo

http://www.codeguru.com/Cpp/G-M/opengl/article.php/c5583/

echale un ojo y descargate el codigo fuente que esta en la misma pagina

Veras que hay una clase COpenGL que implementa el recuadrod e la ventana opengl y que se hereda de CWnd, bien pues para implementar eventos de raton cuando esta sobre esa ventana simplemente debes ir al class wizard y agregar el metodo WM_MOUSEMOVE a la clase, se te creara automaticamente el metodo y podras añadirle lo que quieras

Por ejemplo que salga un MessageBox diciendo que has pasado por el recuadro de la vista OpenGL

Código: Text
  1.  
  2.  
  3. void COpenGL::OnMouseMove(UINT nFlags, CPoint point)
  4. {
  5.   // TODO: Add your message handler code here and/or call default
  6.   MessageBox(&#34;has pasado por el recuadro OpenGL&#34;);
  7.   CWnd::OnMouseMove(nFlags, point);
  8. }
  9.  
  10.  
  11.  

ya se que es una tonteria el ejemplo.Para controlar la posicion del raton dentro del recuadro usa el argumento de la funcion Cpoint point

por ejemplo

Código: Text
  1.  
  2.  
  3. point.x  //para obtener la coordenada x
  4. point.y  // para obtener la coordenada y
  5.  
  6.  
  7.  

Con esta funcion y las de eventos de pulsacion de los botones del mouse podras ahcer practicamente todo.Fijate como se hace en la clase que te pase VistaGL.cpp

un saludo  :hola:

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Error Funcion Glutmousefunc
« Respuesta #12 en: Lunes 31 de Enero de 2005, 18:32 »
0
Hola de nuevo :hola:

Curioseando por internet encontre este ejemplo que te puede venir como anillo al dedo.

Espero que te sea de ayuda , saludos  :kicking:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Perla_kiko

  • Miembro MUY activo
  • ***
  • Mensajes: 114
    • Ver Perfil
Re: Error Funcion Glutmousefunc
« Respuesta #13 en: Martes 1 de Febrero de 2005, 10:58 »
0
MUCHISIMAS GRACIAS!!!
Me ha funcionado perfectamente!!!JEJEJEJEJEJ