DACTL.CPP

#include "dactl.h" 

void dump_com_error( _com_error &e )
{
char buf[2048];

sprintf(buf, _T( "Oops - hit an error!\n\tCode = %08lx\n\tCode meaning = %s\n" ),
e.Error(), e.ErrorMessage());
OutputDebugString(buf);
}

// If this is placed in the scope of the smart pointers, they must be
// explicitly Release(d) before CoUninitialize() is called. If any reference
// count is non-zero, a protection fault will occur.

CDAViewerCtl::CDAViewerCtl()
:_vc(NULL)
{
try {
_vc.CreateInstance(__uuidof(DAViewerControlWindowed));
} catch( _com_error &e ) {
dump_com_error( e );
}
}

void CDAViewerCtl::CreateModel() {
try {
// Create the statics object
IDAStaticsPtr e;
e = _vc->GetMeterLibrary();

CDADrag* _dragPtr = new CDADrag();

// Create a ModifiableBehavior which will be used to change the color
// of the square.
IDABehaviorPtr _squareColor = e->ModifiableBehavior(e->Red);

// Instanciate an uninitialized ColorBvr (_squareColor).
IDAColorPtr temp;
temp.CreateInstance( L"DirectAnimation.DAColor");

// Initialize _squareColor. Let it start out as red, change it to blue,
// when the square is grabbed, and return to red when the square
// is released. The grab and release events are obtained from the
// getGrabEvent() and getReleaseEvent() from the CDADrag
// class.
//_squareColor->Init(e->Until(e->Red, _dragPtr->getGrabEvent(),
// e->Until(e->Blue, _dragPtr->getReleaseEvent(), _squareColor)));

// Create cropped square, and apply _squareColor's color behavior to it.
_blockImg = e->SolidColorImage((IDAColorPtr)_squareColor)->Crop(e->Point2(0,0),
e->Point2(0.005,0.005));

_dragPtr->initNotify(_blockImg, e->Origin2, e);

// Initialize squareClr. Let it start out as red, change it to blue,
// when the cube is grabbed, and return to red when the cube
// is released. The grab and release events are obtained from the
// getGrabEvent() and getReleaseEvent() methods of the CDADrag
// class respectively.
IDAColorPtr squareClr;
squareClr.CreateInstance( L"DirectAnimation.DAColor");
squareClr->Init(e->Until(e->Red, _dragPtr->getGrabEvent(),
e->Until(e->Blue, _dragPtr->getReleaseEvent(), squareClr)));

// Apply squareClr's behavior to the square.
_squareColor->SwitchTo(squareClr);

// Get the ImageBvr part of grabImg, by calling the getImagePtr() method
// of DraggableImage.
IDAImagePtr pickableBlockImg = _dragPtr->getImagePtr();

// overlay pickableBlockImg on a black background.
IDAImagePtr model = e->Overlay(pickableBlockImg, e->SolidColorImage(e->Black));

// And set the model's image to this image.
_vc->PutImage( model );

// Set the cap for the frame rate. If we don't do this, DA
// will hog the cpu and the mouse and keyboard won't be very
// responsive. If you're running in full screen mode, you may
// want to remove this line to get better frame rate.
_vc->put_UpdateInterval(0.2);

// Start the model on the view. The WndProc will
// generate the frames.
_vc->Start();

} catch( _com_error &e ) {
dump_com_error( e );
}
}


HRESULT CDAViewerCtl::GetIUnknown(IUnknown **pUnk) {
if (!pUnk)
return E_POINTER;

if (_vc == NULL)
return E_NOINTERFACE;

return _vc->QueryInterface(IID_IUnknown, (LPVOID *)pUnk);
}