|
马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
TC50326版本的大更新,将T语言开发者带入到一个全新的阶段,对结构体的支持,对引用传地址的支持,让大家在调用系统api的时候更加随心所欲.
今天给大家解析一下,TC50326自带示例,气泡演示的源码实现 "插件分类->气泡演示",今天我们讲解托盘部分
先上源码
- //-----------------------常量定义-----------------------
- var NIIF_NONE = #0
- var NIIF_INFO = #1
- var NIIF_WARNING = #2
- var NIIF_ERROR = #3
- var NIIF_GUID = #5
- var NIIF_ICON_MASK = #F
- var NIIF_NOSOUND = #10 //关闭提示音标志
- var NIF_MESSAGE = #1
- var NIF_ICON = #2
- var NIF_TIP = #4
- var NIF_STATE = #8
- var NIF_INFO = #10
- var NIM_ADD = #0
- var NIM_MODIFY = #1
- var NIM_DELETE = #2
- var NIM_SETFOCUS = #3
- var NIM_SETVERSION = #4
- var NIM_VERSION = #5
- var WM_GETICON = #7f
- //-----------------------常量定义-----------------------
- //获取指定窗口的图标句柄
- function GetIconHandle(hWnd)
- return dllcall("User32.dll","long","SendMessageW","long",hWnd,"long",WM_GETICON,"long",0,"long",0)
- end
- //创建拖盘气泡的结构体
- //uFlags 显示的属性,表示结构体里面那些成员有效
- //tip 拖盘的名称
- //content 气泡显示内容
- //title 气泡显示的标题
- //hIcon 设置一次即可,第一次创建拖盘的时候使用
- function CreateNOTIFYICONDATA(uFlags,tip="",content="",title="",hIcon=0)
-
- var NOTIFYICONDATA = array()
- NOTIFYICONDATA["cbSize"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["hWnd"] = array("long"=1,"value"=windowgetmyhwnd())
- NOTIFYICONDATA["uID"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["uFlags"] = array("long"=1,"value"=uFlags)
- NOTIFYICONDATA["uCallbackMessage"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["hIcon"] = array("long"=1,"value"=hIcon)
- NOTIFYICONDATA["szTip"] = array("wchar"=128,"value"=tip)
- NOTIFYICONDATA["dwState"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["dwStateMask"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["szInfo"] = array("wchar"=256,"value"=content)
- NOTIFYICONDATA["uTimeoutAndVersion"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["szInfoTitle"] = array("wchar"=64,"value"=title)
- NOTIFYICONDATA["dwInfoFlags"] = array("long"=1,"value"=0)
- //得到自己结构体的大小
- NOTIFYICONDATA["cbSize"]["value"] = structlen(NOTIFYICONDATA)
- return NOTIFYICONDATA
- end
- //------------------------------------功能实现------------------------------------------------------------------------
- //一般放于程序初始化的时候
- function 创建拖盘(tip)
- var hIcon = GetIconHandle(windowgetmyhwnd())//我们是第一次创建拖盘,所以需要图标
- var NOTIFYICONDATA = CreateNOTIFYICONDATA(NIF_ICON + NIF_TIP,tip,"","",hIcon) //重构结构体内容
- dllcall("shell32.dll","long","Shell_NotifyIconW","long",NIM_ADD,"struct",NOTIFYICONDATA)//创建托盘
- end
- //当发生什么事件的时候,会需要提示用户
- function 显示信息(content,title="")
- var NOTIFYICONDATA = CreateNOTIFYICONDATA(NIF_INFO,"",content,title) //重构结构体内容
- dllcall("shell32.dll","long","Shell_NotifyIconW","long",NIM_MODIFY,"struct",NOTIFYICONDATA)//更新托盘气泡信息
- end
- //一般放于程序退出的时候
- function 删除托盘()
- var NOTIFYICONDATA = CreateNOTIFYICONDATA(0)//重构结构体内容
- dllcall("shell32.dll","long","Shell_NotifyIconW","long",NIM_DELETE,"struct",NOTIFYICONDATA)//删除拖盘
- end
复制代码 从上面代码中,我们可以看到三个部分
1、常量定义
常量定义这部分都是win中已经写死的一些固定的值,大家可以通过,msdn文档查阅相关定义的值
2、结构体初始化
托盘气泡功能,在实现中使用到了结构体,接触过win编程的同学应该不会陌生,在以往的版本中,TC是不支持结构体的直接使用的,当然现在不是问题了.
我们先看下 我们使用的 气泡结构体的原生定义(vb版的):
- Private Type NOTIFYICONDATA
- cbSize As Long
- hWnd As Long
- uID As Long
- uFlags As Long
- uCallbackMessage As Long
- hIcon As Long
- szTip As String * 128
- dwState As Long
- dwStateMask As Long
- szInfo As String * 256
- uTimeoutAndVersion As Long
- szInfoTitle As String * 64
- dwInfoFlags As Long
- End Type
复制代码 接下我们在TC中的结构体的定义:
- var NOTIFYICONDATA = array()
- NOTIFYICONDATA["cbSize"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["hWnd"] = array("long"=1,"value"=windowgetmyhwnd())
- NOTIFYICONDATA["uID"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["uFlags"] = array("long"=1,"value"=uFlags)
- NOTIFYICONDATA["uCallbackMessage"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["hIcon"] = array("long"=1,"value"=hIcon)
- NOTIFYICONDATA["szTip"] = array("wchar"=128,"value"=tip)
- NOTIFYICONDATA["dwState"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["dwStateMask"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["szInfo"] = array("wchar"=256,"value"=content)
- NOTIFYICONDATA["uTimeoutAndVersion"] = array("long"=1,"value"=0)
- NOTIFYICONDATA["szInfoTitle"] = array("wchar"=64,"value"=title)
- NOTIFYICONDATA["dwInfoFlags"] = array("long"=1,"value"=0)
复制代码
TC对结构体的支持,实际上是以数组替代了其他语言的语法定义.
简说下TC对于结构体 定义的规则:
(1)结构体的定义,首先必须是二维数组,非二维数组执行的时候也无法解析
(2)结构体中的每个成员名必须是key,这样方便大家获取结构体中的值
(3)结构体中的每个成员的类型,与值都必须声明,结构体中的位的类型是没有明确传地址概念的他们两种都支持,但是需要按文档中的说明写好指定的类型,同时注意一个问题,在结构体成员类型中,暂时只有char,wchar两种类型的长度是有效的,其他类型设置也是无效的
(4)为了方便复用,建议使用全局变量存储或者使用函数来初始化
3、功能实现
我们调用的其实是系统的api Shell_NotifyIcon,他位于 shell32.dll.
我们在实现不同功能的时候,只是为结构体不同的成员,设置了对应的值而已.
接下来看下函数的详细说明:
Shell_NotifyIconW 通过百度我们可以查到
- Shell_NotifyIcon函数,向任务栏的状态栏发送一个消息
- 函数原型
- BOOL Shell_NotifyIcon(
- DWORD dwMessage,
- PNOTIFYICONDATA lpdata
- );
- 参数:
- dwMessage为输入参数,传递发送的消息,表明要执行的操作。可选的值如下:
- NIM_ADD
- 向托盘区域添加一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示这个图标,以便以后再次使用Shell_NotifyIcon对此图标操作。
- NIM_DELETE
- 删除托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被删除的这个图标。
- NIM_MODIFY
- 修改托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被修改的这个图标。
- NIM_SETFOCUS
- Version 5.0. 设置焦点。比如当用户操作托盘图标弹出菜单,而有按下ESC键将菜单消除后,程序应该使用此消息来将焦点设置到托盘图标上。
- NIM_SETVERSION
- Version 5.0. 设置任务栏按照第二个参数lpdata指向的NOTIFYICONDATA结构体中的uVersion成员指定的版本号来工作。此消息可以允许用户设置是否使用基于Windows2000的version 5.0的风格。uVersion的缺省值为0,默认指明了使用原始Windows 95图标消息风格。具体这两者的区别请参考msdn中的Shell_NotifyIcon函数说明的Remarks。
- lpdata为输入参数,是指向NOTIFYICONDATA结构体的指针,结构体内容用来配合第一个参数wMessage进行图标操作。
复制代码 好了 有了上面的这个函数说明,相信大家应该理解了,每个功能封装实现的意义了.
今天的解析就到这里,附一个效果图:
明天将给大家解析气泡示例的另外一部分功能,在控件上显示气泡提示.
|
|