Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


tutorial de mensajes y un error

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

tutorial de mensajes y un error

Notapor Soujiro el Mié Ene 25, 2006 6:12 pm

Hola a todos :D , tengo un pequeño problema, quiero comunicarme entre dos vistas uno esta basada en Cview(MivistaView) y la otra en Cform(Ccontrol). Cuando creo un puntero en mi clase Ccontrol hacia MivistaView me manda un error como este:

unhandled. exception in vtkmdi.exe 0x0000005: accesss violation

En la linea donde se encuentra m_pDocument(del tipo CMidoc)
void Ccontrol::OnAnimar()
{
// TODO: Add your control notification handler code here
UpdateData();
m_pDocument->OnCmdMsg(WM_ANIMATION, m_Animar, NULL, NULL);

}

He aumentado previamente las cabezeras para que no a ya errores y aumentado "class CMidoc" al comienzo pero siempre dice que hay violacion de acceso????.
Una cosita mas, estoy usando los mensajes de visual c++ pero no entiendo muy bien para que sirve cada uno de ellos quisiera saber si alguien conoce un buen tutorial sobre estos mensajes(en que caso se usan). Estoy en las nubes con los eventos, pues hay hartos u no se en que caso se usan.
Se los agradecería mucho.
Atte José.
Soujiro
Novato
Novato
 
Mensajes: 17
Registrado: Mar Ene 03, 2006 2:39 pm

Notapor flea_aqp el Mié Ene 25, 2006 9:35 pm

no me a quedado muy clara tu pregunta puedes poner tu declaracion de la variable del puntero y donde los estas inicializando; por que los conflictos pasan por que se deberia inicializar en el constructor de la clase y mandarle a pa vista el puntero que referencia a la vista, pero como te digo no me quedo claro especifica.
flea_aqp
Usuario Activo
Usuario Activo
 
Mensajes: 40
Registrado: Dom Ene 15, 2006 1:49 pm

Notapor Soujiro el Vie Ene 27, 2006 8:05 pm

:P Ahora si va en serio 8) .
Esta es archivo de cabezera control.h(basada en Cform), aqui declaro mi puntero:
Código: Seleccionar todo
class CVtkMDIDoc;//para crear un puntero al documento
class Ccontrol : public CFormView
{
protected:
   Ccontrol();           // protected constructor used by dynamic creation
   DECLARE_DYNCREATE(Ccontrol)

// Form Data
public:
   //{{AFX_DATA(Ccontrol)
   enum { IDD = IDD_CONTROL };
   BOOL   m_Animar;
   //}}AFX_DATA
   CVtkMDIDoc* m_pDocument; // PUNTERO A MI DOCUMENTO
// Attributes
public:
...................



Bueno lo que sigue del codigo no es importante asi que lo he oviado 8) .
Ahora vamos a control.cpp y en su constructor inicalizo mi puntero a NULL , despues observamos la funcion OnAnimar() que esta asociada a un botton que he creado, al momento de presionar el boton supuestamente actualizo y con mi puntero me dirijo a la funcion OnCmdMsg(...) que se encuentra en VtkMDIDoc.cpp


Código: Seleccionar todo


// control.cpp : implementation file
//

#include "stdafx.h"
#include "VtkMDI.h"
#include "control.h"
////////////////
#include "VtkMDIDoc.h" //para que pueda comunicarse con el doc
#include "VtkMDIView.h"
////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Ccontrol

IMPLEMENT_DYNCREATE(Ccontrol, CFormView)

Ccontrol::Ccontrol()
   : CFormView(Ccontrol::IDD)
{
   //{{AFX_DATA_INIT(Ccontrol)
   m_Animar = FALSE;
   //}}AFX_DATA_INIT
   m_pDocument = NULL;
}

void Ccontrol::OnAnimar()
{
   // TODO: Add your control notification handler code here
   UpdateData();
   m_pDocument->OnCmdMsg(WM_ANIMATION, m_Animar, NULL, NULL);
   
}


Ahora vamos a VtkMDIDoc.cpp

Código: Seleccionar todo

// VtkMDIDoc.cpp : implementation of the CVtkMDIDoc class
//

#include "stdafx.h"
#include "VtkMDI.h"

#include "VtkMDIDoc.h"
#include "ChildFrm.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BOOL CVtkMDIDoc::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
   // TODO: Add your specialized code here and/or call the base class
   switch( nID )
   { case WM_ANIMATION:
      if( nCode )
         UpdateAllViews( NULL, WM_START_ANIMATION );
      else
         UpdateAllViews( NULL, WM_FINISH_ANIMATION );
   return TRUE;
   }

   return CDocument::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}


Bueno es a si que lo he hecho para poder ir a la clase CVtkMDIDoc y despues dirigirme a la clase CVtkMDIView.cpp(que es donde quiero llegar)Con la funcion UpdateAllViews actualizo todas las vistas y
en CVtkMDIView la funcion OnUpdate(...) recibe los cambios(bueno por lo menos eso me dijeron no estoy seguro :oops: , pero el error no se origina alli)

Código: Seleccionar todo


void CVtkMDIView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
   // TODO: Add your specialized code here and/or call the base class
   
   if( lHint == WM_START_ANIMATION )
   {
      UINT t = SetTimer( IDT_TIMER, 100 , NULL);
      return;
   }
   else if( lHint == WM_FINISH_ANIMATION )
   {
      KillTimer(IDT_TIMER);
      return;
   }
   

}

void CVtkMDIView::OnTimer(UINT nIDEvent)
{
   // TODO: Add your message handler code here and/or call default
///////////////////////////////////   
if( nIDEvent == IDT_TIMER )
   {
      vtkCamera* pCamera = ren->GetActiveCamera();
      pCamera->Azimuth(10);
      pCamera->Roll(10);
      //Invalidate(FALSE);
      return;
   }
/////////////////////////////////////

   CView::OnTimer(nIDEvent);
}

El error de violacion de acceso se da en tiempo de ejecucion cuando hago click en el boton que he creado.

Una preguntilla mas, ¿Puedo ir de una vista a otra sin pasar por CVtkMDIDoc(en mi caso)?. Por que me dijeron que el Doc sirve para la comunicacion entre varias vistas por eso lo hice asi.
Ademas todavia no domino los mensajes(seguro ya se dieron cuenta, no se para que sirven cada uno de ellos :oops: ) asi que agradecería un tutorial o cualquier cosa que hable de eso por favor.
Muy agradecido de antemano me despido.
Atte José.
Soujiro
Novato
Novato
 
Mensajes: 17
Registrado: Mar Ene 03, 2006 2:39 pm


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: Google Adsense [Bot] y 1 invitado