Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <Grid AllowDrop="True" Background="Transparent"/>
- using System;
- using System.Runtime.InteropServices;
- using System.Windows;
- using System.Windows.Input;
- using System.Windows.Interop;
- using IDataObject_Com = System.Runtime.InteropServices.ComTypes.IDataObject;
- namespace WpfApp2
- {
- [StructLayout(LayoutKind.Sequential)]
- public struct Win32Point
- {
- public int x;
- public int y;
- }
- [ComImport]
- [Guid("4657278A-411B-11d2-839A-00C04FD918D0")]
- public class DragDropHelper { }
- [ComVisible(true)]
- [ComImport]
- [Guid("4657278B-411B-11D2-839A-00C04FD918D0")]
- [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IDropTargetHelper
- {
- void DragEnter(
- [In] IntPtr hwndTarget,
- [In, MarshalAs(UnmanagedType.Interface)] IDataObject_Com dataObject,
- [In] ref Win32Point pt,
- [In] int effect);
- void DragLeave();
- void DragOver(
- [In] ref Win32Point pt,
- [In] int effect);
- void Drop(
- [In, MarshalAs(UnmanagedType.Interface)] IDataObject_Com dataObject,
- [In] ref Win32Point pt,
- [In] int effect);
- void Show(
- [In] bool show);
- }
- /// <summary>
- /// Interaction logic for MainWindow.xaml
- /// </summary>
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- }
- private IDropTargetHelper ddHelper = (IDropTargetHelper)new DragDropHelper();
- private void Window_DragEnter(object sender, DragEventArgs e)
- {
- e.Effects = DragDropEffects.Copy;
- e.Handled = true;
- Point p = this.PointToScreen(e.GetPosition(this));
- Win32Point wp;
- wp.x = (int)p.X;
- wp.y = (int)p.Y;
- ddHelper.DragEnter(new WindowInteropHelper(this).Handle, e.Data as IDataObject_Com, ref wp, (int)e.Effects);
- }
- private void Window_DragOver(object sender, DragEventArgs e)
- {
- e.Effects = DragDropEffects.Copy;
- e.Handled = true;
- Point p = this.PointToScreen(e.GetPosition(this));
- Win32Point wp;
- wp.x = (int)p.X;
- wp.y = (int)p.Y;
- ddHelper.DragOver(ref wp, (int)e.Effects);
- }
- private void Window_DragLeave(object sender, DragEventArgs e)
- {
- e.Handled = true;
- ddHelper.DragLeave();
- }
- private void Window_Drop(object sender, DragEventArgs e)
- {
- e.Effects = DragDropEffects.Copy;
- e.Handled = true;
- Point p = this.PointToScreen(e.GetPosition(this));
- Win32Point wp;
- wp.x = (int)p.X;
- wp.y = (int)p.Y;
- ddHelper.Drop(e.Data as IDataObject_Com, ref wp, (int)e.Effects);
- }
- }
- }
- <Window x:Class="WpfApp2.MainWindow"
- ...
- AllowDrop="True"
- DragEnter="Window_DragEnter"
- DragOver="Window_DragOver"
- DragLeave="Window_DragLeave"
- Drop="Window_Drop">
- ...
- </Window>
- BitmapSource bitmapSource = null;
- int Xpos = 0;
- int Ypos = 0;
- var stream = e.Data.GetData("DragImageBits") as MemoryStream;
- if(stream == null)
- return;
- using (BinaryReader reader = new BinaryReader(stream, Encoding.ASCII, true))
- {
- // Чтение заголовка
- reader.BaseStream.Position = 0;
- int width = reader.ReadInt32();
- int height = reader.ReadInt32();
- Xpos = reader.ReadInt32();
- Ypos = reader.ReadInt32();
- // Получение исходного изображения
- reader.BaseStream.Position = 24;
- byte[] data = reader.ReadBytes(width * height * 4);
- PixelFormat pixelFormat = PixelFormats.Pbgra32;
- int stride = 4 * ((width * pixelFormat.BitsPerPixel + 31) / 32);
- bitmapSource = BitmapSource.Create(width, height, 96, 96, pixelFormat, null, data, stride);
- // Трансформация, поскольку исходное изображение перевёрнуто и отражено
- TransformGroup transformGroup = new TransformGroup();
- transformGroup.Children.Add(new RotateTransform(180));
- transformGroup.Children.Add(new ScaleTransform(-1, 1));
- bitmapSource = new TransformedBitmap(bitmapSource, transformGroup);
- }
Add Comment
Please, Sign In to add comment