为什么我不能在程序的两个实例之间拖动点

本文关键字:两个 实例 之间 拖动 不能 程序 为什么 | 更新日期: 2023-09-27 18:36:58

我有一个DoDragDrop,我将数据设置为Point,当我在一个实例中拖动时 - 一切都很好。但是当我在程序的两个实例之间拖动时,Visual Studio会给我这个错误:

指定的记录不能映射到托管值类。

为什么?

编辑:这是代码:

DataObject d = new DataObject();
d.SetData("ThePoint", MyPoint);
DragDropEffects e = DoDragDrop(d, DragDropEffects.Move);

和:

Point e2 = (Point)e.Data.GetData("ThePoint");

为什么我不能在程序的两个实例之间拖动点

无法映射指定的记录

请注意"记录"一词的奇怪之处。 这是一个以COM为中心的"结构"词。 你试图做的事情几乎有效,但不完全有效。 DoDragDrop() 方法正确地将 Point 结构封送到 COM 对象,这可能是因为 Point 具有 [ComVisible(true)] 属性。 缺少的成分是IRecordInfo所需的信息,IRecordInfo是一个描述结构布局的COM接口。 必需,因为结构具有非常依赖于编译器的布局。

此接口通常通过从类型库中读取结构定义来实现。 事实上,点结构在 c:''windows''microsoft.net''framework''v2.0.50727''system.drawing.tlb 中描述。 您可以使用 OleView.exe 工具"File + View Typelib"查看它。

一切都很好,除了 COM 对象的接收方必须将其转换回托管对象(点)的部分。 这需要找出哪个类型库包含对象定义,以便 IRecordInfo 可以完成它的工作。 它记录在注册表中,HKCR''记录密钥。 它不包含点的条目。 卡布姆。

创建你自己的类(不是结构)来存储数据,为其提供 [Serializable] 属性,以便可以简单地封送数据。

这看起来像一个黑客,但你可以这样做,我测试了它的工作原理。编辑 猜猜它没有回答为什么?问题。

private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        Point MyPoint = new Point(100, 200);
        DoDragDrop(new string[] { MyPoint.X.ToString(), MyPoint.Y.ToString() }, DragDropEffects.Copy);
    }
    private void Form1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
    }
    private void Form1_DragDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(typeof(string[])))
        {
            string[] item = (string[])e.Data.GetData(typeof(string[]));
            Point e2 = new Point(Int32.Parse(item[0]), Int32.Parse(item[1]));
            MessageBox.Show(e2.X+":"+e2.Y);
        }
    }