Guest User

Untitled

a guest
May 24th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.25 KB | None | 0 0
  1. <Grid AllowDrop="True" Background="Transparent"/>
  2.  
  3. using System;
  4. using System.Runtime.InteropServices;
  5. using System.Windows;
  6. using System.Windows.Input;
  7. using System.Windows.Interop;
  8. using IDataObject_Com = System.Runtime.InteropServices.ComTypes.IDataObject;
  9.  
  10. namespace WpfApp2
  11. {
  12. [StructLayout(LayoutKind.Sequential)]
  13. public struct Win32Point
  14. {
  15. public int x;
  16. public int y;
  17. }
  18.  
  19. [ComImport]
  20. [Guid("4657278A-411B-11d2-839A-00C04FD918D0")]
  21. public class DragDropHelper { }
  22.  
  23. [ComVisible(true)]
  24. [ComImport]
  25. [Guid("4657278B-411B-11D2-839A-00C04FD918D0")]
  26. [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  27. public interface IDropTargetHelper
  28. {
  29. void DragEnter(
  30. [In] IntPtr hwndTarget,
  31. [In, MarshalAs(UnmanagedType.Interface)] IDataObject_Com dataObject,
  32. [In] ref Win32Point pt,
  33. [In] int effect);
  34. void DragLeave();
  35.  
  36. void DragOver(
  37. [In] ref Win32Point pt,
  38. [In] int effect);
  39.  
  40. void Drop(
  41. [In, MarshalAs(UnmanagedType.Interface)] IDataObject_Com dataObject,
  42. [In] ref Win32Point pt,
  43. [In] int effect);
  44.  
  45. void Show(
  46. [In] bool show);
  47. }
  48.  
  49. /// <summary>
  50. /// Interaction logic for MainWindow.xaml
  51. /// </summary>
  52. public partial class MainWindow : Window
  53. {
  54. public MainWindow()
  55. {
  56. InitializeComponent();
  57. }
  58.  
  59. private IDropTargetHelper ddHelper = (IDropTargetHelper)new DragDropHelper();
  60.  
  61. private void Window_DragEnter(object sender, DragEventArgs e)
  62. {
  63. e.Effects = DragDropEffects.Copy;
  64. e.Handled = true;
  65. Point p = this.PointToScreen(e.GetPosition(this));
  66. Win32Point wp;
  67. wp.x = (int)p.X;
  68. wp.y = (int)p.Y;
  69.  
  70. ddHelper.DragEnter(new WindowInteropHelper(this).Handle, e.Data as IDataObject_Com, ref wp, (int)e.Effects);
  71. }
  72.  
  73. private void Window_DragOver(object sender, DragEventArgs e)
  74. {
  75. e.Effects = DragDropEffects.Copy;
  76. e.Handled = true;
  77. Point p = this.PointToScreen(e.GetPosition(this));
  78. Win32Point wp;
  79. wp.x = (int)p.X;
  80. wp.y = (int)p.Y;
  81.  
  82. ddHelper.DragOver(ref wp, (int)e.Effects);
  83. }
  84.  
  85. private void Window_DragLeave(object sender, DragEventArgs e)
  86. {
  87. e.Handled = true;
  88.  
  89. ddHelper.DragLeave();
  90. }
  91.  
  92. private void Window_Drop(object sender, DragEventArgs e)
  93. {
  94. e.Effects = DragDropEffects.Copy;
  95. e.Handled = true;
  96. Point p = this.PointToScreen(e.GetPosition(this));
  97. Win32Point wp;
  98. wp.x = (int)p.X;
  99. wp.y = (int)p.Y;
  100.  
  101. ddHelper.Drop(e.Data as IDataObject_Com, ref wp, (int)e.Effects);
  102. }
  103. }
  104. }
  105.  
  106. <Window x:Class="WpfApp2.MainWindow"
  107. ...
  108. AllowDrop="True"
  109. DragEnter="Window_DragEnter"
  110. DragOver="Window_DragOver"
  111. DragLeave="Window_DragLeave"
  112. Drop="Window_Drop">
  113. ...
  114. </Window>
  115.  
  116. BitmapSource bitmapSource = null;
  117. int Xpos = 0;
  118. int Ypos = 0;
  119. var stream = e.Data.GetData("DragImageBits") as MemoryStream;
  120. if(stream == null)
  121. return;
  122. using (BinaryReader reader = new BinaryReader(stream, Encoding.ASCII, true))
  123. {
  124. // Чтение заголовка
  125. reader.BaseStream.Position = 0;
  126. int width = reader.ReadInt32();
  127. int height = reader.ReadInt32();
  128. Xpos = reader.ReadInt32();
  129. Ypos = reader.ReadInt32();
  130.  
  131. // Получение исходного изображения
  132. reader.BaseStream.Position = 24;
  133. byte[] data = reader.ReadBytes(width * height * 4);
  134. PixelFormat pixelFormat = PixelFormats.Pbgra32;
  135. int stride = 4 * ((width * pixelFormat.BitsPerPixel + 31) / 32);
  136. bitmapSource = BitmapSource.Create(width, height, 96, 96, pixelFormat, null, data, stride);
  137.  
  138. // Трансформация, поскольку исходное изображение перевёрнуто и отражено
  139. TransformGroup transformGroup = new TransformGroup();
  140. transformGroup.Children.Add(new RotateTransform(180));
  141. transformGroup.Children.Add(new ScaleTransform(-1, 1));
  142. bitmapSource = new TransformedBitmap(bitmapSource, transformGroup);
  143. }
Add Comment
Please, Sign In to add comment