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