描述:
/////////////////////////////////////////////////////////////////////////////
// 功能: 将瀑布图导出到WORD中
// 参数:
// 返回: void
/////////////////////////////////////////////////////////////////////////////
void CIFClientFallChat3DCtrl::ExportToWord(LPDISPATCH pDoc, LPDISPATCH pSelection, const VARIANT FAR& valExportSet)
{
Word::SelectionPtr selection(pSelection);//?这些打了问号的,就是问这行代码是什么意思,没有打问号的是自己的理解也不知道对不对
Word::_DocumentPtr doc(pDoc);//?
CDC otherDC;
CBitmap otherBitmap;
CBitmap * poldBitmap;
selection->InsertAfter(_T("\n"));//这个是插入回车。是在什么后面(有after我猜应该是在什么后面插入)插入呢?
if (ReverseBitmap(m_pMemDC, m_pBitmap, &otherDC, &otherBitmap, &poldBitmap))//翻转位图
{
BOOL f = ::OpenClipboard(m_hWnd);
f = ::EmptyClipboard();
::SetClipboardData(CF_BITMAP, otherBitmap.m_hObject);
f = ::CloseClipboard();
long end = selection->End;//?
Word::RangePtr r(selection->Range);//?
r->Start = end;//?
r->End = end;//?
r->Paste();//?
otherDC.SelectObject(poldBitmap);//选入DC
otherDC.DeleteDC();//释放DC
otherBitmap.DeleteObject();//释放bitmap
selection->Start = r->End;//?
selection->End = r->End;//?
}
}
/////////////////////////////////////////////////////////////////////////////
// 功能: 翻转位图
// 参数: pSourceDC:源位图DC
// pSourceBitmap:源位图
// pDesDC:目标位图DC
// pDesBitmap:目标位图
// ppOldBitmap:原始位图
// 返回: true/false:成功/失败
/////////////////////////////////////////////////////////////////////////////
BOOL CIFClientFallChat3DCtrl::ReverseBitmap(CDC * pSourceDC, CBitmap * pSourceBitmap, CDC * pDesDC, CBitmap * pDesBitmap, CBitmap ** ppOldBitmap)
{
BITMAP bm;
pDesDC->CreateCompatibleDC(pSourceDC);
pSourceBitmap->GetBitmap(&bm);
pDesBitmap->CreateCompatibleBitmap(pSourceDC, bm.bmWidth, bm.bmHeight);//函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。
*ppOldBitmap = pDesDC->SelectObject(pDesBitmap);//把位图选入DC
pDesDC->FillSolidRect(0, 0, bm.bmWidth, bm.bmHeight, RGB(255, 255, 255));//Call this member function to fill the given rectangle with the specified
solid color。
return pDesDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, pSourceDC, 0, 0, SRCINVERT);//用异或显示位图。
}
解决方案1:
学习
word的com接口介绍,网上肯定有的,自己搜搜吧,呵呵。
解决方案3: void CIFClientFallChat3DCtrl::ExportToWord(LPDISPATCH pDoc, LPDISPATCH pSelection, const VARIANT FAR& valExportSet)
{
Word::SelectionPtr selection(pSelection);//?这些打了问号的,就是问这行代码是什么意思,没有打问号的是自己的理解也不知道对不对
Word::_DocumentPtr doc(pDoc);//? 这个应该是可以直接操作文档的对象指针,不过后面没用到,不用管了
CDC otherDC;
CBitmap otherBitmap;
CBitmap * poldBitmap;
selection->InsertAfter(_T("\n"));//? selection是当前选择的内容,默认应当是最前面,(0,0)。InsertAfter就是插入到当前选择的内容的后面。这里是在选择位置后直接插入一个换行符。
if (ReverseBitmap(m_pMemDC, m_pBitmap, &otherDC, &otherBitmap, &poldBitmap))//翻转位图
{
BOOL f = ::OpenClipboard(m_hWnd);
f = ::EmptyClipboard();
::SetClipboardData(CF_BITMAP, otherBitmap.m_hObject);
f = ::CloseClipboard();
long end = selection->End;//? 记下选择内容的末尾位置
Word::RangePtr r(selection->Range);//? 根据意思也能大概猜个差不多啊,初始化一个范围指针
r->Start = end;//? 把范围的开始位置指向选择内容的末尾位置
r->End = end;//? 把范围的末尾位置指向选择内容的末尾位置
r->Paste();//? 前面两句使得这个范围就指向了选择内容的末尾,然后粘贴,也就是在当前选择内容后面插入图片
otherDC.SelectObject(poldBitmap);//选入DC
otherDC.DeleteDC();//释放DC
otherBitmap.DeleteObject();//释放bitmap
selection->Start = r->End;//? 粘贴完后多了一个图片,那么选择内容的指针又要移动了,都移动到粘贴位置的末尾
selection->End = r->End;//? 同上
}
}
整体思想就是选择一个范围,然后把选择的内容替换掉,就等于插入。