易语言API高级技巧教学
首先声明,本文的读者该卖是:具有相当的易言语基础的、能较熟练地把常用的的API从VB/C声明转换到易言语DLL命令的易言语喜欢者。
1,使用指针
易言语中出于安定、方便考虑,没有直接提供指针,这正在进行一些高级纵时不是很方便,固然有一些第三方支撑库可以取出变量指针(比如我的eLib++注:该支撑库系Delphi开发,本人已开放源代,你可以到易言语下载区瞧瞧)但是仅仅为了这个纵就带上一个支撑库不太值得。实在用一个API,加上一些技术就可以欺骗Windows和易言语,让它们报告你一个变量的指针。
这个API是lstrcpyn。用过C开发Windows下的步骤的朋友可能对这个API相比熟识,就是字符串拷贝。正在windows下取代C准则库函数strncpy的。字符串拷贝怎样能获得变量指针呢?秘密就正在这个API的返回值:
瞧瞧MSDN:“Ifthefunctionsucceeds,thereturnvalueisapointertothebuffer”
该函数把第二个参数指定的字符串双制到第一个参数指定的字符串,第三个参数指定双制的长度。假如双制成功,返回第一个参数(缓冲区buffer)的地点。瞧到了吗?它返回第一个参数的地点!!那么我们把需求取地点的变量给它的第一个参数,然后想要领让它双制成功,它不就返回了那个变量的地点了吗?
界说一个DLL命令如下:
Dll命令:取文本指针
返回值类型:整数型
正在Dll库中的命令名:lstrcpyn
参数:欲取其指针的文本数据类型:文本型<传址>
参数:欲取其指针的文本数据类型:文本型<传址>
参数:保存数据类型:整数型备注:0
这样挪用:
文本1=“abcdefg”
指针1=取文本指针(文本1,文本1,0)
把文本1双制到自己,双制长度为0字节(也就是什么都不双制),然后返回文本1的指针。就这么简略。先报告Windows我要双制一个文本到某个内存地点,但同时报告它我什么都不双制,它实践上帮你取出了这个文本的指针。
上面的例子是取文本的指针,其他类型的变量也一样的,由于正在API内部(实在是正在内存中)什么类型的变量都体现为一块内存区域,原理是一样的。但是易言语是强制类型的言语,所以这次要骗骗易言语了,呵呵,再界说这个API的一个新版本,把它的参数界说成你想要的类型就可以了。
Dll命令:取整数指针
返回值类型:整数型
正在Dll库中的命令名:lstrcpyn
参数:欲取其指针的整数数据类型:整数型<传址>备注:一定要传址
参数:欲取其指针的整数数据类型:整数型<传址>备注:一定要传址.重双一次
参数:保存数据类型:整数型备注:0
2,非凡的结构用字节集代替
Window98及其后的纵零碎提供了一个非常棒的API:GradientFill,利用这个API可以方便地画出渐变的效果。
这个API倒不是很麻烦,参考MSDN我们很快就可以正在易言语中界说出这个DLL命令:(以渐变填充矩形为例)
Dll命令:GradientFill
返回值类型:逻辑型
Dll库文件名:Msimg32.dll
正在Dll库中的命令名:GradientFill
参数:hDC数据类型:整数型
参数:pVertex数据类型:TRIVERTEX
参数:dwNumVertex数据类型:整数型
参数:pMesh数据类型:GRADIENT_RECT
参数:dwNumMesh数据类型:整数型
参数:dwMode数据类型:整数型
其中TRIVERTEX和GRADIENT_RECT时自界说的数据类型:
自界说数据类型:TRIVERTEX
成员:x数据类型:整数型
成员:y数据类型:整数型
成员:Red数据类型:短整数型
成员:Green数据类型:短整数型
成员:Blue数据类型:短整数型
成员:Alpha数据类型:短整数型
自界说数据类型:GRADIENT_RECT
成员:UpperLeft数据类型:整数型
成员:LowerRight数据类型:整数型
凭据MSDN的阐明,基础没有标题,但是假如你挪用这个函数,你不会成功的。为什么?我报告你缘由正在TRIVERTEX的界说上。你或许会说,这个没有标题啊,MSDN上界说如下:
typedefstruct_TRIVERTEX{
LONGx;
Longy;
COLOR16Red;
COLOR16Green;
COLOR16Blue;
COLOR16Alpha;
}TRIVERTEX,*PTRIVERTEX;
C言语的LONG和Long正在Windows32位下是32位,对应于易言语“整数型”,COLOR16为十六位,对应于易言语的“短整数型”没有标题啊!那假如我再报告你,易言语中的自界说数据类型的成员均是四字节对齐的,你该理解了吧。是的,易言语中的自界说数据类型的成员均是四字节对齐的,假如不敷四字节,会主动对齐到四字节的。具体到上面的界说,Red,Green,Blue,Alpha固然被界说为“短整数型”但是正在易言语内部,它们均被扩充为“整数型”了。这就是题手法泉源。解决的要领就是用字节集代替自界说数据结构。易言语的字节集不存正在四字节对齐的标题。
Dll命令:GradientFill
返回值类型:逻辑型
Dll库文件名:Msimg32.dll
正在Dll库中的命令名:GradientFill
参数:hDC数据类型:整数型
参数:pVertex数据类型:字节集
……………………..
这样界说就可以了。为了方便地生产所需求的字节集数据,我有界说了一个子步骤:
子步骤:TRIVERTEX到字节集
返回值类型:字节集
备注:由于内存对齐的缘由,务必把TRIVERTEX类型转换为字节集才可以挪用API成功
参数:VertEX数据类型:TRIVERTEX<数组>
局部变量:元素个数数据类型:整数型
局部变量:变量数据类型:整数型
局部变量:数据数据类型:字节集
元素个数=取数组成员数(VertEX)
计次循环首(元素个数,变量)
数据=数据+到字节集(VertEX[变量].x)
数据=数据+到字节集(VertEX[变量].y)
数据=数据+到字节集(VertEX[变量].Red)
数据=数据+到字节集(VertEX[变量].Green)
数据=数据+到字节集(VertEX[变量].Blue)
数据=数据+到字节集(VertEX[变量].Alpha)
计次循环尾()
返回(数据)
具体的请瞧附带的例程
其他具有类似特(参数或结构中有非四字节的)的API都可以用上述的要领来变通解决。