Changeset 8553 for trunk/src/ole32/ole2.c
- Timestamp:
- Jun 2, 2002, 9:34:36 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ole32/ole2.c
r8441 r8553 57 57 HWND hwndTarget; 58 58 IDropTarget* dropTarget; 59 #ifdef __WIN32OS2__ 60 BOOL fDragEnter; 61 DWORD dwEffect; 62 IDataObject * pDataObject; 63 HDROP hDrop; 64 #endif 59 65 struct tagDropTargetNode* prevDropTarget; 60 66 struct tagDropTargetNode* nextDropTarget; … … 2218 2224 } 2219 2225 } 2226 #ifdef __WIN32OS2__ 2227 #include <dbglog.h> 2228 2229 /*********************************************************************** 2230 * IEnumFORMATETC implementation 2231 */ 2232 2233 typedef struct 2234 { 2235 /* IUnknown fields */ 2236 ICOM_VFIELD(IEnumFORMATETC); 2237 DWORD ref; 2238 /* IEnumFORMATETC fields */ 2239 UINT posFmt; 2240 UINT countFmt; 2241 LPFORMATETC pFmt; 2242 } IEnumFORMATETCImpl; 2243 2244 static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPENUMFORMATETC iface, REFIID riid, LPVOID* ppvObj); 2245 static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface); 2246 static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface); 2247 static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC* rgelt, ULONG* pceltFethed); 2248 static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt); 2249 static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface); 2250 static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum); 2251 2252 static struct ICOM_VTABLE(IEnumFORMATETC) efvt = 2253 { 2254 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 2255 IEnumFORMATETC_fnQueryInterface, 2256 IEnumFORMATETC_fnAddRef, 2257 IEnumFORMATETC_fnRelease, 2258 IEnumFORMATETC_fnNext, 2259 IEnumFORMATETC_fnSkip, 2260 IEnumFORMATETC_fnReset, 2261 IEnumFORMATETC_fnClone 2262 }; 2263 2264 LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[]) 2265 { 2266 IEnumFORMATETCImpl* ef; 2267 DWORD size=cfmt * sizeof(FORMATETC); 2268 2269 ef=(IEnumFORMATETCImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumFORMATETCImpl)); 2270 2271 if(ef) 2272 { 2273 ef->ref=1; 2274 ICOM_VTBL(ef)=&efvt; 2275 2276 ef->countFmt = cfmt; 2277 ef->pFmt = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); 2278 2279 if (ef->pFmt) 2280 { 2281 memcpy(ef->pFmt, afmt, size); 2282 } 2283 } 2284 2285 TRACE("(%p)->(%u,%p)\n",ef, cfmt, afmt); 2286 return (LPENUMFORMATETC)ef; 2287 } 2288 2289 static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPENUMFORMATETC iface, REFIID riid, LPVOID* ppvObj) 2290 { 2291 ICOM_THIS(IEnumFORMATETCImpl,iface); 2292 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); 2293 2294 *ppvObj = NULL; 2295 2296 if(IsEqualIID(riid, &IID_IUnknown)) 2297 { 2298 *ppvObj = This; 2299 } 2300 else if(IsEqualIID(riid, &IID_IEnumFORMATETC)) 2301 { 2302 *ppvObj = (IEnumFORMATETC*)This; 2303 } 2304 2305 if(*ppvObj) 2306 { 2307 IUnknown_AddRef((IUnknown*)(*ppvObj)); 2308 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); 2309 return S_OK; 2310 } 2311 TRACE("-- Interface: E_NOINTERFACE\n"); 2312 return E_NOINTERFACE; 2313 2314 } 2315 2316 static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface) 2317 { 2318 ICOM_THIS(IEnumFORMATETCImpl,iface); 2319 TRACE("(%p)->(count=%lu)\n",This, This->ref); 2320 return ++(This->ref); 2321 } 2322 2323 static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface) 2324 { 2325 ICOM_THIS(IEnumFORMATETCImpl,iface); 2326 TRACE("(%p)->()\n",This); 2327 2328 if (!--(This->ref)) 2329 { 2330 TRACE(" destroying IEnumFORMATETC(%p)\n",This); 2331 if (This->pFmt) 2332 { 2333 HeapFree(GetProcessHeap(),0, This->pFmt); 2334 } 2335 HeapFree(GetProcessHeap(),0,This); 2336 return 0; 2337 } 2338 return This->ref; 2339 } 2340 2341 static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFethed) 2342 { 2343 ICOM_THIS(IEnumFORMATETCImpl,iface); 2344 int i; 2345 2346 TRACE("(%p)->(%lu,%p)\n", This, celt, rgelt); 2347 2348 if(!This->pFmt)return S_FALSE; 2349 if(!rgelt) return E_INVALIDARG; 2350 if (pceltFethed) *pceltFethed = 0; 2351 2352 for(i = 0; This->posFmt < This->countFmt && celt > i; i++) 2353 { 2354 *rgelt++ = This->pFmt[This->posFmt++]; 2355 } 2356 2357 if (pceltFethed) *pceltFethed = i; 2358 2359 return ((i == celt) ? S_OK : S_FALSE); 2360 } 2361 2362 static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt) 2363 { 2364 ICOM_THIS(IEnumFORMATETCImpl,iface); 2365 TRACE("(%p)->(num=%lu)\n", This, celt); 2366 2367 if((This->posFmt + celt) >= This->countFmt) return S_FALSE; 2368 This->posFmt += celt; 2369 return S_OK; 2370 } 2371 2372 static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface) 2373 { 2374 ICOM_THIS(IEnumFORMATETCImpl,iface); 2375 TRACE("(%p)->()\n", This); 2376 2377 This->posFmt = 0; 2378 return S_OK; 2379 } 2380 2381 static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum) 2382 { 2383 ICOM_THIS(IEnumFORMATETCImpl,iface); 2384 TRACE("(%p)->(ppenum=%p)\n", This, ppenum); 2385 2386 if (!ppenum) return E_INVALIDARG; 2387 *ppenum = IEnumFORMATETC_Constructor(This->countFmt, This->pFmt); 2388 return S_OK; 2389 } 2390 2391 /*********************************************************************** 2392 * IDataObject implementation 2393 */ 2394 2395 2396 typedef struct 2397 { 2398 /* IUnknown fields */ 2399 ICOM_VFIELD(IDataObject); 2400 DWORD ref; 2401 2402 /* IDataObject fields */ 2403 LPFORMATETC pFormatEtc; 2404 LPSTGMEDIUM pStgMedium; 2405 DWORD cDataCount; 2406 } IDataObjectImpl; 2407 2408 static struct ICOM_VTABLE(IDataObject) dtovt; 2409 2410 /************************************************************************** 2411 * IDataObject_Constructor 2412 */ 2413 LPDATAOBJECT IDataObject_Constructor() 2414 { 2415 IDataObjectImpl* dto; 2416 2417 dto = (IDataObjectImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDataObjectImpl)); 2418 2419 if (dto) 2420 { 2421 dto->ref = 1; 2422 ICOM_VTBL(dto) = &dtovt; 2423 } 2424 2425 return (LPDATAOBJECT)dto; 2426 } 2427 2428 /*************************************************************************** 2429 * IDataObject_QueryInterface 2430 */ 2431 static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID * ppvObj) 2432 { 2433 ICOM_THIS(IDataObjectImpl,iface); 2434 dprintf(("IDataObject_fnQueryInterface (%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj)); 2435 2436 *ppvObj = NULL; 2437 2438 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ 2439 { 2440 *ppvObj = This; 2441 } 2442 else if(IsEqualIID(riid, &IID_IDataObject)) /*IDataObject*/ 2443 { 2444 *ppvObj = (IDataObject*)This; 2445 } 2446 2447 if(*ppvObj) 2448 { 2449 IUnknown_AddRef((IUnknown*)*ppvObj); 2450 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); 2451 return S_OK; 2452 } 2453 TRACE("-- Interface: E_NOINTERFACE\n"); 2454 return E_NOINTERFACE; 2455 } 2456 2457 /************************************************************************** 2458 * IDataObject_AddRef 2459 */ 2460 static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface) 2461 { 2462 ICOM_THIS(IDataObjectImpl,iface); 2463 2464 dprintf(("IDataObject_fnAddRef (%p)->(count=%lu)\n",This, This->ref)); 2465 2466 return ++(This->ref); 2467 } 2468 2469 /************************************************************************** 2470 * IDataObject_Release 2471 */ 2472 static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface) 2473 { 2474 ICOM_THIS(IDataObjectImpl,iface); 2475 dprintf(("IDataObject_fnRelease (%p)->()\n",This)); 2476 2477 if (!--(This->ref)) 2478 { 2479 TRACE(" destroying IDataObject(%p)\n",This); 2480 HeapFree(GetProcessHeap(),0,This); 2481 return 0; 2482 } 2483 return This->ref; 2484 } 2485 2486 /************************************************************************** 2487 * IDataObject_fnGetData 2488 */ 2489 static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium) 2490 { 2491 int i; 2492 2493 ICOM_THIS(IDataObjectImpl,iface); 2494 2495 if(pformatetcIn == NULL || pmedium == NULL) 2496 return E_INVALIDARG; 2497 2498 dprintf(("IDataObject_fnGetData %x %x", pformatetcIn, pmedium)); 2499 2500 if(pformatetcIn->cfFormat != CF_HDROP) 2501 { 2502 FIXME("-- expected clipformat not implemented\n"); 2503 return (E_INVALIDARG); 2504 } 2505 2506 /* check our formats table what we have */ 2507 for (i=0; i<This->cDataCount; i++) 2508 { 2509 if ((This->pFormatEtc[i].cfFormat == pformatetcIn->cfFormat) 2510 && (This->pFormatEtc[i].tymed == pformatetcIn->tymed)) 2511 { 2512 pmedium->u.hGlobal = This->pStgMedium[i].u.hGlobal; 2513 break; 2514 } 2515 } 2516 if (pmedium->u.hGlobal) 2517 { 2518 pmedium->tymed = TYMED_HGLOBAL; 2519 pmedium->pUnkForRelease = NULL; 2520 return S_OK; 2521 } 2522 return E_OUTOFMEMORY; 2523 } 2524 2525 static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium) 2526 { 2527 ICOM_THIS(IDataObjectImpl,iface); 2528 2529 dprintf(("IDataObject_fnGetDataHere %x %x STUB", pformatetc, pmedium)); 2530 return E_NOTIMPL; 2531 } 2532 2533 static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc) 2534 { 2535 ICOM_THIS(IDataObjectImpl,iface); 2536 UINT i; 2537 2538 dprintf(("IDataObject_fnQueryGetData (%p)->(fmt=0x%08x tym=0x%08lx)\n", This, pformatetc->cfFormat, pformatetc->tymed)); 2539 2540 if(!(DVASPECT_CONTENT & pformatetc->dwAspect)) 2541 return DV_E_DVASPECT; 2542 2543 if(This->pFormatEtc == NULL) { 2544 return DV_E_TYMED; 2545 } 2546 /* check our formats table what we have */ 2547 for (i=0; i<This->cDataCount; i++) 2548 { 2549 if ((This->pFormatEtc[i].cfFormat == pformatetc->cfFormat) 2550 && (This->pFormatEtc[i].tymed == pformatetc->tymed)) 2551 { 2552 return S_OK; 2553 } 2554 } 2555 2556 return DV_E_TYMED; 2557 } 2558 2559 static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut) 2560 { 2561 ICOM_THIS(IDataObjectImpl,iface); 2562 2563 dprintf(("IDataObject_fnGetCanonicalFormatEtc STUB")); 2564 return DATA_S_SAMEFORMATETC; 2565 } 2566 2567 static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease) 2568 { 2569 LPFORMATETC pfeNew, pfeTemp; 2570 LPSTGMEDIUM psmNew, psmTemp; 2571 ICOM_THIS(IDataObjectImpl,iface); 2572 2573 //no need for more than one item 2574 if(This->cDataCount != 0) { 2575 DebugInt3(); 2576 return E_OUTOFMEMORY; 2577 } 2578 This->cDataCount++; 2579 2580 pfeNew = malloc(sizeof(FORMATETC) * This->cDataCount); 2581 psmNew = malloc(sizeof(STGMEDIUM) * This->cDataCount); 2582 2583 if(pfeNew && psmNew) 2584 { 2585 memset(pfeNew, 0, sizeof(FORMATETC) * This->cDataCount); 2586 memset(psmNew, 0, sizeof(STGMEDIUM) * This->cDataCount); 2587 2588 /* copy the existing data */ 2589 if(This->pFormatEtc) 2590 { 2591 memcpy(pfeNew, This->pFormatEtc, sizeof(FORMATETC) * (This->cDataCount - 1)); 2592 } 2593 if(This->pStgMedium) 2594 { 2595 memcpy(psmNew, This->pStgMedium, sizeof(STGMEDIUM) * (This->cDataCount - 1)); 2596 } 2597 2598 /* add the new data */ 2599 pfeNew[This->cDataCount - 1] = *pformatetc; 2600 if(fRelease) 2601 { 2602 psmNew[This->cDataCount - 1] = *pmedium; 2603 } 2604 else 2605 { 2606 DebugInt3(); 2607 // CopyStgMedium(pmedium, &psmNew[This->cDataCount - 1]); 2608 } 2609 2610 pfeTemp = This->pFormatEtc; 2611 This->pFormatEtc = pfeNew; 2612 pfeNew = pfeTemp; 2613 2614 psmTemp = This->pStgMedium; 2615 This->pStgMedium = psmNew; 2616 psmNew = psmTemp; 2617 } 2618 2619 if(pfeNew) 2620 free(pfeNew); 2621 2622 if(psmNew) 2623 free(psmNew); 2624 2625 if(This->pFormatEtc && This->pStgMedium) 2626 return S_OK; 2627 2628 return E_OUTOFMEMORY; 2629 } 2630 2631 static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) 2632 { 2633 ICOM_THIS(IDataObjectImpl,iface); 2634 2635 TRACE("(%p)->()\n", This); 2636 *ppenumFormatEtc=NULL; 2637 2638 /* only get data */ 2639 if (DATADIR_GET == dwDirection) 2640 { 2641 *ppenumFormatEtc = IEnumFORMATETC_Constructor(This->cDataCount, This->pFormatEtc); 2642 return (*ppenumFormatEtc) ? S_OK : E_FAIL; 2643 } 2644 2645 return E_NOTIMPL; 2646 } 2647 2648 static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) 2649 { 2650 ICOM_THIS(IDataObjectImpl,iface); 2651 2652 dprintf(("IDataObject_fnDAdvise STUB")); 2653 return E_NOTIMPL; 2654 } 2655 static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection) 2656 { 2657 ICOM_THIS(IDataObjectImpl,iface); 2658 2659 dprintf(("IDataObject_fnDUnadvise STUB")); 2660 return E_NOTIMPL; 2661 } 2662 static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise) 2663 { 2664 ICOM_THIS(IDataObjectImpl,iface); 2665 2666 dprintf(("IDataObject_fnEnumDAdvise STUB")); 2667 return OLE_E_ADVISENOTSUPPORTED; 2668 } 2669 2670 static struct ICOM_VTABLE(IDataObject) dtovt = 2671 { 2672 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 2673 IDataObject_fnQueryInterface, 2674 IDataObject_fnAddRef, 2675 IDataObject_fnRelease, 2676 IDataObject_fnGetData, 2677 IDataObject_fnGetDataHere, 2678 IDataObject_fnQueryGetData, 2679 IDataObject_fnGetCanonicalFormatEtc, 2680 IDataObject_fnSetData, 2681 IDataObject_fnEnumFormatEtc, 2682 IDataObject_fnDAdvise, 2683 IDataObject_fnDUnadvise, 2684 IDataObject_fnEnumDAdvise 2685 }; 2686 2687 //****************************************************************************** 2688 //****************************************************************************** 2689 BOOL WINAPI OLEDD_AcceptsDragDrop(HWND hwnd) 2690 { 2691 DropTargetNode *pTarget; 2692 2693 /* 2694 * Find-out if there is a drag target under the mouse 2695 */ 2696 HWND nexttar = hwnd; 2697 do { 2698 pTarget = OLEDD_FindDropTarget(nexttar); 2699 } 2700 while(!pTarget && (nexttar = GetParent(nexttar)) != 0); 2701 2702 if(pTarget != NULL) { 2703 dprintf(("OLEDD_AcceptsDragDrop %x accepted", hwnd)); 2704 return TRUE; 2705 } 2706 dprintf(("OLEDD_AcceptsDragDrop %x refused", hwnd)); 2707 return FALSE; 2708 } 2709 //****************************************************************************** 2710 //****************************************************************************** 2711 BOOL WINAPI OLEDD_DropFiles(HWND hwnd) 2712 { 2713 DropTargetNode *pTarget; 2714 DWORD keyState = 0; 2715 POINTL mousePosParam; 2716 POINT mousePos; 2717 HWND nexttar = hwnd; 2718 2719 dprintf(("OLEDD_DropFiles %x", hwnd)); 2720 2721 do { 2722 pTarget = OLEDD_FindDropTarget(nexttar); 2723 } 2724 while(!pTarget && (nexttar = GetParent(nexttar)) != 0); 2725 if(pTarget == NULL) { 2726 return FALSE; 2727 } 2728 2729 /* 2730 * The documentation tells me that the coordinate should be in the target 2731 * window's coordinate space. However, the tests I made tell me the 2732 * coordinates should be in screen coordinates. 2733 */ 2734 GetCursorPos(&mousePos); 2735 mousePosParam.x = mousePos.x; 2736 mousePosParam.y = mousePos.y; 2737 2738 if(GetKeyState(VK_SHIFT) & 0x8000) keyState |= MK_SHIFT; 2739 if(GetKeyState(VK_CONTROL) & 0x8000) keyState |= MK_CONTROL; 2740 if(GetKeyState(VK_MENU) & 0x8000) keyState |= MK_ALT; 2741 if(GetKeyState(VK_LBUTTON) & 0x8000) keyState |= MK_LBUTTON; 2742 if(GetKeyState(VK_RBUTTON) & 0x8000) keyState |= MK_RBUTTON; 2743 if(GetKeyState(VK_MBUTTON) & 0x8000) keyState |= MK_MBUTTON; 2744 2745 return IDropTarget_Drop(pTarget->dropTarget, pTarget->pDataObject, 2746 keyState, mousePosParam, &pTarget->dwEffect) == S_OK; 2747 } 2748 //****************************************************************************** 2749 //****************************************************************************** 2750 BOOL WIN32API OLEDD_DragOver(HWND hwnd, DWORD dwEffect) 2751 { 2752 DropTargetNode *pTarget; 2753 DWORD keyState = 0; 2754 POINTL mousePosParam; 2755 POINT mousePos; 2756 HWND nexttar = hwnd; 2757 2758 dprintf(("OLEDD_DragOver %x %d", hwnd, dwEffect)); 2759 2760 do { 2761 pTarget = OLEDD_FindDropTarget(nexttar); 2762 } 2763 while(!pTarget && (nexttar = GetParent(nexttar)) != 0); 2764 if(pTarget == NULL) { 2765 return FALSE; 2766 } 2767 2768 /* 2769 * The documentation tells me that the coordinate should be in the target 2770 * window's coordinate space. However, the tests I made tell me the 2771 * coordinates should be in screen coordinates. 2772 */ 2773 GetCursorPos(&mousePos); 2774 mousePosParam.x = mousePos.x; 2775 mousePosParam.y = mousePos.y; 2776 2777 if(GetKeyState(VK_SHIFT) & 0x8000) keyState |= MK_SHIFT; 2778 if(GetKeyState(VK_CONTROL) & 0x8000) keyState |= MK_CONTROL; 2779 if(GetKeyState(VK_MENU) & 0x8000) keyState |= MK_ALT; 2780 if(GetKeyState(VK_LBUTTON) & 0x8000) keyState |= MK_LBUTTON; 2781 if(GetKeyState(VK_RBUTTON) & 0x8000) keyState |= MK_RBUTTON; 2782 if(GetKeyState(VK_MBUTTON) & 0x8000) keyState |= MK_MBUTTON; 2783 return IDropTarget_DragOver(pTarget->dropTarget, keyState, mousePosParam, &dwEffect) == S_OK; 2784 } 2785 //****************************************************************************** 2786 //****************************************************************************** 2787 BOOL WIN32API OLEDD_DragEnter(HWND hwnd, HDROP hDrop, DWORD dwEffect) 2788 { 2789 FORMATETC fe; 2790 STGMEDIUM medium; 2791 DropTargetNode *pTarget; 2792 DWORD keyState = 0; 2793 POINTL mousePosParam; 2794 POINT mousePos; 2795 HWND nexttar = hwnd; 2796 2797 dprintf(("OLEDD_DragEnter %x %x %d", hwnd, hDrop, dwEffect)); 2798 2799 do { 2800 pTarget = OLEDD_FindDropTarget(nexttar); 2801 } 2802 while(!pTarget && (nexttar = GetParent(nexttar)) != 0); 2803 if(pTarget == NULL) { 2804 return FALSE; 2805 } 2806 2807 /* 2808 * The documentation tells me that the coordinate should be in the target 2809 * window's coordinate space. However, the tests I made tell me the 2810 * coordinates should be in screen coordinates. 2811 */ 2812 GetCursorPos(&mousePos); 2813 mousePosParam.x = mousePos.x; 2814 mousePosParam.y = mousePos.y; 2815 2816 if(GetKeyState(VK_SHIFT) & 0x8000) keyState |= MK_SHIFT; 2817 if(GetKeyState(VK_CONTROL) & 0x8000) keyState |= MK_CONTROL; 2818 if(GetKeyState(VK_MENU) & 0x8000) keyState |= MK_ALT; 2819 if(GetKeyState(VK_LBUTTON) & 0x8000) keyState |= MK_LBUTTON; 2820 if(GetKeyState(VK_RBUTTON) & 0x8000) keyState |= MK_RBUTTON; 2821 if(GetKeyState(VK_MBUTTON) & 0x8000) keyState |= MK_MBUTTON; 2822 2823 fe.cfFormat = CF_HDROP; 2824 fe.ptd = NULL; 2825 fe.dwAspect = DVASPECT_CONTENT; 2826 fe.lindex = -1; 2827 fe.tymed = TYMED_HGLOBAL; 2828 2829 medium.u.hGlobal = hDrop; 2830 medium.tymed = TYMED_HGLOBAL; 2831 medium.pUnkForRelease = NULL; 2832 2833 pTarget->fDragEnter = TRUE; 2834 pTarget->dwEffect = dwEffect; 2835 2836 //just in case dragleave wasn't called... 2837 if(pTarget->hDrop) { 2838 GlobalFree(pTarget->hDrop); 2839 } 2840 if(pTarget->pDataObject) { 2841 IDataObject_Release(pTarget->pDataObject); 2842 } 2843 2844 pTarget->hDrop = hDrop; 2845 pTarget->pDataObject = IDataObject_Constructor(); 2846 IDataObject_AddRef(pTarget->pDataObject); 2847 IDataObject_SetData(pTarget->pDataObject, &fe, &medium, TRUE); 2848 return IDropTarget_DragEnter(pTarget->dropTarget, pTarget->pDataObject, keyState, mousePosParam, &dwEffect) == S_OK; 2849 } 2850 //****************************************************************************** 2851 //****************************************************************************** 2852 BOOL WIN32API OLEDD_DragLeave(HWND hwnd) 2853 { 2854 DropTargetNode *pTarget; 2855 2856 dprintf(("OLEDD_DragLeave %x", hwnd)); 2857 2858 pTarget = OLEDD_FindDropTarget(hwnd); 2859 if(pTarget == NULL) { 2860 return FALSE; 2861 } 2862 pTarget->fDragEnter = FALSE; 2863 if(pTarget->hDrop) { 2864 GlobalFree(pTarget->hDrop); 2865 pTarget->hDrop = 0; 2866 } 2867 if(pTarget->pDataObject) { 2868 IDataObject_Release(pTarget->pDataObject); 2869 pTarget->pDataObject = NULL; 2870 } 2871 return IDropTarget_DragLeave(pTarget->dropTarget) == S_OK; 2872 } 2873 //****************************************************************************** 2874 //****************************************************************************** 2875 #endif 2876 2220 2877 #ifndef __WIN32OS2__ 2221 2878 /******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.