291 lines
11 KiB
C++
291 lines
11 KiB
C++
// 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<CComSingleThreadModel>,
|
|
public CComCoClass<CDeskMovr,&CLSID_DeskMovr>,
|
|
public CComControl<CDeskMovr>,
|
|
public IDeskMovr,
|
|
public IOleObjectImpl<CDeskMovr>,
|
|
public IPersistPropertyBag,
|
|
public IOleControlImpl<CDeskMovr>,
|
|
public IOleInPlaceActiveObjectImpl<CDeskMovr>,
|
|
public IViewObjectExImpl<CDeskMovr>,
|
|
public IOleInPlaceObjectWindowlessImpl<CDeskMovr>,
|
|
public IQuickActivateImpl<CDeskMovr>
|
|
{
|
|
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<CDeskMovr,&CLSID_DeskMovr>::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_
|