插入对象的问题

Allen 2004-06-23 03:57:14
Set myDocument = Worksheets(1)
myDocument.Shapes.AddOLEObject Left:=100, Top:=100, _
Width:=100, Height:=200, _
ClassType:="Forms.CommandButton.1"

关于以上的一段代码,ClassType是不是得取特殊的值,这个要在什么地方查呢?
...全文
392 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Allen 2004-07-06
  • 打赏
  • 举报
回复
就算上面的问题不是问题,OLEFormat.GetObject的返回类型是一个LPDISPATCH,而我的控件却不是这个类型,如果我采用‘form a type library’的方式‘Add Class’,那么我的ActiveX产生的类(好象是它的接口产生的)继承于CWnd,不是COleDispatchDriver,我想不可能把LPDISPATCH赋值给它吧;如果我用#import的方式,好象继承于一个IUnKnown东西,但还没有到这步之前,我就遇到上面的问题,还没有解决呢!
Allen 2004-07-06
  • 打赏
  • 举报
回复
谢谢jiangsheng,我刚刚看到有OLEFormat这个类,这个指针用MSWord::OLEFormatPtr声明一个就可以了,但我却没办法用Shape的GetOLEFormat函数,因为我不是采用‘form a type library’的方式‘Add Class’的,而是用#import "E:\\Program Files\\Microsoft Office\\Office10\\msword.olb" rename("ExitWindows", "MyExitWindows"), named_guids, rename_namespace("MSWord")的方式,通过MSWord::ShapePtr spShap声明的Shape的指针没有找到GetOLEFormat或类似的函数,请问现在这个情况我要如何获得OLEFormat呢?
蒋晟 2004-07-06
  • 打赏
  • 举报
回复
返回一个IDispatch指针,可以用于自动化。一般将其辅值给自动化客户端类。
//Add a Graph8 object to the slide.
shape = shapes.AddOLEObject(
(float)150, //Left
(float)150, //Top
(float)480, //Width
(float)320, //Height
"MSGraph.Chart", //Classname
"", //FileName
(long)0, //DisplayAsIcon
"", //IconFileName
(long)0, //IconIndex
"", //IconLabel
(long)0 //Link
);

//Modify the charttype of the graph.
Chart chart;
OLEFormat olefmt = shape.GetOLEFormat();
chart = olefmt.GetObject();
chart.SetChartType((long)70);

把你要持久性保存的数据声明为属性。COleControl类的持久性支持函数如下
Persistence
ExchangeExtent Serializes the control’s width and height.
ExchangeStockProps Serializes the control’s stock properties.
ExchangeVersion Serializes the control’s version number.
IsConvertingVBX Allows specialized loading of an OLE control.
SerializeExtent Serializes or initializes the display space for the control.
SerializeStockProps Serializes or initializes the COleControl stock properties.
SerializeVersion Serializes or initializes the control's version information.
SetModifiedFlag Changes the modified state of a control.
WillAmbientsBeValidDuringLoad Determines whether ambient properties will be available the next time the control is loaded.
Allen 2004-07-06
  • 打赏
  • 举报
回复
Shape对象的OLEFormat属性,你说的我明白,不过这个是VB里的方式,这个在VC里通过Shape的GetOLEFormat方式可以获得,但Object属性是怎么获得的?或者说,要把GetOLEFormat的返回值指向一个什么样的对象的指针?
techgopher 2004-07-06
  • 打赏
  • 举报
回复
前面两个问题建议你到VC/MFC版的ATL/ActiveX/COM区去问。我想可以通过implement一些标准的COM Interface解决。

你最后一个问题:虽然我没有用VC作COM开发的经验,从原理上看,我认为你从一个Shape指针直接获取你的ActiveX对象指针是不对的。你要作的是通过Shape对象的OLEFormat属性的Object属性获取该指针。
Allen 2004-07-05
  • 打赏
  • 举报
回复
techgopher帮我解决了一些的问题,我是用VC写的程序,使用Shapes::AddOLEObject来在word中添加自己的ActiveX控件的。今早刚刚试过,ActiveX添加一个对外的接口看上去还是蛮方便的。至于在我自己的程序中引用这个接口函数,和我想的一样,直接引用ocx文件就可以自动产生它们的头文件(还有.cpp的文件),也许可以不用头文件声明的形式而使用#import也可以,不过我还没有试过。
除了上面的问题以外(看上去都已经解决了),还有一个关于ActiveX的问题,我的ActiveX在word里好土的,看上去像一个文件的图标,怎么可以让它显示为一张已有的jpg图片或其他格式的图片呢。
还有,如果我在这个对象上点右键选择这个对象的名字再编辑它,会出现一个很土的窗口,标题栏上除了标题就剩下关闭按钮了,下面的窗口有一个白底黑色的椭圆。窗口也不能调整大小。要怎么做才可以改善这样的情况呢,或者要看什么资料呢?
最后一个问题是关于ActiveX对象的永久保存的问题,ActiveX的对象是和word文档保存在一起的,打开word首次点击这个对象时,就会加载对象的内容,但改变对象的大小后,word文档的关闭也没有引起对象的保存动作,到是添加这个对象后立刻有保存的动作,我想,如果要引起保存动作的话,一定要修改对象的内容,这个方面是不是也和上一个问题有关,编辑后出来的窗口什么事也不能做!这个要怎么做呢!
Allen 2004-07-05
  • 打赏
  • 举报
回复
现在有一个问题,我的ActiveX已经有一个接口。但我不知道怎么才能使用这个接口。
我的这个ActiveX对象在word文档中,我已经通过Shapes.Item的方式获得了这个对象的指针,问题是这个对象的指针是Shape的(MSWord::ShapePtr),如果把这个指针直接赋值给我的ActiveX的指针,结果总是得到0,奇怪,Shape的指针可不是0。
我的ActiveX的指针是这样的得到的:首先#import "D:\\PCase\\!garbage\\A\\Debug\\A.ocx" rename_namespace ("MyACtrl")
using namespace MyACtrl;
然后在需要的地方先声明MyACtrl::_DAPtr spA;
最后通过spShap/*spA*/ = spShapes->Item(&vItem);spA = spShap;
其中spShap是MSWord::ShapePtr类型,spShapes是CComQIPtr< MSWord::Shapes >类型,结果是shShap是有值的,而且有效,赋值给spA后,spA总是0,我都要疯了。是不是不能这么用,那我要怎么才能调用spA->DoSomething()的这个公共的接口呢?
Allen 2004-07-04
  • 打赏
  • 举报
回复
现在我可以通过程序(比如叫做Myprog吧,word运行的时候多出一个工具条,上面有几个按钮,按钮点击的时候会执行Myprog中的程序,其中有一个按钮就是往word添加一个对象)往word里加入了一个ACTIVEX对象(这个对象是我自己用VC产生的,未做任何额外的处理),我想,如果我要在Myprog处理这个对象(比如,点击了我用Myprog在word增加的另一些按钮,可以从这个ActiveX对象中读出一些东西,或者把一些信息写入到这个对象中),是不是要给ActiveX对象增加一些接口,然后我在编写Myprog的时候引用它们(就像我引用word和office的接口一样)??如果情况是这样的话,怎么在ActiveX中增加接口,又怎么引用它们(直接引用ocx的程序吗?)?
Allen 2004-07-04
  • 打赏
  • 举报
回复
呵呵,你说的是,上个回复刚刚写完,我就在注册表里找到地方了,呵呵
谢谢你提到ProgID,不然我会迟点找到了
techgopher 2004-07-04
  • 打赏
  • 举报
回复
不需要为此增加额外的接口。应该就像其他COM类库一样可以直接使用你的Activex的公开接口,如果你的ActiveX写的正确的话。

以下例子假设一个类为MyCompany.MyActiveX的ActiveX对象在Word中被选中,DoSomething是 该对象的一个公开接口:
Dim obj as MyCompany.MyActiveX
set obj = Selection.ShapeRange(1).OLEFormat.Object
obj.DoSomething

如果你的ActiveX是以嵌入式图片框插入的,用Selection.InlineShapes(1).OLEFormat.Object来取得该对象。
techgopher 2004-07-03
  • 打赏
  • 举报
回复
你自己作一下比我给例子快多了.
Allen 2004-07-02
  • 打赏
  • 举报
回复
能给一个具体例子吗?宏或者注册表的?
techgopher 2004-06-24
  • 打赏
  • 举报
回复
ClassType必须是该COM类的ProgID. 这个一般来说录制一段宏就可以获得。如果不行的话,可以到注册表HKEY_CLASSES_ROOT下面找,一般的形式是: companyname.classname.revisionnumber

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧