TC官方合作论坛

 找回密码
 立即注册
查看: 2834|回复: 9

TC5.0 Win32 api一日一例 气泡示例解析(1)

  [复制链接]
发表于 2015-3-27 11:34:18 | 显示全部楼层 |阅读模式

马上加入TC

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

x
    TC50326版本的大更新,将T语言开发者带入到一个全新的阶段,对结构体的支持,对引用传地址的支持,让大家在调用系统api的时候更加随心所欲.
    今天给大家解析一下,TC50326自带示例,气泡演示的源码实现 "插件分类->气泡演示",今天我们讲解托盘部分


    先上源码
  1. //-----------------------常量定义-----------------------
  2. var NIIF_NONE                         = #0
  3. var NIIF_INFO                         = #1
  4. var NIIF_WARNING                 = #2
  5. var NIIF_ERROR                         = #3
  6. var NIIF_GUID                         = #5
  7. var NIIF_ICON_MASK                 = #F
  8. var NIIF_NOSOUND                 = #10 //关闭提示音标志

  9. var NIF_MESSAGE                 = #1
  10. var NIF_ICON                         = #2
  11. var NIF_TIP                         = #4
  12. var NIF_STATE                        = #8
  13. var NIF_INFO                         = #10
  14. var NIM_ADD                         = #0
  15. var NIM_MODIFY                         = #1
  16. var NIM_DELETE                         = #2
  17. var NIM_SETFOCUS                 = #3
  18. var NIM_SETVERSION                 = #4
  19. var NIM_VERSION                 = #5

  20. var WM_GETICON                        = #7f
  21. //-----------------------常量定义-----------------------

  22. //获取指定窗口的图标句柄
  23. function GetIconHandle(hWnd)
  24.     return dllcall("User32.dll","long","SendMessageW","long",hWnd,"long",WM_GETICON,"long",0,"long",0)
  25. end

  26. //创建拖盘气泡的结构体
  27. //uFlags 显示的属性,表示结构体里面那些成员有效
  28. //tip       拖盘的名称
  29. //content   气泡显示内容
  30. //title                气泡显示的标题
  31. //hIcon     设置一次即可,第一次创建拖盘的时候使用
  32. function CreateNOTIFYICONDATA(uFlags,tip="",content="",title="",hIcon=0)
  33.    
  34.     var NOTIFYICONDATA = array()
  35.     NOTIFYICONDATA["cbSize"]                                 = array("long"=1,"value"=0)
  36.     NOTIFYICONDATA["hWnd"]                                         = array("long"=1,"value"=windowgetmyhwnd())
  37.     NOTIFYICONDATA["uID"]                                         = array("long"=1,"value"=0)
  38.     NOTIFYICONDATA["uFlags"]                                 = array("long"=1,"value"=uFlags)
  39.     NOTIFYICONDATA["uCallbackMessage"]                 = array("long"=1,"value"=0)
  40.     NOTIFYICONDATA["hIcon"]                                 = array("long"=1,"value"=hIcon)
  41.     NOTIFYICONDATA["szTip"]                                 = array("wchar"=128,"value"=tip)
  42.     NOTIFYICONDATA["dwState"]                                 = array("long"=1,"value"=0)
  43.     NOTIFYICONDATA["dwStateMask"]                         = array("long"=1,"value"=0)
  44.     NOTIFYICONDATA["szInfo"]                                 = array("wchar"=256,"value"=content)
  45.     NOTIFYICONDATA["uTimeoutAndVersion"]         = array("long"=1,"value"=0)
  46.     NOTIFYICONDATA["szInfoTitle"]                         = array("wchar"=64,"value"=title)
  47.     NOTIFYICONDATA["dwInfoFlags"]                         = array("long"=1,"value"=0)
  48.     //得到自己结构体的大小
  49.     NOTIFYICONDATA["cbSize"]["value"] = structlen(NOTIFYICONDATA)
  50.     return NOTIFYICONDATA
  51. end

  52. //------------------------------------功能实现------------------------------------------------------------------------
  53. //一般放于程序初始化的时候
  54. function 创建拖盘(tip)
  55.     var hIcon =  GetIconHandle(windowgetmyhwnd())//我们是第一次创建拖盘,所以需要图标
  56.     var NOTIFYICONDATA = CreateNOTIFYICONDATA(NIF_ICON + NIF_TIP,tip,"","",hIcon)   //重构结构体内容
  57.     dllcall("shell32.dll","long","Shell_NotifyIconW","long",NIM_ADD,"struct",NOTIFYICONDATA)//创建托盘
  58. end

  59. //当发生什么事件的时候,会需要提示用户
  60. function 显示信息(content,title="")                                                                                                                        
  61.     var NOTIFYICONDATA = CreateNOTIFYICONDATA(NIF_INFO,"",content,title)                                           //重构结构体内容
  62.     dllcall("shell32.dll","long","Shell_NotifyIconW","long",NIM_MODIFY,"struct",NOTIFYICONDATA)//更新托盘气泡信息
  63. end

  64. //一般放于程序退出的时候
  65. function 删除托盘()                                                                                                                        
  66.     var NOTIFYICONDATA = CreateNOTIFYICONDATA(0)//重构结构体内容
  67.     dllcall("shell32.dll","long","Shell_NotifyIconW","long",NIM_DELETE,"struct",NOTIFYICONDATA)//删除拖盘
  68. end
复制代码
从上面代码中,我们可以看到三个部分
1、常量定义
常量定义这部分都是win中已经写死的一些固定的值,大家可以通过,msdn文档查阅相关定义的值

2、结构体初始化
托盘气泡功能,在实现中使用到了结构体,接触过win编程的同学应该不会陌生,在以往的版本中,TC是不支持结构体的直接使用的,当然现在不是问题了.
我们先看下 我们使用的 气泡结构体的原生定义(vb版的):
  1. Private Type NOTIFYICONDATA
  2.     cbSize As Long
  3.     hWnd As Long
  4.     uID As Long
  5.     uFlags As Long
  6.     uCallbackMessage As Long
  7.     hIcon As Long
  8.     szTip As String * 128
  9.     dwState As Long
  10.     dwStateMask As Long
  11.     szInfo As String * 256
  12.     uTimeoutAndVersion As Long
  13.     szInfoTitle As String * 64
  14.     dwInfoFlags As Long
  15. End Type
复制代码
接下我们在TC中的结构体的定义:
  1. var NOTIFYICONDATA = array()
  2.     NOTIFYICONDATA["cbSize"]                                 = array("long"=1,"value"=0)
  3.     NOTIFYICONDATA["hWnd"]                                         = array("long"=1,"value"=windowgetmyhwnd())
  4.     NOTIFYICONDATA["uID"]                                         = array("long"=1,"value"=0)
  5.     NOTIFYICONDATA["uFlags"]                                 = array("long"=1,"value"=uFlags)
  6.     NOTIFYICONDATA["uCallbackMessage"]                 = array("long"=1,"value"=0)
  7.     NOTIFYICONDATA["hIcon"]                                 = array("long"=1,"value"=hIcon)
  8.     NOTIFYICONDATA["szTip"]                                 = array("wchar"=128,"value"=tip)
  9.     NOTIFYICONDATA["dwState"]                                 = array("long"=1,"value"=0)
  10.     NOTIFYICONDATA["dwStateMask"]                         = array("long"=1,"value"=0)
  11.     NOTIFYICONDATA["szInfo"]                                 = array("wchar"=256,"value"=content)
  12.     NOTIFYICONDATA["uTimeoutAndVersion"]         = array("long"=1,"value"=0)
  13.     NOTIFYICONDATA["szInfoTitle"]                         = array("wchar"=64,"value"=title)
  14.     NOTIFYICONDATA["dwInfoFlags"]                         = array("long"=1,"value"=0)
复制代码

TC对结构体的支持,实际上是以数组替代了其他语言的语法定义.
简说下TC对于结构体 定义的规则:
(1)结构体的定义,首先必须是二维数组,非二维数组执行的时候也无法解析
(2)结构体中的每个成员名必须是key,这样方便大家获取结构体中的值
(3)结构体中的每个成员的类型,与值都必须声明,结构体中的位的类型是没有明确传地址概念的他们两种都支持,但是需要按文档中的说明写好指定的类型,同时注意一个问题,在结构体成员类型中,暂时只有char,wchar两种类型的长度是有效的,其他类型设置也是无效的
(4)为了方便复用,建议使用全局变量存储或者使用函数来初始化


3、功能实现
我们调用的其实是系统的api Shell_NotifyIcon,他位于 shell32.dll.
我们在实现不同功能的时候,只是为结构体不同的成员,设置了对应的值而已.

接下来看下函数的详细说明:
Shell_NotifyIconW 通过百度我们可以查到
  1. Shell_NotifyIcon函数,向任务栏的状态栏发送一个消息
  2. 函数原型
  3. BOOL Shell_NotifyIcon(
  4. DWORD dwMessage,
  5. PNOTIFYICONDATA lpdata
  6. );
  7. 参数:
  8. dwMessage为输入参数,传递发送的消息,表明要执行的操作。可选的值如下:
  9. NIM_ADD
  10. 向托盘区域添加一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示这个图标,以便以后再次使用Shell_NotifyIcon对此图标操作。
  11. NIM_DELETE
  12. 删除托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被删除的这个图标。
  13. NIM_MODIFY
  14. 修改托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被修改的这个图标。
  15. NIM_SETFOCUS
  16. Version 5.0. 设置焦点。比如当用户操作托盘图标弹出菜单,而有按下ESC键将菜单消除后,程序应该使用此消息来将焦点设置到托盘图标上。
  17. NIM_SETVERSION
  18. Version 5.0. 设置任务栏按照第二个参数lpdata指向的NOTIFYICONDATA结构体中的uVersion成员指定的版本号来工作。此消息可以允许用户设置是否使用基于Windows2000的version 5.0的风格。uVersion的缺省值为0,默认指明了使用原始Windows 95图标消息风格。具体这两者的区别请参考msdn中的Shell_NotifyIcon函数说明的Remarks。
  19. lpdata为输入参数,是指向NOTIFYICONDATA结构体的指针,结构体内容用来配合第一个参数wMessage进行图标操作。
复制代码
好了 有了上面的这个函数说明,相信大家应该理解了,每个功能封装实现的意义了.

今天的解析就到这里,附一个效果图:
气泡.png

明天将给大家解析气泡示例的另外一部分功能,在控件上显示气泡提示.


回复

使用道具 举报

发表于 2015-3-27 11:49:05 | 显示全部楼层
回复

使用道具 举报

发表于 2015-3-27 12:22:32 | 显示全部楼层
小二楼?
回复

使用道具 举报

发表于 2015-3-27 12:24:59 | 显示全部楼层
是清风!!!
支持~~ {:soso_e151:}
回复 支持 反对

使用道具 举报

发表于 2015-3-27 13:12:07 | 显示全部楼层
这太高深了,求把c++调用颜色面板的弄出来。
回复 支持 反对

使用道具 举报

发表于 2015-3-27 14:34:30 | 显示全部楼层
来支持大神的作品、
回复 支持 反对

使用道具 举报

发表于 2015-3-27 20:26:20 | 显示全部楼层
bucuobucuo
回复 支持 反对

使用道具 举报

发表于 2015-3-30 15:08:34 | 显示全部楼层
好东西
回复

使用道具 举报

发表于 2015-3-31 12:46:35 | 显示全部楼层
good,,up。。。
回复

使用道具 举报

发表于 2015-9-23 10:26:58 | 显示全部楼层
学习,谢谢分享!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

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

GMT+8, 2024-6-11 06:50 , Processed in 0.039009 second(s), 25 queries .

Powered by 海安简单软件服务部

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

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