Я хочу, чтобы мое приложение WPF было целевой точкой, и я хочу, чтобы можно было перетаскивать изображение с любой веб-страницы.
Когда изображение перетаскивается с веб-страницы, видимо, оно находится в формате DragImageBits, который можно десериализовать для ввода ShDragImage. (См. Нижнюю часть вопроса, как я определил его)
Как преобразовать это в образ WPF?
Вот моя текущая попытка. (Если кто-то знает правильный способ сделать desirialization, я все уши)
private void UserControl_Drop(object sender, System.Windows.DragEventArgs e)
{
string[] formats = data.GetFormats();
// DragImageBits
if (formats.Contains("DragImageBits"))
{
MemoryStream imageStream = data.GetData("DragImageBits") as MemoryStream;
// Now I'm deserializing this, the only way I know how
imageStream.Seek(0, SeekOrigin.Begin);
BinaryReader br = new BinaryReader(imageStream);
ShDragImage shDragImage;
shDragImage.sizeDragImage.cx = br.ReadInt32();
shDragImage.sizeDragImage.cy = br.ReadInt32();
shDragImage.ptOffset.x = br.ReadInt32();
shDragImage.ptOffset.y = br.ReadInt32();
shDragImage.hbmpDragImage = new IntPtr(br.ReadInt32());
shDragImage.crColorKey = br.ReadInt32();
var systemDrawingBitmap = System.Drawing.Bitmap.FromHbitmap(shDragImage.hbmpDragImage);
В этот момент я получаю исключение типа System.Runtime.InteropServices.ExternalException
, при этом сообщение просто является Generic GDI+ error
.
Кто-нибудь знает, что я должен делать?
И вот определения вспомогательного класса. Я скопировал их из этой записи в блоге.
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct Win32Point
{
public int x;
public int y;
}
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct Win32Size
{
public int cx;
public int cy;
}
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct ShDragImage
{
public Win32Size sizeDragImage;
public Win32Point ptOffset;
public IntPtr hbmpDragImage;
public int crColorKey;
}