C# 如何拖动&;是否使用PowerPoint(2010或2013)加载项删除多个形状?

C# 如何拖动&;是否使用PowerPoint(2010或2013)加载项删除多个形状?,c#,powerpoint,office-interop,office-addins,C#,Powerpoint,Office Interop,Office Addins,我想实现一个带有自定义任务窗格的PowerPoint插件,用户可以从中将复杂对象拖到幻灯片上(这些对象将由多个形状组成,例如圆形中的两个三角形或类似形状) 通过在用户控件中调用DoDragDrop,并将所需文本作为方法的第一个参数传递,我成功地将简单文本框拖放到幻灯片上。但是,我不知道是否有可能传递一个更为copmlex的对象,比如多个形状,作为DoDragDrop方法的数据参数 我尝试的另一种方法是使用空字符串调用DoDragDrop(这样就不会将任何内容放到幻灯片上),在DoDragDrop

我想实现一个带有自定义任务窗格的PowerPoint插件,用户可以从中将复杂对象拖到幻灯片上(这些对象将由多个形状组成,例如圆形中的两个三角形或类似形状)

通过在用户控件中调用
DoDragDrop
,并将所需文本作为方法的第一个参数传递,我成功地将简单文本框拖放到幻灯片上。但是,我不知道是否有可能传递一个更为copmlex的对象,比如多个形状,作为
DoDragDrop
方法的数据参数

我尝试的另一种方法是使用空字符串调用
DoDragDrop
(这样就不会将任何内容放到幻灯片上),在
DoDragDrop
返回后,我可以使用
Globals.ThisAddIn.Application.ActiveWindow.View.slide.AddShape
方法向幻灯片添加形状,但是,我找不到一种方法来获取鼠标指针的当前位置

那么,是否有可能调用DoDragDrop并向其传递多个形状,或者在DoDragDrop返回后获取光标位置

更新:我为PowerPoint 2013找到了一个解决方案,可以通过新的
AfterDragDropOnSlide
事件来完成(但这不是小事,详细信息如下:)


因此,问题是,在PowerPoint 2010中也可能出现同样的情况吗?

在使用
字符串调用
DoDragDrop
后。如果第一个参数为空,则可以获取当前光标坐标。
获取坐标需要一些Win32样板文件:

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public POINT(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}

class Win32API
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out POINT lpPoint);
}

private POINT GetCursorPosition()
{
    POINT point = new POINT();

    Win32API.GetCursorPos(out point);

    Win32API.ScreenToClient(new IntPtr(Globals.ThisAddIn.Application.ActiveWindow.HWND), ref point);

    return point;
}
然后必须将这些坐标转换为幻灯片的坐标系(幻灯片在点上的大小与在屏幕上以像素显示的大小不同)

执行拖放操作的代码:

DoDragDrop(String.Empty, DragDropEffects.Copy);

var point = GetCursorPosition();
var convertedPoint = this.ConvertScreenPointToSlideCoordinates(point);

// Insert something at the cursor's location:
var slide = Globals.ThisAddIn.Application.ActiveWindow.View.Slide;
slide.Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeCloud, convertedPoint.X, convertedPoint.Y, 100, 100);

但在第二张幻灯片中拖动项目时,它不起作用。
DoDragDrop(String.Empty, DragDropEffects.Copy);

var point = GetCursorPosition();
var convertedPoint = this.ConvertScreenPointToSlideCoordinates(point);

// Insert something at the cursor's location:
var slide = Globals.ThisAddIn.Application.ActiveWindow.View.Slide;
slide.Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeCloud, convertedPoint.X, convertedPoint.Y, 100, 100);