soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SDropTargetDispatcher.cpp
1#include "souistd.h"
4
5SNSBEGIN
12
14{
15 m_pOwner = pOwner;
16}
17
19{
20 DragLeave();
21 SPOSITION pos = m_mapDropTarget.GetStartPosition();
22 while (pos)
23 {
24 DTMAP::CPair *pPair = m_mapDropTarget.GetNext(pos);
25 pPair->m_value->Release();
26 }
27}
28
29BOOL SDropTargetDispatcher::RegisterDragDrop(SWND swnd, IDropTarget *pDropTarget)
30{
31 if (m_mapDropTarget.Lookup(swnd))
32 return FALSE;
33 m_mapDropTarget[swnd] = pDropTarget;
34 pDropTarget->AddRef();
35 return TRUE;
36}
37
39{
40 DTMAP::CPair *pPair = m_mapDropTarget.Lookup(swnd);
41 if (!pPair)
42 return FALSE;
43 pPair->m_value->Release();
44 m_mapDropTarget.RemoveKey(swnd);
45 return TRUE;
46}
47
48#ifdef _WIN32
49#define __uuidofsys __uuidof
50#else
51#define __uuidofsys __suidof
52#endif
53
54HRESULT SDropTargetDispatcher::QueryInterface(/* [in] */ REFIID riid,
55 /* [iid_is][out] */ void **ppvObject)
56{
57 HRESULT hr = S_FALSE;
58 if (riid == __uuidofsys(IUnknown))
59 *ppvObject = (IUnknown *)this, hr = S_OK;
60 else if (riid == __uuidofsys(IDropTarget))
61 *ppvObject = (IDropTarget *)this, hr = S_OK;
62 return hr;
63}
64
65HRESULT SDropTargetDispatcher::DragEnter(/* [unique][in] */ IDataObject *pDataObj,
66 /* [in] */ DWORD grfKeyState,
67 /* [in] */ POINTL pt,
68 /* [out][in] */ DWORD *pdwEffect)
69{
70 m_pDataObj = pDataObj;
71 m_pDataObj->AddRef();
72 return DragOver(grfKeyState, pt, pdwEffect);
73}
74
75HRESULT SDropTargetDispatcher::DragOver(/* [in] */ DWORD grfKeyState,
76 /* [in] */ POINTL pt,
77 /* [out][in] */ DWORD *pdwEffect)
78{
79 *pdwEffect = DROPEFFECT_NONE;
80 CPoint pt2 = PointL2FrameClient(pt);
81 CPoint pt3 = pt2;
82 SWND hHover = m_pOwner->SwndFromPoint(pt2);
83
84 if (hHover != m_hHover)
85 {
86 DTMAP::CPair *pPairOld = m_mapDropTarget.Lookup(m_hHover);
87 DTMAP::CPair *pPairNew = m_mapDropTarget.Lookup(hHover);
88 if (pPairOld && !pPairNew)
89 {
91 if (pOldWnd)
92 {
93 CRect rcWnd = pOldWnd->GetWindowRect();
94 if (rcWnd.PtInRect(pt3))
95 {
96 pPairOld->m_value->DragOver(grfKeyState, pt, pdwEffect);
97 return S_OK;
98 }
99 }
100 }
101 if (m_hHover && pPairOld)
102 pPairOld->m_value->DragLeave();
103 m_hHover = hHover;
104 if (pPairNew && m_hHover)
105 pPairNew->m_value->DragEnter(m_pDataObj, grfKeyState, pt, pdwEffect);
106 }
107 else
108 {
109 DTMAP::CPair *pPair = m_mapDropTarget.Lookup(m_hHover);
110 if (m_hHover && pPair)
111 pPair->m_value->DragOver(grfKeyState, pt, pdwEffect);
112 }
113
114 return S_OK;
115}
116
117HRESULT STDMETHODCALLTYPE SDropTargetDispatcher::DragLeave(void)
118{
119 if (m_pDataObj)
120 {
121 m_pDataObj->Release();
122 m_pDataObj = NULL;
123 }
124 return S_OK;
125}
126
127HRESULT STDMETHODCALLTYPE SDropTargetDispatcher::Drop(/* [unique][in] */ IDataObject *pDataObj,
128 /* [in] */ DWORD grfKeyState,
129 /* [in] */ POINTL pt,
130 /* [out][in] */ DWORD *pdwEffect)
131{
132 DTMAP::CPair *pPair = m_mapDropTarget.Lookup(m_hHover);
133 if (m_hHover && pPair)
134 pPair->m_value->Drop(pDataObj, grfKeyState, pt, pdwEffect);
135 m_hHover = 0;
136 if (m_pDataObj)
137 {
138 m_pDataObj->Release();
139 m_pDataObj = NULL;
140 }
141 return S_OK;
142}
143
145{
146 CPoint pt2(pt.x, pt.y);
147 ScreenToClient(m_pOwner->GetContainer()->GetHostHwnd(), &pt2);
148 return pt2;
149}
150
151SNSEND
Drag-and-drop target dispatcher module.
SOUI窗口容器的实现
HRESULT DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
Handles the DragOver event.
HRESULT Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
Handles the Drop event.
HRESULT DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
Handles the DragEnter event.
~SDropTargetDispatcher(void)
Destructor.
POINT PointL2FrameClient(const POINTL &pt)
Converts POINTL to frame client coordinates.
HRESULT QueryInterface(REFIID riid, void **ppvObject)
Queries for a specific interface.
BOOL RegisterDragDrop(SWND swnd, IDropTarget *pDropTarget)
Registers a drag-and-drop target for a window.
void SetOwner(SWindow *pOwner)
Sets the owner window.
BOOL UnregisterDragDrop(SWND swnd)
Unregisters a drag-and-drop target for a window.
HRESULT DragLeave(void)
Handles the DragLeave event.
Base class for SOUI DUI windows.
Definition SWnd.h:286
void GetWindowRect(LPRECT prect) SCONST OVERRIDE
Retrieves the bounding rectangle of the window.
static SWindow * GetWindow(SWND swnd)
Retrieves the SWindow pointer from a given handle.