//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: drag.h // // Contents: Classes used in drag operation // // Classes: CPoint // CDragDefaultCursors // CDragOperation // CWin31DropTarget // // History: dd-mmm-yy Author Comment // 20-Oct-94 alexgo added CWin31DropTarget to handle Win3.1 // style drag drop // 21-Apr-94 ricksa split out from drag.cpp // // Notes: This exists as a separate file to facilitate the special // processing required for WM_CANCELMODE during drag/drop. // //-------------------------------------------------------------------------- #ifndef _DRAG_H #define _DRAG_H void DragDropProcessUninitialize(void); //+------------------------------------------------------------------------- // // Class: CPoint // // Purpose: Handles strangness of the POINTL & POINT structures. // // Interface: Set - set value of data // GetPOINT - return a reference to a POINT structure // GetPOINTL - return a reference to a POINTL structure // GetAddressOfPOINT - return address of point structure // // History: dd-mmm-yy Author Comment // 04-Apr-94 Ricksa Created // // Notes: This class is created because we have two structures // that are exactly the same in Win32 but have different // types. This class will have to be modified for use // in Win16 if we ever do that again. // //-------------------------------------------------------------------------- class CPoint { public: CPoint(void); void Set(LONG x, LONG y); POINT& GetPOINT(void); POINTL& GetPOINTL(void); POINT * GetAddressOfPOINT(void); private: POINT _pt; }; //+------------------------------------------------------------------------- // // Function: CPoint::CPoint // // Synopsis: Initialize object to zero // // History: dd-mmm-yy Author Comment // 04-Apr-94 Ricksa Created // //-------------------------------------------------------------------------- inline CPoint::CPoint(void) { _pt.x = 0; _pt.y = 0; } //+------------------------------------------------------------------------- // // Function: CPoint::Set // // Synopsis: Set value of structure // // History: dd-mmm-yy Author Comment // 04-Apr-94 Ricksa Created // //-------------------------------------------------------------------------- inline void CPoint::Set(LONG x, LONG y) { _pt.x = x; _pt.y = y; } //+------------------------------------------------------------------------- // // Function: CPoint::GetPOINT // // Synopsis: Return a reference to a POINT type for function calls // // History: dd-mmm-yy Author Comment // 04-Apr-94 Ricksa Created // //-------------------------------------------------------------------------- inline POINT& CPoint::GetPOINT(void) { return _pt; } //+------------------------------------------------------------------------- // // Function: CPoint::GetPOINTL // // Synopsis: Return a reference to a POINTL type for function calls // // History: dd-mmm-yy Author Comment // 04-Apr-94 Ricksa Created // //-------------------------------------------------------------------------- inline POINTL& CPoint::GetPOINTL(void) { return *((POINTL *) &_pt); } //+------------------------------------------------------------------------- // // Function: CPoint::GetAddressOfPOINT // // Synopsis: Return address of POINT type for function calls // // History: dd-mmm-yy Author Comment // 04-Apr-94 Ricksa Created // //-------------------------------------------------------------------------- inline POINT *CPoint::GetAddressOfPOINT(void) { return &_pt; } //+------------------------------------------------------------------------- // // Class: CDragDefaultCursors // // Purpose: Handles init/setting default drag cursors // // Interface: NeedInit - whether object needs to be initialized // Init - does initialization // SetCursor - sets cursor to appropriate default // // History: dd-mmm-yy Author Comment // 19-Apr-94 Ricksa Created // // Notes: This class specifically avoids a constructor and depends // on the behavior of of static data being initialized to // NULL. The reason for this is two fold: (1) it makes start // up faster by avoiding a page fault when the constructor // would be called and (2) it allows this ole32 to be loaded // at boot time before cursors exist. // //-------------------------------------------------------------------------- class CDragDefaultCursors : public CPrivAlloc { public: BOOL Init(void); void SetCursor(DWORD dwEffect); void SetCursorNone(void); static CDragDefaultCursors *GetDefaultCursorObject(void); private: enum SCROLL_TYPE {NO_SCROLL, SCROLL}; enum CURSOR_ID {NO_DROP, MOVE_DROP, COPY_DROP, LINK_DROP}; HCURSOR ahcursorDefaults[2][4]; }; //+------------------------------------------------------------------------- // // Function: CDragDefaultCursors::SetCursorNone // // Synopsis: Set the cursor to none // // History: dd-mmm-yy Author Comment // 19-Apr-94 Ricksa Created // //-------------------------------------------------------------------------- inline void CDragDefaultCursors::SetCursorNone(void) { ::SetCursor(ahcursorDefaults[NO_SCROLL][NO_DROP]); } //+------------------------------------------------------------------------- // // Class: CDragOperation // // Purpose: Handles breaking down drag operation into managable pieces // // Interface: UpdateTarget - update where we are trying to drop // HandleFeedBack - handle cursor feedback // DragOver - handle dragging object over target // HandleMessages - Handle windows messages // CompleteDrop - Do drop or clean up // CancelDrag - notify operation that drag is canceled. // ReleaseCapture - release capture on the mouse // GetDropTarget - get target for drop // // History: dd-mmm-yy Author Comment // 04-Apr-94 Ricksa Created // //-------------------------------------------------------------------------- class CDragOperation { public: CDragOperation( LPDATAOBJECT pDataObject, LPDROPSOURCE pDropSource, DWORD dwOKEffects, DWORD FAR *pdwEffect, HRESULT& hr); ~CDragOperation(void); BOOL UpdateTarget(void); BOOL HandleFeedBack(HRESULT hr); BOOL DragOver(void); BOOL HandleMessages(void); HRESULT CompleteDrop(void); void CancelDrag(void); void ReleaseCapture(void); IFBuffer GetDOBuffer(void); private: void InitCursors(void); void InitScrollInt(void); HRESULT GetDropTarget(HWND hwnd31,HWND hwndDropTarget); LPDATAOBJECT _pDataObject; IFBuffer _DOBuffer; // a buffer for the marshalled // data object LPDROPSOURCE _pDropSource; LPDROPTARGET _pDropTarget; LPDROPTARGET _pRealDropTarget; HANDLE _hFormats; CPoint _cpt; DWORD _dwOKEffects; DWORD FAR * _pdwEffect; BOOL _fEscapePressed; HCURSOR _curOld; HWND _hwndLast; DWORD _grfKeyState; HRESULT _hrDragResult; BOOL _fReleasedCapture; CDragDefaultCursors* _pcddcDefault; BOOL _fUseWin31; static LONG s_wScrollInt; }; //+------------------------------------------------------------------------- // // Function: CDragOperation::ReleaseCapture // // Synopsis: Tell clipboard window to turn off mouse capture if we haven't // already done so. // // History: dd-mmm-yy Author Comment // 07-Jul-94 Ricksa Created // //-------------------------------------------------------------------------- inline void CDragOperation::ReleaseCapture(void) { if (!_fReleasedCapture) { _fReleasedCapture = TRUE; ClipReleaseCaptureForDrag(); } } //+------------------------------------------------------------------------- // // Member: CDragOperation::GetDOBuffer // // Synopsis: returns the interface buffer for the marshalled // data object interface // // Effects: // // Arguments: // // Requires: // // Returns: IFBuffer * // // Signals: // // Modifies: // // Derivation: // // Algorithm: // // History: dd-mmm-yy Author Comment // 02-Dec-94 alexgo author // // Notes: // //-------------------------------------------------------------------------- inline IFBuffer CDragOperation::GetDOBuffer(void) { return _DOBuffer; } //+------------------------------------------------------------------------- // // Class: CDropTarget // // Purpose: Implements IDropTarget for the DoDragLoop. This class // will either delegate to a real drop target (registered // with RegisterDragDrop) or translate IDropTarget methods // into the Win3.1 drag drop protocol. // // Interface: IDropTarget // // History: dd-mmm-yy Author Comment // 20-Oct-94 alexgo author // // Notes: This class is NOT thread safe, nor is it safe to pass // outside of the CDragOperation class (which is why // QueryInterface is not implemented). As long as // DoDropDrag works by a modal loop on the calling thread, // this should not have to change. // //-------------------------------------------------------------------------- class CDropTarget : public IDropTarget, public CPrivAlloc { public: STDMETHOD(QueryInterface) (REFIID riid, LPVOID *ppv); STDMETHOD_(ULONG, AddRef) (void); STDMETHOD_(ULONG, Release) (void); STDMETHOD(DragEnter) (IDataObject *pDataObject, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect); STDMETHOD(DragOver) (DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect); STDMETHOD(DragLeave) (void); STDMETHOD(Drop) (IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); private: CDropTarget(HWND hwnd31, HWND hwndOLE, DWORD _dwEffectLast, CDragOperation *pdo, DDInfo hDDInfo); ~CDropTarget(); HWND _hwndOLE; HWND _hwnd31; DWORD _dwEffectLast; ULONG _crefs; CDragOperation * _pdo; DDInfo _hDDInfo; // make CDragOperation a friend so it can create an instance of our // class (the constructor is private) friend class CDragOperation; }; #endif // _DRAG_H