none
拖动复制数据的时候经过剪切板么 RRS feed

  • 问题

  • 使用复制粘贴命令复制数据的时候数据会被放入剪切板中。而且复制完后数据仍然存在于剪切板中,

    但是使用Ctrl+左键拖动复制的方法复制数据后,剪切板中没有数据副本。

    我的问题是这种情况下数据经过了剪切板吗?

    没有的话数据是通过什么途径复制的呢?


    foch

    2012年3月31日 7:12

答案

  • 你好。虽然看不懂这段代码,但是还是很感谢。

    我记得在C#中从拖动事件中获取数据确实是可以直接从参数里面提取出来。

    可是事实上当我打开系统剪切板,

    并在Excel中拖动复制单元格的内容时,有时候会把数据复制到剪切板中,并且此时会提示无法情况剪切板的信息。

    有的时候却又不会。我不是很确定。

    但是不管怎么样,拖动复制或移动操作都会清空系统剪切板中现有的数据。

    所以我怀疑是不是数据会被复制到剪切板,并在移动操作结束后又被清空。


    foch

    2012年4月6日 9:06

全部回复

  • 剪切板是整个操作系统的工具,office中的剪切板与系统的一致。只是拖动单元格只是单元格的移动,并非复制,因此不经过剪切板。

    官方对于移动和复制的帮助可以参考:http://office.microsoft.com/zh-cn/excel-help/HP001216413.aspx?CTT=1


    佛是过来人,人是未来佛。

    2012年4月3日 18:04
    版主
  • 你好。那请问按住Ctrl键拖动数据进行复制呢?也不经过剪切板吗?

    foch

    2012年4月4日 9:25
  • Hi foch,

    拖动复制是不经过剪贴板的。

    MFC当中实现OLE拖放需要使用两个类:COleDropSourceCOleDropTarget,第一个类实现了拖放数据的提供,第二个类实现了拖放数据的获取。在现实的使用过程当中我们并不直接使用COleDropSource类来提供数据,作为替代我们使用COleDataSource来提供数据。COleDataSource类的DoDragDrop成员函数将会创建COleDropSource类对象并且调用其中的成员函数来提供数据。与OLE剪贴板的提供数据不同,在OLE拖放当中被其他函数或者类调用的对象不再是COleDataSource而是COleDropSource,因此COleDataSource不再需要在堆上创建而只需要在栈上创建即可。提供数据的一个简单例程如下:

    char szText[] = "Hello world";

    HANDLE handle = ::GlobalAlloc(GHND,lstrlen(szText) + 1);

    char *phandle = ::GlobalLock(handle);

    lstrcpy(phandle,szText);

    ::GlobalUnlock(handle);

    COleDataSource ods;

    ods.CatchDataGlobal(handle);

    DROPEFFECT de = ods.DoDragDorp(DROPEFFECT_MOVE | DROPEFFECT_COPY); //允许拖放移动和复制两种选项

    if (de == DROPEFFECT_COPY)

    //向文档类当中加入新项

    else

    //改变文档类当中被拖动项的数据

    在允许OLE拖动的目标程序的视图类当中我们需要加入一个COleDropTarget保护型数据对象,在OnCreate成员函数当中我们需要加入对COleDropTarget::Register成员函数的调用。然后我们需要处理OnDropEnter,OnDropOver,OnDrop三个成员函数的覆盖。这三个成员函数分别对应拖动对象进入窗口,拖动对象在窗口当中移动,拖动对象在窗口中被放下。对这三个成员函数的覆盖的例子如下:

    DROPEFFECT CCheckedView::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
    {
    CScrollView::OnDragEnter(pDataObject, dwKeyState, point);
    if (!pDataObject->IsDataAvailable(CF_TEXT))
    return FALSE;
    return ((dwKeyState & MK_CONTROL) ? DROPEFFECT_COPY : DROPEFFECT_MOVE);
    }

    DROPEFFECT CCheckedView::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
    {
    CScrollView::OnDragOver(pDataObject, dwKeyState, point);
    if (!pDataObject->IsDataAvailable(CF_TEXT))
    return FALSE;
    return ((dwKeyState & MK_CONTROL) ? DROPEFFECT_COPY : DROPEFFECT_MOVE);
    }

    BOOL CCheckedView::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
    {
    CScrollView::OnDrop(pDataObject, dropEffect, point);
    if (pDataObject->IsDataAvailable(CF_TEXT))
    {
    //
    读取数据加入到文档中并且刷新视图
    return TRUE;
    }
    return FALSE;
    }


    Jaynet Zhang

    TechNet Community Support

    2012年4月6日 2:34
    版主
  • 你好。虽然看不懂这段代码,但是还是很感谢。

    我记得在C#中从拖动事件中获取数据确实是可以直接从参数里面提取出来。

    可是事实上当我打开系统剪切板,

    并在Excel中拖动复制单元格的内容时,有时候会把数据复制到剪切板中,并且此时会提示无法情况剪切板的信息。

    有的时候却又不会。我不是很确定。

    但是不管怎么样,拖动复制或移动操作都会清空系统剪切板中现有的数据。

    所以我怀疑是不是数据会被复制到剪切板,并在移动操作结束后又被清空。


    foch

    2012年4月6日 9:06
  • foth 您好,

    您的猜测是正确的。

    拖动复制和移动操作都是通过剪贴板操作的。

    所不同的是,在Office 2003及更早的版本中,在复制和移动操作完成后,剪贴板中的数据不会被清空,而继续保留。

    在Office 2007 以及2010 的版本中,在复制和移动的操作完成后,Office会尝试清空剪贴板中的数据。

    对于您所说的有时无法清空剪贴板的情况,可能是由于受到其它正在运行的服务或者程序的影响所造成的。 比如一些IE的插件。


    Max Meng

    TechNet Community Support

    2012年4月7日 8:20
    版主
  • Max Meng 您好

    谢谢您的回复。Office2007之后更改清空剪切板这一操作的意图何在呢?或者说是基于什么样的考虑呢?


    foch

    2012年4月8日 1:39
  • 这些历史这些技术我需要了解,谢谢。

    佛是过来人,人是未来佛。

    2012年4月10日 13:51
    版主