mirror of
				https://gitee.com/csharpui/CPF.git
				synced 2025-11-01 00:46:56 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			144 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using CPF.Drawing;
 | |
| using CPF.Input;
 | |
| //using IOleDataObject = System.Runtime.InteropServices.ComTypes.IDataObject;
 | |
| 
 | |
| namespace CPF.Windows
 | |
| {
 | |
|     public class OleDropTarget : IDropTarget
 | |
|     {
 | |
|         private readonly WindowImpl _target;
 | |
| 
 | |
|         Input.IDataObject _currentDrag;
 | |
| 
 | |
|         public OleDropTarget(WindowImpl target)
 | |
|         {
 | |
|             _target = target;
 | |
|         }
 | |
| 
 | |
|         public static uint ConvertDropEffect(DragDropEffects operation)
 | |
|         {
 | |
|             DropEffect result = DropEffect.None;
 | |
|             if (operation.HasFlag(DragDropEffects.Copy))
 | |
|                 result |= DropEffect.Copy;
 | |
|             if (operation.HasFlag(DragDropEffects.Move))
 | |
|                 result |= DropEffect.Move;
 | |
|             if (operation.HasFlag(DragDropEffects.Link))
 | |
|                 result |= DropEffect.Link;
 | |
|             return (uint)result;
 | |
|         }
 | |
| 
 | |
|         public static DragDropEffects ConvertDropEffect(DropEffect effect)
 | |
|         {
 | |
|             DragDropEffects result = DragDropEffects.None;
 | |
|             if (effect.HasFlag(DropEffect.Copy))
 | |
|                 result |= DragDropEffects.Copy;
 | |
|             if (effect.HasFlag(DropEffect.Move))
 | |
|                 result |= DragDropEffects.Move;
 | |
|             if (effect.HasFlag(DropEffect.Link))
 | |
|                 result |= DragDropEffects.Link;
 | |
|             return result;
 | |
|         }
 | |
| 
 | |
|         //private static InputModifiers ConvertKeyState(int grfKeyState)
 | |
|         //{
 | |
|         //    InputModifiers modifiers = InputModifiers.None;
 | |
|         //    var state = (UnmanagedMethods.ModifierKeys)grfKeyState;
 | |
| 
 | |
|         //    if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_LBUTTON))
 | |
|         //        modifiers |= InputModifiers.LeftMouseButton;
 | |
|         //    if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_MBUTTON))
 | |
|         //        modifiers |= InputModifiers.MiddleMouseButton;
 | |
|         //    if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_RBUTTON))
 | |
|         //        modifiers |= InputModifiers.RightMouseButton;
 | |
|         //    if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_SHIFT))
 | |
|         //        modifiers |= InputModifiers.Shift;
 | |
|         //    if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_CONTROL))
 | |
|         //        modifiers |= InputModifiers.Control;
 | |
|         //    if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_ALT))
 | |
|         //        modifiers |= InputModifiers.Alt;
 | |
|         //    return modifiers;
 | |
|         //}
 | |
|         HRESULT IDropTarget.DragEnter(IOleDataObject pDataObj, uint grfKeyState, POINT pt, ref uint pdwEffect)
 | |
|         {
 | |
|             _currentDrag = pDataObj as Input.IDataObject;
 | |
|             if (_currentDrag == null)
 | |
|                 _currentDrag = new OleDataObject(pDataObj);
 | |
| 
 | |
|             //var args = new RawDragEvent(
 | |
|             //    _dragDevice,
 | |
|             //    RawDragEventType.DragEnter,
 | |
|             //    _target,
 | |
|             //    GetDragLocation(pt),
 | |
|             //    _currentDrag,
 | |
|             //    ConvertDropEffect(pdwEffect),
 | |
|             //    //ConvertKeyState(grfKeyState)
 | |
|             //);
 | |
|             //dispatch(args);
 | |
|             //pdwEffect = ConvertDropEffect(args.Effects);
 | |
|             //Debug.WriteLine(pdwEffect + " " + _currentDrag.Get(DataFormat.Text));
 | |
| 
 | |
|             //var etc = pDataObj.EnumFormatEtc(DATADIR.DATADIR_GET);
 | |
|             //FORMATETC[] fs = new FORMATETC[1];
 | |
|             //while (etc.Next(1, fs, null) == 0)
 | |
|             //{
 | |
|             //    Debug.WriteLine(fs[0].cfFormat);
 | |
|             //}
 | |
|             //Debug.WriteLine(pdwEffect);
 | |
|             pdwEffect = ConvertDropEffect(_target.Root.InputManager.DragDropDevice.DragEnter(new DragEventArgs(_currentDrag, GetDragLocation(pt), _target.Root) { DragEffects = ConvertDropEffect((DropEffect)pdwEffect) }, _target.Root.LayoutManager.VisibleUIElements));
 | |
|             return HRESULT.S_OK;
 | |
|         }
 | |
| 
 | |
|         HRESULT IDropTarget.DragOver(uint grfKeyState, POINT pt, ref uint pdwEffect)
 | |
|         {
 | |
|             pdwEffect = ConvertDropEffect(_target.Root.InputManager.DragDropDevice.DragOver(new DragEventArgs(_currentDrag, GetDragLocation(pt), _target.Root) { DragEffects = ConvertDropEffect((DropEffect)pdwEffect) }, _target.Root.LayoutManager.VisibleUIElements));
 | |
|             return HRESULT.S_OK;
 | |
|         }
 | |
| 
 | |
|         HRESULT IDropTarget.DragLeave()
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 _target.Root.InputManager.DragDropDevice.DragLeave(_target.Root.LayoutManager.VisibleUIElements);
 | |
|                 return HRESULT.S_OK;
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 _currentDrag = null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         HRESULT IDropTarget.Drop(IOleDataObject pDataObj, uint grfKeyState, POINT pt, ref uint pdwEffect)
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 _currentDrag = pDataObj as Input.IDataObject;
 | |
|                 if (_currentDrag == null)
 | |
|                     _currentDrag = new OleDataObject(pDataObj);
 | |
| 
 | |
|                 pdwEffect = ConvertDropEffect(_target.Root.InputManager.DragDropDevice.Drop(new DragEventArgs(_currentDrag, GetDragLocation(pt), _target.Root) { DragEffects = ConvertDropEffect((DropEffect)pdwEffect) }, _target.Root.LayoutManager.VisibleUIElements));
 | |
| 
 | |
|                 return HRESULT.S_OK;
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 _currentDrag = null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private Point GetDragLocation(POINT dragPoint)
 | |
|         {
 | |
|             //int x = (int)dragPoint;
 | |
|             //int y = (int)(dragPoint >> 32);
 | |
| 
 | |
|             var screenPt = new Point(dragPoint.X, dragPoint.Y);
 | |
|             return _target.PointToClient(screenPt);
 | |
|             //return screenPt;
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| }
 | 
