我现在想要实现图形的剪切、粘贴,在剪切中我是这样实现的:
CDrawObject * drawObject;for (int i = 0; i < m_nGraphSelectNum; i++)
{
     drawObject = GetGraph(GraphSelect[i].Index);   
     m_DrawObjectCopyArray.Add(drawObject);
}
GetGraph是得到m_DrawObjectArray.GetAt(Index)中的CDrawObject,我把界面上选中的所有图形都一个个加到一个拷贝Array中;在粘贴中我是这样做的:
for (int i = 0; i < (pDoc->m_DrawObjectCopyArray.GetUpperBound() + 1); i++)
{
    pDrawObject = pDoc->m_DrawObjectCopyArray.GetAt(i);//从拷贝Array中取CDrawObject对象    nId_Only = pDoc->GetGraphID();     //得到新ID号
    pDrawObject->m_nIdOnly = nId_Only; //更改ID号
    pDoc->m_DrawObjectArray.Add(pDrawObject);//加入所有图形的链表中
    GraphUndo[0].Index = pDoc->GetGraphUpperBound();//撤消用
    GraphUndo[0].lb = 1;
    pDoc->AddUndoList(2, 1, GraphUndo);
    pDoc->AddSelectList(1, GraphUndo[0].Index, nId_Only);//把序号和ID号加入选中列表中
}
//以下为特殊显示当前粘贴的图形
for (i = 0; i < pDoc->m_nGraphSelectNum; i++)
{
    pDoc->GetGraph(pDoc->GraphSelect[i].Index)->Move(20, 20);//在原来的坐标上偏移20个单位
    pDoc->DrawGraph(&dc, pDoc->GraphSelect[i].Index, 0, 1, m_BackColor, blc);//特殊显示
}但是运行的结果是没有粘贴出线条,而且也没有什么异常,我调试了一下,m_DrawObjectArray中的数量在增多,说明已经添加了相关的数据,但是为什么界面上只显示原来剩下的几条线,而没有新粘贴的内容?????

解决方案 »

  1.   

    [email protected]
    发过来,改后给你
      

  2.   

    pDoc->m_nGraphSelectNum是否增加了?
      

  3.   

    pDoc->m_nGraphSelectNum增加的
      

  4.   

    调试中我又发现不显示的原因是类中有个属性是b_Delete,现在它表示为TRUE,所以没有显示;但是我不太明白的是,我从drawObject = GetGraph(GraphSelect[i].Index);   得到的难道只是一个指针而已吗???如果只是一个指针那么不显示的理由也正常了,因为有剪切的操作中我是先把所有选中的图形都用m_DrawObjectCopyArray.Add(drawObject);加入一个Array中,操作完后我把原先的所有选中的图形中的b_Delete置TRUE,刷新界面后这些图形就被隐掉了
      

  5.   

    原因是你拷贝的是指针,指向同一个地址,所以b_Delete同时改变了!
    正确的做法应该是在拷贝的时候,重新开辟空间,存放拷贝的内容,然后删除原来选中图形的时候,就不会影响被拷贝出来的图形!
      

  6.   

    如下改就可以了,但是要拷贝粘贴完善,你要改的代码还比较多!希望你可以自己先好好规划一下
    void CDRAWDoc::EditCopy()
    {
    CDrawObject * drawObject; for (int i = 0; i < m_nGraphSelectNum; i++)
    {
    //drawObject = GetGraph(GraphSelect[i].Index));   
                      drawObject = GetGraph(GraphSelect[i].Index)->Clone();   
    m_DrawObjectCopyArray.Add(drawObject);
    }
    }