C++如何使用InlineShapes::AddPicture的Range参数插入图片
C++ 调用 Word AddPicture 插入图片指定位置方案
核心参数说明
你当前使用的MFC COM包装类中,InlineShapes::AddPicture的第四个Range参数需要传入VT_DISPATCH类型的VARIANT变量,其值为合法Word Range对象的IDispatch接口指针。传入covOptional时默认将图片插入到文档开头/当前选中区域,只要构造出对应位置的Range对象封装传入即可自定义插入位置。
方案1:硬编码位置插入
直接调用Document对象的Range方法,通过字符偏移量构造指定位置的Range对象,字符偏移从0开始,跨段落连续计数。
_Document objDoc; COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); objDoc.AttachDispatch(m_disp); InlineShapes objInlineShapes(objDoc.GetInlineShapes()); // 示例1:插入到文档第10个字符位置,起止位置设为相同值不会替换原有文本 long insertPos = 10; Range insertRange = objDoc.Range(COleVariant(insertPos), COleVariant(insertPos)); // 示例2:插入到文档末尾 // long docEnd = objDoc.Content().GetEnd(); // Range insertRange = objDoc.Range(COleVariant(docEnd), COleVariant(docEnd)); COleVariant varRange(insertRange.m_lpDispatch); COleVariant varLink((short)FALSE); // 不链接到本地文件 COleVariant varSave((short)TRUE); // 图片嵌入文档保存 objInlineShapes.AddPicture(_T("C:\\QR.png"), &varLink, &varSave, &varRange); // 用完释放COM接口 insertRange.ReleaseDispatch(); objInlineShapes.ReleaseDispatch(); objDoc.ReleaseDispatch();
方案2:锚定字符串位置插入
预先在文档中放置锚点字符串(如%pngLocation%),通过Find接口查找锚点位置,直接获取匹配结果对应的Range对象传入即可,插入图片时会自动替换掉锚点文本。
_Document objDoc; COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); objDoc.AttachDispatch(m_disp); InlineShapes objInlineShapes(objDoc.GetInlineShapes()); Range contentRange = objDoc.Content(); Find findTool = contentRange.GetFind(); findTool.ClearFormatting(); findTool.SetText(_T("%pngLocation%")); // 执行查找,向前遍历全文档 COleVariant varForward((short)TRUE); bool found = findTool.Execute( covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, varForward, covOptional, covOptional, covOptional, covOptional ); if (found) { COleVariant varRange(contentRange.m_lpDispatch); COleVariant varLink((short)FALSE); COleVariant varSave((short)TRUE); objInlineShapes.AddPicture(_T("C:\\QR.png"), &varLink, &varSave, &varRange); } // 释放所有COM接口 findTool.ReleaseDispatch(); contentRange.ReleaseDispatch(); objInlineShapes.ReleaseDispatch(); objDoc.ReleaseDispatch();
注意事项
- 所有COM包装类对象使用完必须调用
ReleaseDispatch()释放接口,避免引用计数泄漏 - 封装Range为COleVariant时不需要手动管理IDispatch的引用计数,MFC类会自动处理
- 如果需要保留锚点字符串,查找成功后将Range的起始位置设为锚点的结束位置即可:
contentRange.SetStart(contentRange.GetEnd());
内容的提问来源于stack exchange,提问作者mxke42
相关产品推荐
相关产品推荐

