#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::DestroyModel() { // Unload our cached behaviors and cross references so // that proper cleanup can occur. _dragPtr->Cleanup(); _releasePtr->Cleanup(); } void CDAViewerCtl::CreateModel() { try { // Create the statics object IDAStaticsPtr e; e = _vc->GetMeterLibrary(); // 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 = new CDADrag(); _releasePtr = new CDARelease(); _dragPtr->initNotify(_blockImg, _releasePtr, 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); }