




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习本教材需要安装VC+6.0以上版本编程环境。易语言支持库编写方法目 录第一课 支持库框架文档分析2一、从LIB_INFO开始2二、属性4三、事件5四、对外接口5五、所属命令6第二课 我的第一个支持库8一准备工作8二最简单的支持库8三今天的收获11第三课 充实与完善12一常量12二自定义数据类型13三全局命令15四总结17第四课 窗口单元初步18一窗口单元的实质18二数据类型19三CMyHotKey20四一些小问题22第五课 窗口单元终结篇22一位置和大小23二边框24三取出热键框的内容25四关于事件25此文章版权归袁晓辉所有,如需转载请注明:作者姓名:袁晓辉出处:第一课 支持库框架文档分析易语言的一个非常显著的特点就是其支持库可以随意增减(当然系统核心支持库除外),这不仅为易语言开发团队升级软件提供了极大的方便,也使得易语言具有了理论上无限的扩展性。同时也给那些有能力且愿意为易语言的发展添砖加瓦的易友们提供了一个广阔的施展空间。易语言支持库的编写其实并不难,只要有一定的VC+编程基础,再下一点功夫任何人都可以写的!下面是我学习编写支持库的一些心得体会,现在拿出来和大家分享。一、从LIB_INFO开始学习写易语言的支持库,最好的参考资料就是易语言作者提供的“超文本浏览框”支持库的源代码(到易语言网站下载)。那么我们首先大体浏览一下这个源代码,对支持库编写的大体框架有个了解。打开“超文本浏览框”支持库的源代码,我们发现它实际上就是一个VC+编写的静态链接了MFC的Dll工程,从CwinApp继承来的ChtmlViewApp类就是这个Dll的主类,HtmlView.def文件提供了该Dll的对外接口GetNewInf()函数。我们就从这个函数开始研究,在FileView中打开HtmlView.def文件,把光标放到该函数名内部,按F12(或在Browse工具条上点“Go to Definition”)找到它的定义,在HtmlView.cpp文件中。但我们发现这个函数并没有做太多的事情,只是简单地返回了一个static 变量s_LibInfo的指针。其实就是这个LIB_INFO类型的结构变量包含了该支持库的一切对外(这里的外实际上就是易语言的编程环境和易语言程序)信息。用同样的方法我们找到s_LibInfo的定义:/ 库定义开始static LIB_INFO s_LibInfo =/*Lib Format Ver*/LIB_FORMAT_VER,/ 保留未用。/ 本支持库的GUID串:/ guid: 5014D8FA-6DCA-40b6-8FA6-26D8183666EB#defineLI_LIB_GUID_STR5014D8FA6DCA40b68FA626D8183666EB/*guid str*/_T (LI_LIB_GUID_STR),/*m_nMajorVersion*/1,/*m_nMinorVersion*/1,这是一个看似非常复杂的结构体,但实际上对我们有用的信息却不是很多,所以不用担心。可以看得出,前半部分只是一些支持库名称,支持语言,作者信息等说明性的文字,只到这里才有真正有用的信息:/*m_nDataTypeCount*/sizeof (s_DataType) / sizeof (s_DataType0),/*m_pDataType*/s_DataType,这两行实际上定义了该支持库中唯一的库定义数据类型“超文本浏览框”。用过易语言的都知道它是一个窗口单元,我们一步步来看它是如何定义的。我们找到s_DataType的定义,发现它是一个数组,只有一个LIB_DATA_TYPE_INFO类型的成员(肯定只有一个啦,因为该支持库就只有“超文本浏览框”这一个数据类型了。到这里我们也同时明白了上面第一行计算出了这个数组的成员数,作为数据类型个数):static LIB_DATA_TYPE_INFO s_DataType = /*m_szName*/_WT(超文本浏览框),/*m_szEgName*/_WT(HtmlViewer),/*m_szExplain*/_WT(提供对HTML页面的浏览支持),/*m_nCmdCount*/sizeof (s_nHtmlViewerElementCmdIndex) / sizeof (s_nHtmlViewerElementCmdIndex 0),/*m_pnCmdsIndex*/s_nHtmlViewerElementCmdIndex,/*m_dwState*/LDT_WIN_UNIT,/*m_dwUnitBmpID*/IDB_HTMLVIEWER_BITMAP,/事件/*m_nEventCount*/g_HtmlViewerEventCount,/*m_pEventBegin*/g_HtmlViewerEvent,/属性/*m_nPropertyCount*/g_HtmlViewerPropertyCount,/*m_pPropertyBegin*/g_HtmlViewerProperty,对外接口/*m_pfnGetInterface*/GetInterface_HtmlViewer,/*m_nElementCount*/0,/*m_pElementBegin*/NULL,;前三行又是一些说明信息,说明这个数据类型(在这里也就是窗口单元)的名字、功能。第六行:/*m_dwState*/LDT_WIN_UNIT,指出该类型是一个窗口单元,第四五行是定义了该窗口单元的所属命令(即“执行命令()”、“跳转()”等)。第六行说明该数据类型是一窗口单元。第七行给该类型分配了一幅位图,以便在易语言编程环境中的“窗口单元箱”中显示代表该窗口单元。第八、九行说明了该窗口单元的所有事件(比如“即将跳转”事件),后面两行说明该窗口单元是属性(易语言的“属性”列表内的东东,“左边”、“右边”等等),然后:/*m_pfnGetInterface*/GetInterface_HtmlViewer,指出该单元的对外接口,最后两行对于窗口单元类型无意义。具体请参看tech.txt二、属性下面我们就依次讲解这些都是如何实现的。遵循“由易到难”的原则,我们先看属性部分:/*m_nPropertyCount*/g_HtmlViewerPropertyCount,/*m_pPropertyBegin*/g_HtmlViewerProperty,应该比较眼熟吧?先是属性个数,然后是属性的具体定义。我们找到g_HtmlViewerProperty的定义,又是一个数组,数组的各个元素依次说明该窗口单元的各个属性(就是易语言“属性”窗口中列出的那些)。我们就挑第一个,字体大小,/*m_szName*/_WT(字体大小),/*m_szEgName*/_WT(FontSize),/*m_szExplain*/_WT(指定浏览页面时所使用的字体尺寸),/*m_shtType*/UD_PICK_INT,/*m_wState*/NULL,/*m_szzPickStr*/_WT(最小0较小0中等0较大0最大00),先是三行的说明,第四行/*m_shtType*/UD_PICK_INT说明该属性是整数型的,并且是用户只能选择,不能编辑。打开易语言看看“超文本浏览框”的“字体大小”属性也正是如此。m_wState 是用于说明该属性在易语言“属性”窗口显示时是否缩近(子属性,比如窗口的“底图方式”属性),是否显示分组封底线,是否只读,设计时是否可用等,请参阅“tech.txt”。这个属性没有这些特点,所以为NULL。既然这个属性用户只能选择,不能编辑,那就应该提供选项呀,最后一行/*m_szzPickStr*/_WT(最小0较小0中等0较大0最大00),就是做了这个工作。各个备选项用0隔开。其他是属性和这个类似,就不一一讲解了。看完了这些属性你也许会有疑问:这并不全呀!“字体大小”以前的属性哪里去了?向上看,FIXED_WIN_UNIT_PROPERTY,找到它的定义你就知道了。“名称”和“备注”属性是每个窗口单元共有的,所以这里不需要定义。三、事件看完了属性,我们按热键 Ctrl+Num * 或Browse工具条上点“Pop context”回到s_DataType,我们接着看事件/*m_nEventCount*/g_HtmlViewerEventCount,/*m_pEventBegin*/g_HtmlViewerEvent,找到g_HtmlViewerEvent的定义,同样是数组,每个元素说明一个事件的名称、描述、返回值类型、参数等相关信息。这些具体的东西,还是建议你查看tech.txt 。需要注意的是易语言支持库开发技术文档在这里加了一行注释:/ ! 此处的定义顺序绝对不可改变,主默认信息放在首位。也就是说,第一个事件“即将跳转”是默认事件,你在易语言中在窗口上放一个“超文本浏览框”,然后双击,看看进入那个事件?还有就是那些“鼠标左键被按下”、“鼠标左键被放开”、“被双击”等共有的事件并没有出现在这里,也没有类似属性的FIXED_WIN_UNIT_EVENT,究竟为什么,请你自己思考,也算是课后作业吧J四、对外接口看完了窗口单元的属性和事件,我们依然很迷惑,我们定义的这些东西是如何与易语言环境交互呢?答案就在下面: Pop context到s_DataType的定义,看这一行:/*m_pfnGetInterface*/GetInterface_HtmlViewer,这一行就是答案,它提供了“超文本浏览框”的所有对外接口。既然它这么重要,我们赶快看吧,找到它的定义。是一个函数:PFN_INTERFACE WINAPI GetInterface_HtmlViewer (INT nInterfaceNO)return nInterfaceNO = ITF_CREATE_UNIT ? (PFN_INTERFACE)Create_HtmlViewer :nInterfaceNO = ITF_NOTIFY_PROPERTY_CHANGED ? (PFN_INTERFACE)NotifyPropertyChanged_HtmlViewer :nInterfaceNO = ITF_GET_ALL_PROPERTY_DATA ? (PFN_INTERFACE)GetAllPropertyData_HtmlViewer :nInterfaceNO = ITF_GET_PROPERTY_DATA ? (PFN_INTERFACE)GetPropertyData_HtmlViewer :NULL;用了一系列的“?:”运算符,其大体意思就是根据参数INT nInterfaceNO 的不同值,返回不同的函数指针,比如当接收TF_CREATE_UNIT(即创建单元)消息时,就返回Create_HtmlViewer函数的指针有了大概的了解,我们还是更深入一步吧,找到Create_HtmlViewer的定义,看其代码,我们的疑惑就全然冰释了,原来窗口创建时易语言环境把我们设定的属性以及其他一些参数传递给了这个函数,从而创建出了符合我们要求的窗口及窗口单元!五、所属命令最后来看看窗口单元所属的命令是如何实现的。经过多次的“pop context”我们来到s_LibInfo的定义出,即HtmlView.cpp文件中的/ 库定义开始static LIB_INFO s_LibInfo =处,在类型定义完成后,有如下代码:/*CmdCount*/sizeof (s_CmdInfo) / sizeof (s_CmdInfo 0),/*BeginCmd*/s_CmdInfo,/命令的定义信息/*m_pCmdsFunc*/ s_RunFunc,/命令的实现代码这写就是说明“超文本浏览框”的所有所属命令的。命令的定义信息比较简单,自己看吧。我要说明的一点是/*category*/-1,是用来说明该命令是属于某个窗口单元的(比如超文本浏览框的“执行命令()”),而不是全局命令(比如 “到文本()”)。但具体属于哪个窗口单元,看下面:找到s_RunFunc 的定义:PFN_EXECUTE_CMD s_RunFunc =/ 索引应与s_CmdInfo中的命令定义顺序对应fnExecute,fnNavigate,fnGetType,fnGetBusy,fnIsReady;只是简单列出了几个函数,这就是“超文本浏览框”的五个成员命令的实现函数了。fnExecute,对应“执行命令()”,fnNavigate对应“跳转”等等。我还要说的是易语言支持库开发技术文档中的这行注释:/ 索引应与s_CmdInfo中的命令定义顺序对应也就是说,s_CmdInfo的第一个元素说明的是fnExecute 也即 “执行命令()”的信息,依次类推。你可以打开易语言验证一下。这里只是简单列出了五个命令,这五个命令是如何实现的呢?拿第一个fnExecute 为例子吧,找到其定义,我们可以看到用了switch语句对参数进行了分检,对应于易语言中对该命令的说明。我们只看参数为0,即执行“前进”操作。pUnit-GoForward ();调用了pUnit的GoForward ()方法,寻找GoForward () 的定义,来到了CHHCtrl的成员函数:void GoForward() ASSERT(m_pBrowserApp != NULL); m_pBrowserApp-GoForward(); 调用了CHHCtrl的成员m_pBrowserApp的GoForward(),找到m_pBrowserAp的定义IWebBrowser2* m_pBrowserApp;原来最终调用了IWebBrowser2的GoForward();结合fnExecute的定义中的第一行:CHHCtrl* pUnit = (CHHCtrl*)GetWndPtr (pArgInf);和CHHCtrl类的定义:class CHHCtrl : public CWnd可以得知,我们在易语言中使用的“超文本浏览框”其实是一个从CWnd继承下来,包含一个protected IWebBrowser2类型的protected成员的类CHHCtrl当我们调用了“超文本浏览框.执行命令(#前进)”时,易语言的实际调用如下:超文本浏览框.执行命令(0)CHHCtrl:GoForward ()IWebBrowser2:GoForward ()到此为止,我们把“超文本浏览框”支持库基本分析得差不多了,但还有些细节,我就不罗嗦了,自己看看,有问题到提出来大家讨论。看完了这个,你是不是对易语言支持库的编写特别是编写窗口单元有了一些了解呢?并不难,是吧?先从CWnd继承来一个类,在这个类中实现窗口单元的功能,然后定义该窗口单元的所属命令、属性列表、事件列表、完成对外接口第二课 我的第一个支持库上一课我们结合官方网站提供的超文本浏览框支持库的源代码,系统地分析了易语言支持库的基本结构。这次我们就真枪实弹地来从头编写一个易语言支持库!可能上次的那篇文章你没有看得太懂,其实没有关系的,一来这篇文章里面的东西和上次的联系并不是十分紧密,二来我那次的第一次写东西,水平有限,也怪不得你。一准备工作在真正开始编写支持库之前,我们需要如下准备工作:1、把下载回来的易语言支持库开发技术文档解压,用VC打开其中libdocHtmlView目录下的HtmlView.dsw工程(即上面提到的超文本浏览框源代码),备用。我们下面要多次参考到这个支持库源代码并要从中拷贝程序片断到我们的工程。、重新打开一个窗口,新建一个MFC Dll工程,工程名就叫“FistLib”吧。下一步,选择“Ragular DLL with MFC statically linkend”。Fish,生成工程。3、到超文本浏览框工程(第1步打开的那个工程,以下简称“HtmlView”)所在目录找到Lib.h,拷贝至你的“FistLib”工程所在目录。这个文件是编写支持库必须的,每一个易语言支持库都必须引用这个头文件。二最简单的支持库下面我们就要真正开始写我们第一个支持库的源代码了,是不是有点激动?我们动手吧,打开FirstLib工程中的“FirstLib.cpp”,加入对lib.h的引用:#include lib.h切换到超文本浏览框工程(HtmlView),打开HtmlView.cpp找到如下代码:/ 库定义开始static LIB_INFO s_LibInfo =把这段代码拷贝至我们的工程中FistLib.cpp文件的最后,/ The one and only CFistLibApp objectCFistLibApp theApp;的后面,并改动成这个样子:/ 库定义开始static LIB_INFO s_LibInfo =/*Lib Format Ver*/LIB_FORMAT_VER,/ 保留未用/你在实际编写支持库时,下面的字符串一定要改,并且一定要用guidgen.exe来生成!/这是一个支持库区别于其他支持库的标志。类似于人的身份证号码。#defineLI_LIB_GUID_STR1E7E727171CC11d88D5ECA8F65FF111C/*guid str*/_T (LI_LIB_GUID_STR),/支持库的版本信息/*m_nMajorVersion*/1,/*m_nMinorVersion*/1,/*m_nBuildNumber*/3,/本支持库对易语言编程环境以及系统核心支持库版本的要求/一般不需要改变/*m_nRqSysMajorVer*/3,/*m_nRqSysMinorVer*/0,/*m_nRqSysKrnlLibMajorVer*/3,/*m_nRqSysKrnlLibMinorVer*/0,/我们支持库的名称,所支持的语言,详细解释,状态等信息/前三项可以根据需要改动,最后一个一般不要改变!/*name*/_T (我的第一个支持库),/*lang*/LT_CHINESE,/*explain*/_WT(这是我的第一个支持库,Yeah!),/*dwState*/NULL,/支持库的作者信息/*szAuthor*/_WT(海洋),/*szZipCode*/NULL,/*szAddress*/NULL,/*szPhoto*/_WT,/*szFax*/_WT,/*szEmail*/_WT(),/*szHomePage*/_WT(),/*szOther*/_WT(通过这个支持库,我们可以了解易语言支持库编写的一般步骤),/本库中自定义数据类型的相关信息/*type count*/0,/sizeof (s_DataType) / sizeof (s_DataType0),/*PLIB_DATA_TYPE_INFO*/NULL,/s_DataType,/全局命令类别信息/*CategoryCount*/ 0,/ 加了类别需加此值。/*category*/_WT(0/ 类别说明表每项为一字符串,前四位数字表示图象索引号(从1开始,0无).0),/本库中提供的所有命令(全局命令及对象方法)的信息/*CmdCount*/0,/sizeof (s_CmdInfo) / sizeof (s_CmdInfo 0),/*BeginCmd*/NULL,/s_CmdInfo,/*m_pCmdsFunc*/ NULL,/s_RunFunc,/用作为易语言IDE提供附加功能的命令的相关信息/*pfnRunAddInFn*/NULL,/*szzAddInFnInfo*/NULL,/提供接收来自易语言IDE或运行环境通知信息的函数,可以直接从HemlView工程/中拷贝/*pfnNotify*/ProcessNotifyLib,/保留,未用/*pfnRunSuperTemplate*/NULL,/*szzSuperTemplateInfo*/NULL,/本库中定义的所有常量的信息/*nLibConstCount*/0,/sizeof (s_ConstInfo) / sizeof (s_ConstInfo 0),/*pLibConst*/NULL,/s_ConstInfo,/ 本库正常运行所需要依赖的其他文件,一般为NULL/*szzDependFiles*/NULL,;为了简单起见,我把许多地方改为了0或NULL,只保留了一些必要的信息。如果此时你编译这个工程的话,一定会遇到一堆的编译错误,原因就是有一个宏“_WT()”没有定义,一个“ProcessNotifyLib”函数没有定义。这个宏在哪里呢?打开HtmlView工程的StdAfx.h文件,找到如下代码段,复制到我们工程中相应文件的相应位置:#ifdef _COMPILE_FNR/ 此宏在 HTMLVIEW_FNR_RELEASE 编译配置中设置。#define_WT(text)#else#define_WT(text)text#endif至于这个宏有什么用,我们以后会讲,你现在只要记住,支持库中用到的字符串一定要用“_WT()”宏包含起来。那么那个函数呢?对,猜得没错,就在HtmlView工程中的HtmVeiw.cpp文件中,/INT WINAPI ProcessNotifyLib (INT nMsg, DWORD dwParam1, DWORD dwParam2)/把这段代码拷贝至我们工程的FirstLib.cpp文件的相应位置(库定义的前面)。同样,找到下面的代码段,/INT g_nLastNotifyResult;PFN_NOTIFY_SYS g_fnNotifySys = NULL;INT WINAPI NotifySys (INT nMsg, DWORD dwParam1, DWORD dwParam2)/#include fnshare.cpp/复制到FirstLib.cpp的相应位置。注意fnshare.cpp文件我们暂时用不着,所以复制过去后要注释掉这一行。这次没有问题了,编译通过!呵呵别高兴得太早了,这还不是一个完整的易语言支持库,不信你把生成的FirstLib.dll复制到易语言的Lib命令下,改名为FirstLib.fne,启动易语言你是看不到这个支持库的。不过也不用灰心,就差一丁点了!加如下代码到FirstLib.cpp的最后。PLIB_INFO WINAPI GetNewInf ()return &s_LibInfo;打开FirstLib.def,把“; Explicit exports can go here”改为“GetNewInf”,输出该函数。然后编译,复制FirstLib.dll复制到易语言的Lib命令下,改名。打开易语言,在“工作夹”中的“支持库”页找一下,看到没有?“我的第一个支持库”!选中这个支持库,“状态夹”的“提示”页里可以看到我们在支持库里定义的一些信息。成功了!呵呵,好激动呀。三今天的收获我们来总结一下:任何一个易语言支持库都必须包含一个LIB_INFO类型的结构变量(在我们的例子中为s_LibInfo),这个变量必须正确地初始化,因为这个变量里包含了该支持库的一切最重要的、最基本的信息。然后需要一个GetNewInf ()的函数来对外输出这个结构变量。易语言编程环境(IDE)在启动时会查找易语言的Lib目录下所有fne文件的GetNewInf ()接口,如果找到,就读取这个函数从而得到了我们在s_LibInfo中定义的相关信息并加载。(LIB_INFO一个结构,在lib.h里定义,关于这个结构的详细解释请参看libdoc目录下的tech.txt文件,我建议你把这个文件打印出来,看着方便)最后:告诉你一点小技巧,你可以打开VC的 Project菜单-Settings 找到“Link”页,把“Output file name”改为你的易语言lib目录的路径加“FirstLib.fne”(比如在我这里就是“D:e3.5libFistLib.fne”)然后你编译这个工程时,生成的dll文件就会自动出现在易语言的lib目录下,并以fne后缀结尾。你只要打开易语言就可以看到效果了,不用每次编译后都“复制”、“改名”,很方便的哦J但是要记住在每次编译前一定要关掉易语言哦,否则是无法编译的。好了,今天就到这里吧。我建议你把本文中的例子搞清楚以后,看看tech.txt(别告诉我找不到)。为下一讲做准备。下一次我们就要充实这个支持库,定义几个常量,实现几个全局命令,还有bb88提到的“包装API到支持库”的内容(在此向bb88道歉,我前段时间实在是忙啊)。袁晓辉 2004-3-9 第三课 充实与完善上次我们实现了一个最简单的易语言支持库,尽管它除了显示库名、库版本号、作者信息等基本信息之外并未能做更多的事情,但它确实是一个完整的易语言支持库。不过做为一个“支持库”它还是过于简单,因为它并没有给我们的易语言提供如何“支持”!不过不用担心,我们这就对它进行充实与完善。打开我们上次完成的FirstLib工程与易语言支持库开发技术文档中提供的HtmlView工程。Lets Go!一常量如何给一个支持库添加常量呢?打开FirstLib.cpp,找到s_LibInfo初始化代码中如下行:/本库中定义的所有常量的信息/*nLibConstCount*/0,/sizeof (s_ConstInfo) / sizeof (s_ConstInfo 0),/*pLibConst*/NULL,/s_ConstInfo,这两个元素分别定义了我们的库中所定义的常量总数(nLibConstCount)和指向常量定义数组的指针(pLibConst)。我们把它们设为0和NULL就代表没有定义如何常量。pLibConst 是指向一个PLIB_CONST_INFO结构的指针,比如我们要定义两个常量,一个是整数型,值为100,一个为文本型,值为“易语言”,那么相关定义如下:(该段代码一定要放在s_LibInfo定义之前)/常量定义LIB_CONST_INFO s_ConstInfo =_WT(常量一),Const1,NULL,LVL_SIMPLE,CT_NUM,NULL,10,_WT(常量二),NULL, 这是第二个常量,LVL_SIMPLE,CT_TEXT,易语言,0,;然后把s_LibInfo初始化代码中相关代码改为如下(把0和NULL去掉),使我们定义的常量生效。/本库中定义的所有常量的信息/*nLibConstCount*/sizeof (s_ConstInfo) / sizeof (s_ConstInfo 0),/*pLibConst*/s_ConstInfo,编译该工程,打开易语言,在“支持库”也里你就可以看到我们定义的两个常量了。此刻你最关心的可能是LIB_CONST_INFO各个元素的含义吧?我们分析一下,s_ConstInfo 数组共有两个成员(内部的两个花括号),每个成员用7个元素定义一个常量。这7个元素的意义如下:前三个元素分别代表该常量的名称、英文名称和详细解释,LPTSTR类型的,如果没有可设为NULL。你可以改变这三个元素,再编译看看有什么变化(注意,我们前面提到过的,支持库里用到的字符串要用“_WT()”宏包起来,这样会为以后编译fnr版本提供方便)。第四个必须为“LVL_SIMPLE”即整数1。第五个指明该常量的类型,可以为如下常量(均在lib.h里定义)CT_NULL、CT_NUM(数值型,整数或小数)、CT_BOOL(逻辑型)、CT_TEXT(文本型)。如果为文本型,那么对应的值就在第六个参数里指定,否则在最后一个参数里指定(逻辑值按数值型对待,1代表真,0代表假)。如果觉得不好理解,就把支持库里的定义信息与易语言IDE中显示的信息反复对比,很快就会找到规律的。一旦你学会了定义常量,就随心所欲地定义几个吧,然后看着易语言中我们的支持库越来越充实,你是不是有一种成就感?J二自定义数据类型记得在易语言论坛上有人曾问我如何把API函数中使用的“POINT”类型和使用该类型变量作参数的API函数“GetCursorPos”封装进易语言支持库。当时我比较忙,没能答复,其实要回答这个问题,就牵涉到在支持库中定义自定义数据类型和全局命令。下面我们先看如何把“POINT”类型添加进支持库:先对POINT类型进行分析,MSDN是这样定义它的:typedef struct tagPOINT LONG x; LONG y; POINT;即有两个32位整数型(LONG,对应易语言的“整数型”)的成员分别代表一个点(point)的横纵坐标。那么如何在我们的支持库中定义呢?我们在FirstLib.cpp中s_LibInfo初始化代码中找到如下代码段:/本库中自定义数据类型的相关信息/*type count*/0,/sizeof (s_DataType) / sizeof (s_DataType0),/*PLIB_DATA_TYPE_INFO*/NULL,/s_DataType,和常量类似,这里就是分别说明该库中所定义的数据类型的个数和所有自定义数据类型的定义信息。我们首先定义s_DataType如下(可以从HtmlView工程中拷贝,修改。同样,放在s_LibInfo的定义之前):/数据类型static LIB_DATA_TYPE_ELEMENT s_PointElement = SDT_INT,NULL,_WT(横坐标),_WT(x),_WT(代表一个点的横坐标),NULL,0,SDT_INT,NULL,_WT(纵坐标),_WT(y),_WT(代表一个点的纵坐标),NULL,0,;static LIB_DATA_TYPE_INFO s_DataType = /*m_szName*/_WT(点),/*m_szEgName*/_WT(POINT),/*m_szExplain*/_WT(一个自定义数据类型,用横纵左边来代表一个点),/*m_nCmdCount*/0,/sizeof (s_nHtmlViewerElementCmdIndex) / sizeof (s_nHtmlViewerElementCmdIndex 0),/*m_pnCmdsIndex*/NULL,/s_nHtmlViewerElementCmdIndex,/*m_dwState*/NULL,/LDT_WIN_UNIT,/*m_dwUnitBmpID*/0,/IDB_HTMLVIEWER_BITMAP,/*m_nEventCount*/0,/g_HtmlViewerEventCount,/*m_pEventBegin*/NULL,/g_HtmlViewerEvent,/*m_nPropertyCount*/0,/g_HtmlViewerPropertyCount,/*m_pPropertyBegin*/NULL,/g_HtmlViewerProperty,/*m_pfnGetInterface*/NULL,/GetInterface_HtmlViewer,/*m_nElementCount*/2,/*m_pElementBegin*/s_PointElement,;我们先看s_PiontElement的定义,它代表了我们要定义的数据类型“点”的各个子成员的定义信息。我们要定义的“点”类型有两个数据成员,所以这个数组有两个元素(内部两个花括号),每个元素用7个成员来定义“点”类型的一个数据成员。我们来看看这7个成员:第一个为该数据成员的类型,SDT_INT代表“整数型”,其他类型参看lib.h中SDT开头的常量。第二个只有在类型为数组时有效,具体存储格式参看tech.txt。对于我们这个例子来说,没有意义,直接置为NULL。第三、四、五个分别指定该数据成员的名称、英文名称、详细解释。第六个指定该数据成员的状态,如果为LES_HAS_DEFAULT_VALUE则代表该成员有初始值,其值在后一个中指定。如果没有初始值,最后两个分别置为NULL和0就可以了。然后是s_DataType的定义,这个结构指定了我们要定义的数据类型“点”的相关信息,前三个成员分别指定数据类型的名称、英文名称、详细解释。第四、五成员分别个指定该数据类型的成员命令个数及各个成员命令在支持库命令表中的索引。我们这个“点”类型暂时还没有成员命令,所以置为0和NULL。第六个成员指定该数据类型的状态,对应一般的非窗口单元类型的数据,置为NULL就可以了。(其他情况我们会在以后逐步讲解)接下来的六个成员对于一般的非窗口单元类型的数据无效,直接置为NULL或0。窗口单元数据类型(即出现在控件箱中的数据类型,比如“超文本浏览框”)的定义我们会在后面讲解。最后两个成员分别指定我们定义的数据类型中子成员(在这个例子中就是“横坐标”和“纵坐标”)个数及其定义。是不是有点麻烦了?呵呵,我的中文水平有限,说得不是很清楚,请多多谅解J不过呢,我们终于完成了一个数据类型的定义,修改s_LibInfo初始化代码中的相关代码,使我们定义的POINT在支持库中生效!/本库中自定义数据类型的相关信息/*type count*/sizeof (s_DataType) / sizeof (s_DataType0),/*PLIB_DATA_TYPE_INFO*/s_DataType,编译,打开易语言,是不是看到我们定义的数据类型“点”了呢?怎么样?刚才的那些有点烦人的东西此刻是不是也显得不那么烦了呢?我的第一个支持库越来越完善了!哈哈。休息片刻吧,休息好了我们再继续。三全局命令上面我们定义了一个数据类型“点”,这个数据类型有什么用呢?是要被GetCursorPos作为参数使用的。通过查找MSDN我们得知这个API函数只有一个POINT(即我们刚才定义好的那个数据类型)型的参数,返回一个BOOL。那么相关的定义如下(放在数据类型定义之后。因为我们的命令要用到自定义数据类型):/命令参数信息:ARG_INFO s_ArgInfo =/*name*/_WT(参数),/*explain*/_WT(该参数为一“点”类型的容器),/*bmp inx*/0,/*bmp num*/0,/*type*/MAKELONG(1,0),/本支持库中的第一个自定义数据类型/*default*/0,/*state*/AS_RECEIVE_VAR,;/命令信息static CMD_INFO s_CmdInfo =/*ccname*/_WT(取鼠标位置),/*egname*/_WT(GetCursourPos),/*explain*/_WT(取得当前鼠标指针在屏幕上的位置),/*category*/1,/*state*/NULL,/*ret*/SDT_BOOL,/*reserved*/0,/*level*/LVL_SIMPLE,/*bmp inx*/0,/*bmp num*/0,/*ArgCount*/1,/*arg lp*/s_ArgInfo,;先来看s_ArgInfo 的定义,这个数组顺序定义了本支持库中所有命令的参数信息。打个比方,一个支持库共有3个命令,分别有1,0,3个参数,那么这个s_ArgInfo 数组就应该有4个成员,第一个命令用到它的第一个成员中定义的信息;第二个命令没有参数,所以不使用这个数组中的信息;第三个命令用到它的后三个。我们这个库只有一个命令,并且这个命令只有一个参数,所以这个数组就只有一个成员了。下面来看它的内部是如何定义的:第一、二个成员分别是名称、解释。应该比较熟悉了吧?第三、四个指定用于代表该该参数在支持库中显示时所使用的位图资源,我们就使用系统默认的,所以直接置0。第五个指定该参数的类型,如果为易语言自带的数据类型,就可以用SDT_INT之类的常量。但我们这里用的是本支持库中定义的数据类型,用MAKELONG(1,0)代表本支持库中的第一个自定义数据类型,依此类推,MAKELONG(2,0)就是第二个自定义数据类型了(不过我们这个支持库只有一个自定义数据类型,所以MAKELONG(2,0)是没有意义的)。最后两个成员指定该参数的默认值和状态,我们用AS_RECEIVE_VAR表示该参数必须是一个非数组的容器。因为,GetCursorPos API函数是用LPPOINT(即POINT指针)做参数的,这个参数是要向外传出值的。(对应易语言中的“传址”)。详细解释看文档。s_CmdInfo是用于说明这个命令的相关信息的。其中:/*category*/1,代表这个命令在“支持库”页里显示时,位于第一个类别里。(后面还要讲这个)/*ret*/SDT_BOOL,代表返回值为逻辑型。/*bmp inx*/0,/*bmp num*/0,代表显示时使用默认图片。/*ArgCount*/1,/*arg lp*/s_ArgInfo,指定参数个数及参数的定义。注意,如果该命令不是第一个命令,则这里要用&s_ArgInfon,n为该命令以前所有命令使用的参数个数总和-1。其他的就不一一讲解的,自己对照文档看吧。然后更改s_LibInfo初始化部分的相应代码,使我们定义的全局命令生效:/全局命令类别信息/*CategoryCount*/ 1,/ 加了类别需加此值。/*category*/_WT(0000类别一/ 类别说明表每项为一字符串,前四位数字表示图象索引号(从1开始,0无).0),/本库中提供的所有命令(全局命令及对象方法)的信息/*CmdCount*/sizeof (s_CmdInfo) / sizeof (s_CmdInfo 0),/*BeginCmd*/s_CmdInfo,/*CategoryCount*/ 1,/*category*/_WT(0000类别一0),这两行是什么意思?等你编译通过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新解读《GB-T 32550-2016金属和合金的腐蚀 恒电位控制下的临界点蚀温度测定》
- 新解读《GB-T 30963-2014通信终端产品绿色包装规范》
- 广州股权转让合同范本
- 铝板幕墙施工合同范本
- 委托编排舞蹈合同范本
- 外协产品加工合同范本
- 喷漆房出租合同范本
- 抽纸购销合同范本
- 食品销售安全员考试题库及答案
- 广告工作心得体会(甄选10篇)
- 2025年中国电信面试试题及答案
- 阿里安全管理办法
- 山东校外托管机构管理暂行办法
- 1.小蝌蚪找妈妈(课件)-2025-2026学年统编版二年级语文上册
- 升降机考试题目及答案
- 2025-2026学年第一学期学校教学工作计划及序列表
- 语文课程教学技能课件
- 福建省厦门市同安区2024-2025学年七年级下学期期末考试地理试卷(含答案)
- 《人体工程学》本科设计类专业全套教学课件
- IATF16949内审员培训资料
- 艾梅乙反歧视培训课件
评论
0/150
提交评论