ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 35873|回复: 14

to:守柔——“模版与加载项”

[复制链接]

TA的精华主题

TA的得分主题

发表于 2003-9-23 21:49 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
守柔你好: 下文我过去搜集的一篇关于用C语言制作Word“加载项”的文章。最后部分有关于加载项如何加载的方法。(虽是Word97环境下的但仍有参考价值。) 利用API接口,在Word中嵌入应用程序 作者:鲁 松 Microsoft Word以其强大的文字处理能力、灵活多变的排版方法、所见即所得以及友好的用户界面等特点,博得了广大用户的肯定。但是,若能将其他一些功能,如机器翻译、中文校对、全文检索、实时语音合成等嵌入其中,则可以扩展Word的功能,使开发者能够更加充分地利用Word资源,加快开发速度。   开发Word应用程序常用的有以下几种编程语言:Word Basic、VBA(Visual Basic for Applications)和Word API。  尽管Word Basic和VBA功能强大,但作为简单修改Word的工具,多少有些大材小用。笔者认为,Word API是开发Word应用程序的首选工具,尤其是可以利用C语言代码的快速、高效和灵活的特点,而且可以使用Word Basic接口函数和Windows动态连接库编程环境,实现对Word功能的添加。   Word API的使用方法   Word API生成的是一个可在Word中直接运行的Word加载项,它是一个以WLL为扩展文件名的单机动态连接库。这种WLL是标准的Windows动态连接库的特殊形式。可以用任何一个创建Windows DLL的环境来编译、链接和建立WLL。   Microsoft Word Developer's Kit(MS Word开发工具箱)中,提供了Word API的接口函数,下面分别加以介绍。   1. Word加载项的启动和卸载函数   (1) void FAR PASCAL wdAutoOpen(short DocID)   在Word中加载WLL的同时,Word会自动执行这个函数。在执行过程中,函数wdAutoOpen完成以下几个任务:   ·向Word登记WLL中定义的所有函数;   ·将WLL中的操作命令添加到Word的主菜单、快捷菜单和工具条中;   ·给WLL的操作命令指定快捷键;   ·完成WLL功能的初始化(如:机器翻译、中文校对的词库读入等)。   (2) void FAR PASCAL wdAutoRemove(void)   当WLL被卸载时,如果WLL程序中定义了wdAutoRemove(void)函数,Word将在卸载时执行这个函数。在该函数中,可以保存退出时我们定义功能函数生成的必要数据。   2. Word加载项中的登记函数   要想让Word中的某个主菜单项、快捷菜单项、工具条按钮或快捷键完成我们定义的某个函数,就必须在加载WLL时,先向Word登记我们的应用函数。Word API的接口函数CAPIRigister可以完成登记任务。该函数定义形式如下:   short CAPIRegister(short DocID, LPUCHAR lpszFunctionName, LPUCHAR lpszDescription); @@0541700.JPG;表1@@   3. 在Word中将加载函数添加到主菜单项、快捷菜单项、工具条按钮和快捷键中  在WLL中应用函数登记完成之后,就可以在主菜单、快捷菜单和工具条中添加自己的菜单项和快捷键。这些工作由下面的函数完AddButton、NewToolbar、ToolsCustomi zeMenu、ToolsCustomizeMenuBar和ToolsCustomizeKeyboard。   ·在Word工具条中添加一个按钮:   short CAPIAddButton (short DocID, LPSTR lpszToolbar, short cPosition, LP STR lpszMacro ,LPSTR lpszFace );     *S在Word中添加新的工具条:   short CAPIAddToolbar(short DocID,LPSTR lpszToolbar);   ·在主菜单中添加新的菜单项:   short CAPIAddMenu(short DocID,LPSTR lpszMenuName,short Position,short Me nuType);   ·在菜单项中添加新的菜单命令:   short CAPIAddMenuItem(short DocID, LPSTR lpszMenu, LPSTR lpszName ,LPSTR lpszMenuText,short Position, short MenuType);   ·定义一个新的快捷键:   short CAPIAddkey (short DocID, short keyCode, LPSTR lpszName)。   要想定义组合键的快捷键方式,就需把几个键在Word Basic中的代码数字的二进制进行按位‘或’运算,将结果传递给第二个参数KeyCode。例如:快捷键CTRL+S的KeyCode是(256 OR 83)=339。   4. Word API调用Word Basic函数前,函数参数和返回值的数据缓冲区的建立Word中的所有字处理功能都可由对应的Word Basic函数来实现。正是利用这一点,在 WLL中可以通过调用Word Basic函数来实现对Word的定制。因此,必须利用Word API函数InitWCB设立调用Word Basic函数时传递参数与返回值的数据缓冲区。   Void InitWCB (WCB far *lpwcb,short retType, LPSTR lpBuffer,short cBufferSize);   InitWCB的参数说明如下: @@0541701.JPG;表2@@   例如,下面这段程序是获取所选区域的字符串字体情况:   WCB wcb; //Word的参数和返回值传递的数据区   short isbold;   InitWCB(&wcb,TypeShort,NULL,0);   //设立传递Word Basic函数参数和返回值的数据区wcb   WORDFUNCTION(wdBold);   //调用Word Basic函数Bold()   isbold=wcb.wdoprReturn.Short;   //从数据区wcb中取出Word Basic函数Bold()的返回值   5. Word Basic函数调用方法   Word中的命令是与Word Basic函数一一对应的。因此,Word API可以通过接口函数用C语言直接调用Word Basic函数来实现Word命令。   注意:在Word API中调用Word Basic命令函数名时均须在Word Basic函数名前加上2个英文字母‘wd’,如:Word Basic函数Bold在Word API中的函数名应为wdBold。   根据这些函数有无返回值与是否为响应对话框的情况,在Word API头文件basedef.h定义了三种调用方法:WORDCALL、WORDFUCTION和WORDDIALOG。   ·若被调用的Word Basic函数无返回值,用Word API接口函数WORDCALL来调用,形式是:WORDCALL(函数名);   · 若被调用的Word Basic函数有返回值,用Word API接口函数WORDFUNCTION来调用,形式是:WORDFUNCTION(函数名);   ·若被调用的Word Basic函数是有关对话框操作,用Word API函数WORDDIALOG来调用,形式是:WORDDIALOG(函数名)。   例如:Word Basic中,给所选区域字符标粗体的函数Bold与判断所选区域字符是否为粗体的函数Bold()的调用方法就不同:   ·函数Bold是一个操作,无须返回值,所以调用形式是WORDCALL(wdBld)。   ·函数Bold()是一个判断,必须有返回值,所以调用形式是WORDFUNCTION(wdBold);   6. Word Basic函数参数的传递方法   在调用Word Basic带参函数时,需要通过Word API特定接口函数来传递参数。同时,对不同类型的函数,参数的传递方法也不同。   (1) 逐个传递参数   这种传递参数的方法适用于参数位置固定的函数,例如:Word Basic函数:   MenuText$(Type,MenuNumber[,Context])   其中的三个参数是按次序排列的。由于Word API调用Word Basic函数方式是函数名作为WORDCALL、WORDFUCTION和WORDDIALOG的参数,无法一次添加Word Basic函数参数,所以传递Word Basic函数参数时需要在InitWCB函数设置数据缓冲区后,依次通过数据缓冲区传递参数,第一个赋给Type,第二个赋给MenuNumber,如果有第三个参数则赋给Context。   在向这类函数传递参数时,根据待传递参数数据类型的不同,有以下4个函数可以选用   ·传递short型参数的函数:   void AddShortParam(WCB far *lpwcb, short ShortVal);   ·传递long型参数的函数:   void AddLongParam(WCB far *lpwcb, long LongVal);   *S 传递double型参数的函数:   void AddDoubleParam(WCB far *lpwcb, double DoubleVal);   ·传递字符串参数的函数:   void AddStringParam(WCB far *lpwcb, LPSTR lpStr);   下表是上面4个函数参数的说明: @@0541702.JPG;表3@@   例如,下面部分程序的作用是给所选区域字符串着绿色:   InitWCB(&wcb,TypeShort,NULL,0);   AddShortParam(&wcb,4);   //4是绿色在Word中的标识, 将一个short参数放//入参数缓冲区   WORDCALL(wdCharColor);   //调用Word Basic函数CharColor   (2) 传递指定参数   这种传递参数的方法适用于参数有标识名指明的函数。这种函数的参数有定义了的标识,传递时没有次序问题。例如:Word Basic中插入空表的函数TableInsertTable: Ta bleInserTable [.ConvertForm][,.NumberColumns][,.NumRows][,.InitialColWidth][ ,.Wizard][,.Format] [,.Apply] 因此,向TableInserTable函数传递参数时,只需指明哪一个标识即可。这种情况一般用于具有较多参数的函数。   在向这类函数传递参数时,与上面的类似,也是根据参数数据类型的不同,有以下4个函数可以选用:   ·void AddShortDlgField(WCB far *lpwcb,short ShortVal,short FieldId,shor t fMode);   ·void AddLongDlgField(WCB far *lpwcb,long LongVal,short FieldId,short f Mode);   ·void AddDoubleDlgField(WCB far *lpwcb,double DoubleVal,short FieldId,s hort fMode);   ·void AddStringDlgField(WCB far *lpwcb,LPSTR lpStr,short FieldId,shortf Mode,short cBufferSize);   下表是上面4个函数参数的说明: @@0541703.JPG;表4@@   其中,传给FieldId的所有标识名都已在WORD API文件wdfid.h中被定义了。   下面的例子是要在光标所在位置插入一个4*12的空表:   InitWCB(&wcb, TypeShort , NULL, 0);   AddStringDlgField(&wcb, "4",fidNumColumns, fMode, 0);   AddStringDlgField(&wcb, "12",fidNumRows, fMode, 0);   WORDCALL(wdTableInsertTable);   上面的fidNumColumns和fidNumRows是在Word API文件wdfid.h中定义的参数标识名。调用函数AddString DlgField,将表的行数"4"和列数"12"直接传给Word Basic的函数TableInsertTable的两个参数NumColumns和NumRows。   注意:在Word API文件wdfid.h中被定义了的函数参数的标识名是与Word Basic函数的参数标识名一一对应的,但不同的是,Word API的参数标识名是在WordBasic的参数标识名前加了‘fid’构成的。如:Word Basic的函数TableInsertTable有两个参数是NumColumns和NumRows,那么,在Word API中的参数标识名就应是fidNumColumns和fidNumRows。   创建WLL的程序框架   本文给出一个用Word API完成的完整WLL框架,来实现Word中的修改   在Word中加载或卸载WLL   经过编译、链接生成DLL文件(动态连接库文件)后,必须将文件的扩展文件名.dll改为.wll,以便在加载WLL时能被Word正确识别为Word加载项。   将自己编写的WLL加载到Word中有以下几种方法:   ·模板方式加载:在Word中主菜单‘文件’中找到‘模板’,进去后按下‘添加’按钮,选中自己编写的WLL模板文件(文件扩展名为wll)后‘确定’,加载WLL即可完成,如下图所示。   ·打开文件方式加载:像打开一般的Word文档一样,打开WLL模板文件,即可完成加载 。   ·Word自动完成加载:将WLL模板文件复制..\winWord\startup\目录下,像Word中的常用模板一样,在启动Word时,Word会自动将WLL模板文件加载到Word中。   卸载WLL的方法只有一种:在Word中主菜单‘文件’中找到‘模板’,将‘共用模板及加载项’框中‘translate.wll’前的复选钮钩掉后‘确定’,卸载WLL的工作即可完成。

TA的精华主题

TA的得分主题

发表于 2003-9-24 06:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢七兄在百忙之中给我释疑,虽然上文说的我不懂,但总有一天,会明白的。 此贴属精品,不可多得。 我已建议WINAK版主给予精华贴子。

TA的精华主题

TA的得分主题

发表于 2004-11-17 08:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

已多次阅读。

感觉一个,太复杂了,看不懂啊。

TA的精华主题

TA的得分主题

发表于 2004-11-17 22:30 | 显示全部楼层

办公之星,我跟你有同感,看不懂!

我想只有守柔这种痴人才能看明白。

TA的精华主题

TA的得分主题

发表于 2004-11-18 13:32 | 显示全部楼层
以下是引用如意在2004-11-17 22:30:00的发言:

办公之星,我跟你有同感,看不懂!

我想只有守柔这种痴人才能看明白。

不许说守柔是痴人,人家这是执着,呵呵

TA的精华主题

TA的得分主题

发表于 2004-11-18 22:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以下是引用cofe2000在2004-11-18 13:32:00的发言:

不许说守柔是痴人,人家这是执着,呵呵

为什么不许说,我说的是事实。他对WORD的研究已经达到痴迷的状态,而且“痴人”一词本就没有一点贬意,从某种角度来说,还带有褒意的。

TA的精华主题

TA的得分主题

发表于 2004-11-19 17:11 | 显示全部楼层
以下是引用如意在2004-11-18 22:51:00的发言:

“痴人”一词本就没有一点贬意,从某种角度来说,还带有褒意的。

呵呵,或许我缺少一些幽默感,反正我没看出来。

守柔是我们论坛的一位优秀版主,Excelhome 以能够请到他担任版主为荣,并向他深表谢意。

TA的精华主题

TA的得分主题

发表于 2006-8-14 14:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-8-14 17:10 | 显示全部楼层

开眼界之贴。

我定期拜读守大侠的《我眼中的Word》,感觉学无止境。

TA的精华主题

TA的得分主题

发表于 2003-9-25 11:20 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 10:45 , Processed in 0.046014 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表