TC官方合作论坛

 找回密码
 立即注册
查看: 1897|回复: 0

tc。8封装。用函数封装api。

[复制链接]
发表于 2017-4-6 13:59:00 来自手机 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 剑仙十号 于 2017-5-5 06:53 编辑

tc。8封装。用函数封装api。
.
先设定C99标准。设定C99标准,有助于tc的健康发展。
1、增加库文件(****.t文件):
右键“项目管理-**项目名字”。 添加,新建文件(N)
文件名: structAPI,位置:  使用默认的。
2、把自定义的结构体/API函数,封装到“structAPI.t”文件。
3、定义部分带0。封装部分带0。
带0的,表示这是形参,是定义部分。
不带0的,表示这是实参,是调用部分。
//
C++中调用系统API,可以直接写/直接调,简直和调用C内建api一样简单。
但在aj,tc,e中调用系统API,都得先定义,先声明,麻烦多多的。
把常用系统API/ 常用API结构体,封装到“structAPI库.t”。
当某项目 使用到某个API时,在项目中新建一个“structAPI.t”,
再在“structAPI库.t” 中搜索该API名字,复制到“structAPI.t”使用。这样就省力多了。平时多积累,用时少费心。易api伴侣也是这样操作。
//
重用性强。这是编程的好处,
来来去去的,都是这些东西。一次编写,多次调用,这可不是吹牛的。
=======================================================

封装,不带传址参数的api。
这是比较简单的。
api带几个参数,函数就定义几个参数。
api带返回值,就用return返回数值。
照单拾药,照本宣科就行。
//
封装带有传址参数的api。
用函数封装,带有传址参数的api,形参必须带上&。
什么是形参,什么是实参?参考教程:
第三法,函数的定义。形参和实参。
第三法,函数的定义。引用传参的学习。
.
例子:GetCursorPos,VB声明:
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
说明:获取鼠标指针的当前位置返回值Long,非零表示成功,零表示失败。
会设置GetLastError参数表,参数类型,及说明lpPointPOINTAPI,随同指针在屏幕像素坐标中的位置载入的一个结构。
在VB中,
ByVal 代表普通传参,是传值的。
ByRef 代表引用传参,是传址的。
VB默认是传址的,省略标识ByVal,都默认为传址。Ip也代表传址。
.
VC声明
Api 函数功能:该函数检取光标的位置,以屏幕坐标表示。函数原型:BOOL GetCursorPos(LPPOlNT IpPoint)。参数:IpPint:POINT结构指针,该结构接收光标的屏幕坐标。
Ip是代表传址。
———————————————————————
———————————————————————
执行部分:
功能 执行()
var pt = pt0()//用新数组pt,继承结构体。
GetCursorPos(pt)
messagebox(pt["x"]["value"]&","& pt["y"]["value"])
结束
//
定义部分。封装部分。
功能 pt0()//定义结构体。使用下一行要封装的数组名,作为函数名。
var pt0 = 数组()
pt0["x"] = 数组("long"=1,"value"=0)
pt0["y"] = 数组("long"=1,"value"=0)
return pt0
结束
功能 GetCursorPos(&pt0)//定义api。把下一行要封装的api名,作为函数名。
//封装带传址参数,形参必须带上&,&pt0。
var ret0=dllcall("user32.dll","long","GetCursorPos","pstruct",pt0)
return ret0
结束
=======================================================

上面的讲解繁多。如果把注释去掉,代码是很简洁的。
功能 执行()
var pt = pt0()
GetCursorPos(pt)
messagebox(pt["x"]["value"]&","& pt["y"]["value"])
结束
功能 pt0()
var pt0 = 数组()
pt0["x"] = 数组("long"=1,"value"=0)
pt0["y"] = 数组("long"=1,"value"=0)
return pt0
结束
功能 GetCursorPos(&pt0)
var ret0=dllcall("user32.dll","long","GetCursorPos","pstruct",pt0)
return ret0
结束
本贴记录在:tc简单开发吧,精品区8,归类项目。
=======================================================

下面是做测试的代码,新手不用理会。
在C++中调用GetCursorPos(),直接是GetCursorPos(&结构体名)
tc帮助文档,
dllcall→参数类型中的p,相当于C++的&,取址符。
封装时先用& 引用传参,再用dllcall→参数类型的字母p取址。
白话点,封装过程先用&传址,再用字母p取址。
.
测试目的:
tc能否像C++一样用&封装api,用&调用api?   
//打开tc6.2,新建tc项目。右键界面,点击“查看源文件(F)”。
//这样,代码编辑框已经打开。按Ctrl+A全选。把代码全部覆盖粘贴进去。
var 线程ID
功能 执行()
var pt = pt0()
GetCursorPos(&pt) //这句编译不通过。直接报错。
messagebox(pt["x"]["value"]&","& pt["y"]["value"])
结束
功能 启动_热键()
//英文value_bool,布尔值,逻辑值
var vabool = 线程获取状态(线程ID)
if(vabool == false)
线程ID = 线程开启("执行", "")
elseif(vabool == true)
traceprint("线程执行中, 不用重复启动。")
end
结束
功能 终止_热键()
线程关闭(线程ID)
线程ID = 0
结束
功能 pt0()
var pt0 = 数组()
pt0["x"] = 数组("long"=1,"value"=0)
pt0["y"] = 数组("long"=1,"value"=0)
return pt0
结束
功能 GetCursorPos(pt0)
var ret=dllcall("user32.dll","long","GetCursorPos","pstruct",pt0)
return ret
结束
测试报错。测试报错。
=======================================================

测试目的:数组的继承。
tc,封装的struct函数,函数名带0,数组名带0,
把封装的函数调用一次,数组能否继承过来?
//打开tc6.2,新建tc项目。右键界面,点击“查看源文件(F)”。
//这样,代码编辑框已经打开。Ctrl+A全选。把代码全部覆盖粘贴进去。
var 线程ID
功能 执行()
  var pt = pt0()//数组的继承。
  GetCursorPos(pt)
  messagebox(pt["x"]["value"] & "," & pt["y"]["value"])
结束
功能 启动_热键()
var vabool = 线程获取状态(线程ID)
if(vabool == false)
线程ID = 线程开启("执行", "")
elseif(vabool == true)
traceprint("线程执行中, 不用重复启动。")
end
结束
功能 终止_热键()
线程关闭(线程ID)
线程ID = 0
结束
功能 pt0()
  var pt0 = 数组()
  pt0["x"] = 数组("long" = 1, "value" = 0)
  pt0["y"] = 数组("long" = 1, "value" = 0)
  return pt0
结束
功能 GetCursorPos(&pt0)
  var ret = dllcall("user32.dll", "long", "GetCursorPos", "pstruct", pt0)
  //参数4,tc,dllcall中的p,相当于C++的&.是取地址.
  return ret
结束
测试成功。测试成功。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-9-29 15:37 , Processed in 0.037946 second(s), 22 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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