Esta es archivo de cabezera control.h(basada en Cform), aqui declaro mi puntero:
Código:
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 .
Ahora vamos a control.cpp y en su constructor inicalizo mi puntero a NULL , despues observamos la funcion OnAnimar() que esta asociada a un checkbox que he creado, al momento de presionar el checkbox supuestamente actualizo y con mi puntero me dirijo a la funcion OnCmdMsg(...) que se encuentra en VtkMDIDoc.cpp
Código:
// 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:
// 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 , pero el error no se origina alli)
Código:
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 checkbox 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 ) asi que agradecería un tutorial o cualquier cosa que hable de eso por favor.
Muy agradecido de antemano me despido.
Atte José.







