Я хочу, чтобы мое WPF-приложение было объектом падения, и я хочу иметь возможность перетаскивать изображение с любой веб-страницы.
Когда изображение перетаскивается с веб-страницы, очевидно, оно находится в формате "DragImageBits", который может быть десериализован до типа ShDragImage. (См. внизу вопроса, как я его определил)
Как мне преобразовать его в изображение WPF?
Вот моя текущая попытка. (Если кто знает правильный способ десириализации, я весь внимание)
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;
}