描述:
下面程序的作用是:向当前word文档按给定屏幕坐标插入一副图片,但是插入位置老是不对,怎么改?
bool CLabelBkGrd::PasteToDoc()
{
// TODO: Add extra validation here
//初始化COM
HRESULT hr;
hr=CoInitialize(NULL);
// if (CoInitialize(NULL)!=0)
// {
// AfxMessageBox("初始化COM支持库失败!");
// exit(1);
// }
//*
ASSERT(!FAILED(hr));
IUnknown *pUnk;
CLSID clsid;
CLSIDFromProgID(L"Word.Application", &clsid);
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
ASSERT(!FAILED(hr));
// Get IDispatch
IDispatch *pDisp;
hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
ASSERT(!FAILED(hr));
_Application WordApp(pDisp);
// . . . Use the IDispatch pointer for automation . . .
// _Application WordApp; //代表WORD程序
Documents docs; //代表一个WORD程序里的所有文档
_Document doc; //代表一个文档
Shapes shs;
Shape shp;
docs=WordApp.GetDocuments();
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
//用docs来打开一个文档,并将句柄返回给doc
doc=WordApp.GetActiveDocument();
doc.Activate();
Paragraph paragraph;//用来表示文档中某一段
Paragraphs paragraphs;//用来表示文档中所有段
paragraphs=doc.GetParagraphs();
paragraph=paragraphs.GetFirst();//得到第一段
Range r=paragraph.GetRange();
Window window;
window=WordApp.GetActiveWindow();
Range AddPictureRang;
long lScreenPointLeft,lScreenPointTop,lScreenPointRight,lScreenPointBottom;
//从一文件获得插入图片的屏幕坐标
GetPasteScreenPoint(&lScreenPointLeft,&lScreenPointTop,&lScreenPointRight,&lScreenPointBottom);
CString s1;
s1.Format("lScreenPointLeft=%d,lScreenPointTop=%d",lScreenPointLeft,lScreenPointTop);
MessageBox(s1,NULL,0);
//根据给定的屏幕坐标找到一个range对象
AddPictureRang=window.RangeFromPoint(lScreenPointLeft,lScreenPointTop);
if (AddPictureRang.m_lpDispatch==NULL)
MessageBox("",NULL,0);
long ScreenPixelsLeft,ScreenPixelsTop,ScreenPixelsWidth,ScreenPixelsHeight;
//获得找到range对象的左上点,以及宽高
window.GetPoint(&ScreenPixelsLeft,&ScreenPixelsTop,&ScreenPixelsWidth,&ScreenPixelsHeight,AddPictureRang);
CString s;
s.Format("ScreenPixelsLeft=%d,ScreenPixelsTop=%d,ScreenPixelsWidth=%d,ScreenPixelsHeight=%d",ScreenPixelsLeft,ScreenPixelsTop,ScreenPixelsWidth,ScreenPixelsHeight);
MessageBox(s,NULL,0);
s1.Format("left=%d,top=%d",lScreenPointLeft-ScreenPixelsLeft,lScreenPointTop-ScreenPixelsTop);
MessageBox(s1,NULL,0);
if(AddPictureRang.m_lpDispatch==0)
MessageBox("",NULL,0);
long wvs,whs;
PageSetup pagesetup;
pagesetup=doc.GetPageSetup();
VARIANT varLeft;
VARIANT varTop;
VARIANT varWidth;
VARIANT varHeight;
VARIANT varRange;
varLeft.vt=VT_I4;
//计算屏幕坐标与插入图片所在range的左上点的相对位置
//计算图片相对range的左边位置
varLeft.lVal=lScreenPointLeft-ScreenPixelsLeft;//0;//
varTop.vt=VT_I4;
//计算图片相对range的上边位置
varTop.lVal=lScreenPointTop-ScreenPixelsTop;//0;//
varWidth.vt=VT_I4;
//计算插入图片的宽度
varWidth.lVal=lScreenPointRight-lScreenPointLeft;//0;//
varHeight.vt=VT_I4;
//计算插入图片的高度
varHeight.lVal=lScreenPointBottom-lScreenPointTop;//0;//
varRange.vt=VT_DISPATCH;
varRange.pdispVal=AddPictureRang;
shs=doc.GetShapes();
// shs.AddPicture("c:\\a.bmp",covOptional,covOptional,&varLeft,&varTop,covOptional,covOptional,&varRange);
shs.AddPicture("c:\\a.bmp",covOptional,covOptional,&varLeft,&varTop,&varWidth,&varHeight,&varRange);
//选中添加的图片
VARIANT var;
var.vt=VT_I4;
var.lVal=shs.GetCount();
shp=shs.Item(&var);
shp.Select(&var);
//把选中图片的格式设置为浮动在文字上面
Selection selection=WordApp.GetSelection();
ShapeRange shaperange=selection.GetShapeRange();
WrapFormat wrapformat=shaperange.GetWrapFormat();
wrapformat.SetType(3);
//下面弹出对话框让我迷惑,添加图片的左上角坐标与我添加时的设置不一样
float l=shp.GetLeft();
float t=shp.GetTop();
s1.Format("Left=%f,Top=%f",l,t);
MessageBox(s1,NULL,0);
pUnk->Release();
CoUninitialize();
return true;
}