// DeskMovr.h : Declaration of the CDeskMovr #ifndef __DESKMOVR_H_ #define __DESKMOVR_H_ #include "resource.h" // main symbols #include "admovr2.h" #include "stdafx.h" #define IDR_BOGUS_MOVR_REG 23 // Function prototypes typedef HRESULT (CALLBACK FAR * LPFNCOMPENUM)(COMPONENT * pComp, LPVOID lpvData, DWORD dwData); typedef HRESULT (CALLBACK FAR * LPFNELEMENUM)(IHTMLElement * pielem, LPVOID lpvData, LONG lData); ///////////////////////////////////////////////////////////////////////////// // CDeskMovr class ATL_NO_VTABLE CDeskMovr : public CComObjectRootEx, public CComCoClass, public CComControl, public IDeskMovr, public IOleObjectImpl, public IPersistPropertyBag, public IOleControlImpl, public IOleInPlaceActiveObjectImpl, public IViewObjectExImpl, public IOleInPlaceObjectWindowlessImpl, public IQuickActivateImpl { public: CDeskMovr(void); ~CDeskMovr(void); DECLARE_REGISTRY_RESOURCEID(IDR_BOGUS_MOVR_REG) DECLARE_WND_CLASS(TEXT("DeskMover")); BEGIN_COM_MAP(CDeskMovr) COM_INTERFACE_ENTRY(IDeskMovr) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL(IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject) COM_INTERFACE_ENTRY_IMPL(IOleControl) COM_INTERFACE_ENTRY_IMPL(IOleObject) COM_INTERFACE_ENTRY(IPersistPropertyBag) COM_INTERFACE_ENTRY_IMPL(IQuickActivate) END_COM_MAP() BEGIN_PROPERTY_MAP(CDeskMovr) // Example entries // PROP_ENTRY("Property Description", dispid, clsid) // PROP_PAGE(CLSID_StockColorPage) END_PROPERTY_MAP() BEGIN_MSG_MAP(CDeskMovr) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus) MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) MESSAGE_HANDLER(WM_LBUTTONDOWN, OnMouseDown) MESSAGE_HANDLER(WM_LBUTTONUP, OnMouseUp) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) ALT_MSG_MAP(1) MESSAGE_HANDLER(WM_TIMER, OnTimer) END_MSG_MAP() // IOleInPlaceObject virtual STDMETHODIMP InPlaceDeactivate(void); // IOleObject STDMETHODIMP GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus); virtual STDMETHODIMP SetClientSite(IOleClientSite *pClientSite); // IOleControl method we override to identify a safe time hook up with our partner and // party on the Trident OM virtual STDMETHODIMP FreezeEvents(BOOL bFreeze); // IViewObjectEx virtual STDMETHODIMP GetViewStatus(DWORD* pdwStatus) { ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n")); *pdwStatus = VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE; return S_OK; } // IQuickActivate virtual STDMETHODIMP QuickActivate(QACONTAINER *pQACont, QACONTROL *pQACtrl); void OnKeyboardHook(WPARAM wParam, LPARAM lParam); public: HRESULT OnDraw(ATL_DRAWINFO& di); // IPersistPropertyBag // IPersist virtual STDMETHODIMP GetClassID(CLSID *pClassID) { *pClassID = CComCoClass::GetObjectCLSID(); return S_OK; } // IPersistPropertyBag // virtual STDMETHODIMP InitNew() { ATLTRACE(_T("CDeskMovr::InitNew\n")); return S_OK; } virtual STDMETHODIMP Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog); virtual STDMETHODIMP Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties); HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, DWORD dwExStyle = 0, UINT nID = 0) { // We override this method inorder to add the WS_CLIPSIBLINGS bit // to dwStyle, which is needed to prevent the IFrames from flashing // when the windowed control is moved over them. ATOM atom = GetWndClassInfo().Register(&m_pfnSuperWindowProc); return CWindowImplBase::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, atom); } HRESULT SmartActivateMovr(HRESULT hrPropagate); protected: void DeactivateMovr(BOOL fDestroy); // stop timer, release interfaces HRESULT ActivateMovr(); // start timer, secure interfaces STDMETHODIMP GetOurStyle(void); // get our control extender's style obj void _ChangeCapture(BOOL fSet); BOOL FFindTargetElement( IHTMLElement *pielem, IHTMLElement **ppielem ); HRESULT MoveSelfToTarget( IHTMLElement *pielem, POINT * pptDoc ); void TrackTarget(POINT * pptDoc); LRESULT OnPaint( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnMouseDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnMouseUp( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnCaptureChanged( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnTimer( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnSetCursor( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); HRESULT MoveSelfAndTarget( LONG x, LONG y ); BOOL TrackCaption( POINT * pptDoc ); void DrawCaptionButton(HDC hdc, LPRECT lprc, UINT uType, UINT uState, BOOL fErase); void DrawCaption(HDC hdc, UINT uDrawFlags, int x, int y); void UpdateCaption(UINT uDrawFlags); void CheckCaptionState(int x, int y); HRESULT _DisplayContextMenu(void); HRESULT _GetHTMLDoc(IOleClientSite * pocs, IHTMLDocument2 ** pphd2); HRESULT _IsInElement(HWND hwndParent, POINT * ppt, IHTMLElement ** pphe); HRESULT _GetZOrderSlot(LONG * plZOrderSlot, BOOL fTop); HRESULT _HandleZoom(LONG lCommand); HRESULT _EnumComponents(LPFNCOMPENUM lpfn, LPVOID lpvData, DWORD dwData); HRESULT _EnumElements(LPFNELEMENUM lpfn, LPVOID lpvData, DWORD dwData); HRESULT _TrackElement(POINT * ppt, IHTMLElement * pielem, BOOL * fDidWork); void _MapPoints(int * px, int * py); int CountActiveCaptions(); // private state information. // BOOL m_fEnabled; long m_lInterval; int m_cxBorder; int m_cyBorder; int m_cyCaption; int m_cySysCaption; int m_cyCaptionShow; int m_cySMBorder; int m_cxSMBorder; CContainedWindow m_TimerWnd; // if we're timer-driven, we need this in case we're windowless enum DragMode { dmNull = 0, // no dragable part dmMenu, // caption drop down button for menu dmClose, // caption button for close dmRestore, // caption button for restore dmFullScreen, // caption button for full screen dmSplit, // caption button for split // all gadgets on the caption bar should appear before dmMove! dmMove, // move the component dmSizeWHBR, // resize width and height from bottom right corner dmSizeWHTL, // resize width and height from top left corner dmSizeWHTR, // resize width and height from top right corner dmSizeWHBL, // resize width and height from bottom left corner dmSizeTop, // resize from the top edge dmSizeBottom, // resize from the bottom edge dmSizeLeft, // resize from the left edge dmSizeRight, // resize from the right edge cDragModes // count of drag modes, including dmNull }; BITBOOL m_fCanResizeX; // Whether this component can be resized in X Direction? BITBOOL m_fCanResizeY; // Whether this component can be resized in Y Direction? HRESULT InitAttributes(IHTMLElement *pielem); HRESULT GetParentWindow(void); DragMode m_dmCur; // current drag mode, or dmNull if none. DragMode m_dmTrack; // last drag mode seen by TrackCaption RECT m_rectInner; // area inside frame, in local coords RECT m_rectOuter; // outer bounds of mover, in local coords RECT m_rectCaption; // rect of our pseudo-caption, in local coords SIZE m_sizeCorner; // size of the corner areas of the frame BOOL GetCaptionButtonRect(DragMode dm, LPRECT lprc); void SyncRectsToTarget(void); DragMode DragModeFromPoint( POINT pt ); HCURSOR CursorFromDragMode( DragMode dm ); HRESULT SizeSelfAndTarget(POINT ptDoc); void DismissSelfNow(void); BOOL HandleNonMoveSize(DragMode dm); HCURSOR m_hcursor; LONG m_top; LONG m_left; LONG m_width; LONG m_height; BOOL m_fTimer; // do we have a timer running? UINT m_uiTimerID; POINT m_ptMouseCursor; // Mouse cursor at timer BSTR m_bstrTargetName; // name attribute on targetted html elements IHTMLStyle *m_pistyle; // our control's style object IHTMLStyle *m_pistyleTarget; // The style object of our current target, also how we ID it IHTMLElement *m_pielemTarget; // This interface on the target is how we move and resize it LONG m_iSrcTarget; // get_sourceIndex value for the current target BOOL m_fCaptured; // true if mouse-capture/ move operation in progress LONG m_dx; // delta from mouse down to corner of active gadget LONG m_dy; // delta from mouse down to corner of active gadget}; DWORD m_CaptionState; HWND m_hwndParent; LONG m_zIndexTop; LONG m_zIndexBottom; LONG m_cSkipTimer; // Used to allow the dismissal of the mover to take two timer periods. DWORD m_ItemState; }; // Defines for DrawCaption #define DMDC_CAPTION 0x0001 #define DMDC_MENU 0x0002 #define DMDC_CLOSE 0x0004 #define DMDC_RESTORE 0x0008 #define DMDC_FULLSCREEN 0x0010 #define DMDC_SPLIT 0x0020 #define DMDC_ALL (DMDC_CAPTION | DMDC_MENU | DMDC_CLOSE | DMDC_SPLIT | DMDC_FULLSCREEN | DMDC_RESTORE) // Defines for CaptionState #define CS_MENUTRACKED 0x00000001 #define CS_MENUPUSHED 0x00000002 #define CS_CLOSETRACKED 0x00000004 #define CS_CLOSEPUSHED 0x00000008 #define CS_RESTORETRACKED 0x00000010 #define CS_RESTOREPUSHED 0x00000020 #define CS_FULLSCREENTRACKED 0x00000040 #define CS_FULLSCREENPUSHED 0x00000080 #define CS_SPLITTRACKED 0x00000100 #define CS_SPLITPUSHED 0x00000200 #endif //__DESKMOVR_H_