// JavuPlayerCtrl.h : Declaration of the CJavuPlayerCtrl // // Written by Will Braynen (in 2001) #ifndef __JAVUPLAYERCTRL_H_ #define __JAVUPLAYERCTRL_H_ #include #include #include "JavuPlayerUtil.h" #include "resource.h" // main symbols #include #include #include "JavuPlayerXCP.h" #include // Added by Alexz for timeline rendering #include // for add and drop support ///////////////////////////////////////////////////////////////////////////// // CJavuPlayerCtrl class ATL_NO_VTABLE CJavuPlayerCtrl : public CComObjectRootEx, public CStockPropImpl, public CComCompositeControl, public IPersistStreamInitImpl, public IOleControlImpl, public IOleObjectImpl, public IOleInPlaceActiveObjectImpl, public IViewObjectExImpl, public IOleInPlaceObjectWindowlessImpl, public ISupportErrorInfo, public IConnectionPointContainerImpl, public IPersistStorageImpl, public ISpecifyPropertyPagesImpl, public IQuickActivateImpl, public IDataObjectImpl, public IProvideClassInfo2Impl<&CLSID_JavuPlayerCtrl, &DIID__IJavuPlayerCtrlEvents, &LIBID_JAVUPLAYERXLib>, public IPropertyNotifySinkCP, public CComCoClass, public CProxy_IJavuPlayerCtrlEvents< CJavuPlayerCtrl > { public: CJavuPlayerCtrl() { // Set default member variable values (and default property values, since properties are implimented through member variables) m_bWindowOnly = TRUE; m_strFilename.Empty(); m_dPlaybackRate = 0; // paused m_bPreserveAspectRatio = true; m_bPositionToBeginningWhenReachedEnd = false; // no corresponding COM property yet // What GUI controls are visible m_bShowControls = true; m_bShowStatusBar = true; m_bShowSlider = true; // What events to fire m_bNewStreamNotification = true; m_bEndOfStreamNotification = true; m_bStateChangeNotification = true; m_bRateChangeNotification = true; m_bPositionChangeNotification = true; m_bPositionChangeNotification_LightWeightOnly = true; CalcExtent(m_sizeExtent); } DECLARE_REGISTRY_RESOURCEID(IDR_JAVUPLAYERCTRL) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CJavuPlayerCtrl) COM_INTERFACE_ENTRY(IJavuPlayerCtrl) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IViewObjectEx) COM_INTERFACE_ENTRY(IViewObject2) COM_INTERFACE_ENTRY(IViewObject) COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY(IOleInPlaceObject) COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY(IOleInPlaceActiveObject) COM_INTERFACE_ENTRY(IOleControl) COM_INTERFACE_ENTRY(IOleObject) COM_INTERFACE_ENTRY(IPersistStreamInit) COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY(IConnectionPointContainer) COM_INTERFACE_ENTRY(ISpecifyPropertyPages) COM_INTERFACE_ENTRY(IQuickActivate) COM_INTERFACE_ENTRY(IPersistStorage) COM_INTERFACE_ENTRY(IDataObject) COM_INTERFACE_ENTRY(IProvideClassInfo) COM_INTERFACE_ENTRY(IProvideClassInfo2) COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) END_COM_MAP() BEGIN_PROP_MAP(CJavuPlayerCtrl) PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4) PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4) PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL) PROP_ENTRY("Rate", 1, CLSID_NULL) PROP_ENTRY("FileName", 2, CLSID_NULL) PROP_ENTRY("PreserveAspectRatio", 19, CLSID_NULL) PROP_ENTRY("ShowControls", 22, CLSID_NULL) PROP_ENTRY("NewStreamNotification", 27, CLSID_NULL) PROP_ENTRY("StateChangeNotification", 28, CLSID_NULL) PROP_ENTRY("RateChangeNotification", 29, CLSID_NULL) PROP_ENTRY("PositionChangeNotification", 30, CLSID_NULL) PROP_ENTRY("PositionChangeNotification_LightWeightOnly", 31, CLSID_NULL) PROP_ENTRY("EndOfStreamNotification", 33, CLSID_NULL) // Example entries // PROP_ENTRY("Property Description", dispid, clsid) // PROP_PAGE(CLSID_StockColorPage) END_PROP_MAP() BEGIN_CONNECTION_POINT_MAP(CJavuPlayerCtrl) CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink) CONNECTION_POINT_ENTRY(DIID__IJavuPlayerCtrlEvents) END_CONNECTION_POINT_MAP() BEGIN_MSG_MAP(CJavuPlayerCtrl) CHAIN_MSG_MAP(CComCompositeControl) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_CLOSE, OnClose) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) MESSAGE_HANDLER(WM_HSCROLL, OnHScroll) MESSAGE_HANDLER(WM_GRAPHNOTIFY, OnGraphNotify) MESSAGE_HANDLER(WM_PLAYBACKENDED, OnPlaybackEnded) MESSAGE_HANDLER(WM_POSITIONCHANGED, OnPositionChanged) //MESSAGE_HANDLER(WM_DROPFILES, OnDropFiles) // MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) COMMAND_HANDLER(IDC_BUTTON_PLAY, BN_CLICKED, OnClickedButton_play) COMMAND_HANDLER(IDC_BUTTON_STOP, BN_CLICKED, OnClickedButton_stop) COMMAND_HANDLER(IDC_BUTTON_FASTFORWARD, BN_CLICKED, OnClickedButton_fastforward) COMMAND_HANDLER(IDC_BUTTON_FASTREVERSE, BN_CLICKED, OnClickedButton_fastreverse) COMMAND_HANDLER(IDC_BUTTON_FRAMEBACK, BN_CLICKED, OnClickedButton_frameback) COMMAND_HANDLER(IDC_BUTTON_FRAMESTEP, BN_CLICKED, OnClickedButton_framestep) COMMAND_HANDLER(IDC_BUTTON_JUMP, BN_CLICKED, OnClickedButton_jump) COMMAND_HANDLER(IDC_BUTTON_PAUSE, BN_CLICKED, OnClickedButton_pause) // MESSAGE_HANDLER(WM_PAINT, OnPaint) // COMMAND_HANDLER(IDC_MOVIE_SCREEN, BN_CLICKED, OnClickedMovie_screen) // doesn't work (?) END_MSG_MAP() // Handler prototypes: // LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); // LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); // LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled); BEGIN_SINK_MAP(CJavuPlayerCtrl) //Make sure the Event Handlers have __stdcall calling convention END_SINK_MAP() STDMETHOD(OnAmbientPropertyChange)(DISPID dispid) { if (dispid == DISPID_AMBIENT_BACKCOLOR) { SetBackgroundColorFromAmbient(); FireViewChange(); } return IOleControlImpl::OnAmbientPropertyChange(dispid); } //////////////////////////////////////////////////////// // // Limits the height of the control to be at least ... well, for now actually does nothing. // STDMETHOD(SetExtent)(DWORD dwDrawAspect, SIZEL *psizel) { return false; AtlHiMetricToPixel (psizel, psizel); // SAMPLE CODE: //if (sizeInPixels.cy < 100) //{ // sizeInPixels.cy = 100; //} // // Resize and redraw the design-time bitmap picture accordingly (in OnDraw) // -- Is OnDraw called automatically, or do we have to call FireViewChange()? // AtlPixelToHiMetric (psizel, psizel); return IOleObjectImpl::SetExtent(dwDrawAspect, psizel); } // ISupportsErrorInfo STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid) { static const IID* arr[] = { &IID_IJavuPlayerCtrl, }; for (int i=0; itop, di.prcBounds->bottom, di.prcBounds->left, di.prcBounds->right); MessageBox (msg); */ // // During design-time, display a static bitmap picture // if ( ! m_bInPlaceActive) { // // INSERT CODE HERE -- if through SetExtent m_sizeExtent changed, // you might want to resize the bitmap poster. // //ShowJavuPlayerBitmapPicture (m_bShowSlider, m_bShowControls, m_bShowStatusBar); CBitmap bitmapObject; BITMAP bitmap; int nBitMask = 0; if (m_bShowSlider) nBitMask |= 1; // binary 1 if (m_bShowControls) nBitMask |= 2; // binary 10 if (m_bShowStatusBar) nBitMask |= 4; // binary 100 switch (nBitMask) { case 0: bitmapObject.LoadBitmap (IDB_JAVUPLAYER0); break; case 1: bitmapObject.LoadBitmap (IDB_JAVUPLAYER1); break; case 2: bitmapObject.LoadBitmap (IDB_JAVUPLAYER2); break; case 3: bitmapObject.LoadBitmap (IDB_JAVUPLAYER3); break; case 4: bitmapObject.LoadBitmap (IDB_JAVUPLAYER4); break; case 5: bitmapObject.LoadBitmap (IDB_JAVUPLAYER5); break; case 6: bitmapObject.LoadBitmap (IDB_JAVUPLAYER6); break; case 7: bitmapObject.LoadBitmap (IDB_JAVUPLAYER7); break; } GetObject (bitmapObject, sizeof (BITMAP), &bitmap); int nBitmapWidth = bitmap.bmWidth; int nBitmapHeight = bitmap.bmHeight; HDC hdcMem = CreateCompatibleDC (di.hdcDraw); SelectObject (hdcMem, bitmapObject); BitBlt (di.hdcDraw, 0, 0, nBitmapWidth, nBitmapHeight, hdcMem, 0, 0, SRCCOPY); DeleteDC (hdcMem); } return S_OK; } ///////////////////////////////////////////////////////////////////////////// // // If you want this function to be called, make sure // "MESSAGE_HANDLER(WM_PAINT, OnPaint)" is not commented out (in this file). // // Don't use this function in real life; IE will lag because it will constantly be // calling this. // LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Tried to force the video window to repaint, but this had no effect, // regardless of whether it's called before CComCompositeControl::OnPaint or after. //LRESULT ret = CComCompositeControl::OnPaint (uMsg, wParam, lParam, bHandled); MessageBox (_T("OnPaint")); CComControlBase::OnPaint (uMsg, wParam, lParam, bHandled); // Right now the video window is fully painted. Call Sleep(2000) here to convince yourself. // After this function (OnPaint) returns however, it will be erased. Sleep (2000); ::SendMessage (m_Screen, WM_PAINT, NULL, NULL); return 0; } LRESULT OnClickedMovie_screen(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { MessageBox (_T("clicked")); if ((m_playerState != PlayerState_PlayingForward) && (m_playerState != PlayerState_PlayingReverse)) { Play(1.0); } else { OnPause(); } return 0; } }; #endif //__JAVUPLAYERCTRL_H_