【转】PB实现在通知区域添加图标

“为应用程序在任务栏通知区域加个图标,按最小化控制菜单后隐藏窗口,单击通知区域内的图标恢复并显示窗口,右击通知区域内的图标弹出快捷方式菜单”,已成为时下程序设计上的一个时髦主题,有不少文章介绍了如何实现,但在 PowerBuilder 下由于调用 Win32 API 函数和消息处理不很方便,因而很少有人去涉及。本文将讨论如何在 PowerBuilder 下使用任务栏通知区域。

 

 

1.相关的 Win32 API 函数

 

Win32 API 函数 Shell_NotifyIconA 是本文所涉 Win32 API 函数中最为关键者,通过它可以添删通知区域图标,其 Powersoft 原型为:

 

Function Boolean Shell_NotifyIconA(ULong dwMessage,stc_notifyicondata pnid) Library "Shell32.dll"

 

其中 stc_notifyicondata 是一个结构,其成员有:

 

Ulong cbSize // 结构大小为 88 字节

Ulong hWnd // 接受通知消息的窗口句柄

Ulong uID  // 通知区域图标的标识号

Ulong uFlags // 指示哪些成员是有效的

Ulong uCallbackMessage // 通知消息的标识号

Ulong hIcon // 图标的句柄

Char szTip[64] // 图标提示

Ulong dwState // 图标状态 (IE5)

Ulong dwStateMask // 状态掩码 (IE5)

Char szInfo[256] // balloon tooltip (IE5)

Ulong uTimeout // balloon tooltip 显示时间 (IE5)

Char szInfoTitle[64] // balloon tooltip 标题 (IE5)

Ulong dwInfoFlags // balloon tooltip 标志 (IE5)

uFlags 可以是 NIF_MESSAGE(1)、NIF_ICON(2)、NIF_TIP(4)、NIF_STATE(8) 和 NIF_INFO(16) 的组合。如 uFlags = 7 表示结构的 uCallbackMessage、hIcon 和 szTip 是有效的,其他的一些成员的值将被忽略。

 

由于此处涉及回调消息和图标,所以要用到另三个 Win32 API 函数,他们的 Powersoft 原型为:

 

Function UINT RegisterWindowMessageA(String lpString) Library "User32.dll" 

 

Function ULong LoadIconA(ULong hInstance,ULong lpIconName) Library "User32.dll"

 

Function Boolean DestroyIcon(ULong hIcon) Library "User32.dll"

 

函数 RegisterWindowMessageA 用来定义一个唯一的窗口消息,他的返回值被赋给 uCallbackMessage;函数 LoadIconA 用来加载一个图标,由于此处要加载 OEM 图标,所以声明 lpIconName 的类型为 Ulong 而不是String;函数 DestroyIcon 释放图标所占内存。

 

2.添删通知区域图标

 

为了便于演示,笔者将在 w_main 的 Open 事件中添加通知区域图标,在 Close 事件中删除状态区图标,最小化 w_main 时隐藏 w_main,单击通知区域内的图标时恢复并显示 w_main,右击通知区域内的图标时显示快捷方式菜单,即在整个程序运行过程中通知区域的图标始终存在。

 

笔者先声明一个实例变量:

 

stc_notifyicondata    istc_nid

 

添加通知区域图标

 

定义窗口 w_main 的 Open 事件脚本为:

 

w_main.Event Open( ) returns long

istc_nid.cbSize = 88 // 结构大小

istc_nid.hWnd = Handle(this) // w_main 句柄

istc_nid.uFlags = 7 // uCallbackMessage、hIcon 和 szTip 有效

istc_nid.uID = 0 // 通知区域图标的标识号

istc_nid.uCallbackMessage = RegisterWindowMessageA("Demo") // 定义消息

istc_nid.hIcon = LoadIconA(0, 32517) // 加载 Windows Logo 图标

istc_nid.szTip = "Demostration Application" // 提示

Shell_NotifyIconA(0, istc_nid)  // 添加图标

删除通知区域图标

 

定义窗口 w_main 的 Close 事件脚本为:

 

w_main.Event Close( ) returns long

Shell_NotifyIconA(2, istc_nid)  // 删除通知区域图标

DestroyIcon(istc_nid.hIcon) // 释放内存

最小化窗口时隐藏窗口

 

定义窗口 w_main 的 Resize 事件脚本为:

 

w_main.Event Resize( ) returns long

if SizeType = 1 then Hide()

3.处理通知消息

 

当用户在通知区域内的图标上移动鼠标、单击、双击或右击时,Shell 会用 uCallbackMessage 所指示的标识号向 hWnd 指定的窗口发送通知消息。一般来说通知消息的参数 lparam 是个指向结构的指针,不过幸好如果我们象示例一样只用到较早版本 Shell 的行为的话,lparam 就只是个鼠标事件的标识号而已。处理这样的消息只要用 w_main 窗口的 Other 事件即可,可定义脚本为:

 

w_main.Event Other(Ulong wParam, Long lParam ) returns long

// 参数 wParam 指示对应的通知区域图标的标识号;

// 参数 lParam 指示对应的消息类型(消息标识号)。

if Message.Number = istc_nid.uCallbackMessage and wParam = istc_nid.uID then // 判断消息是否是待处理的消息

    choose case lParam

        case 512  // 鼠标移动

        case 513  // 单击

            Show()

            WindowState=Normal!

        case 515  //双击

        case 516  //右击

            ShowSCMenu()

    end choose

end if

 

转载于:https://www.cnblogs.com/midu/archive/2012/09/04/2670553.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LeetCode]题解(python):058-Length of Last Word

题目来源: https://leetcode.com/problems/length-of-last-word/ 题意分析: 给出只包括大小写和空格的字符,输出最后一个单词的长度。 题目思路: 从最后一个字符开始搜索,如果字符非空格,则往前推一位&…

Oracle新手笔记(2) 关于Oracle 9i或9i以上版本客户端连接Oracle 8i及8i版本以下服务器端中文字符乱码的解决办法...

在做项目过程中,遇到Oracle 9i或9i版本以上客户端连接Oracle 8i及8i版本以下服务器端时,查询出来的中文数据全部变成了乱码。经查询资料终于解决了乱码问题。 开发工具是ASP.NET(C#) Oracle,使用System.Data.OracleCli…

mysql 5.7安装教程linux_Mysql5.7 Linux安装教程

1系统约定安装文件下载目录:/data/softwareMysql目录安装位置:/usr/local/mysql数据库保存位置:/data/mysql日志保存位置:/data/log/mysql执行如下命名:#mkdir /data/software#cd /data/software--下载安装包--建议&am…

如何将MATLAB程序发布为独立的不依赖MATLAB环境可执行的程序包(基于Matlab R2015b版 )

如何将MATLAB程序发布为独立的不依赖MATLAB环境可执行的程序包(基于MatlabR2015b版) 关键字:MatlabR2015b,可独立运行,可脱离Matlab环境,m文件,Matlab程序 如何将MATLAB程序.m文件发布为独立的不依赖MATLAB环境可执行的程序包。本文演示了基于…

[C#]利用键代码自动转换生成字母键或其它键信息

先上图说明目的: 有时需要将A到Z(或更多的键盘信息)放到一个组合框或其它控件中,可以用循环语句轻松搞定: using System.Collections .ObjectModel ;//引用泛型数组空间 namespace mouseclick1{ //返回26个字母的泛…

互联网产品跨部门沟通的10个原则(转)

摘要: 向对方重复沟通中的主要内容;利用澄清的方式提出不明白的内容;谈论重点议题时尽量不要打断对方讲话;对产品经理来说,跨部门沟通不良,可能会让他好不容易建立起来的自信瞬间摧毁。 你认为十万火急的事&#xff0c…

Windows7 支付宝证书安装方法

1.将UAC调到最低位置~Start-GettingStarted—Change UAC Settings,滑动条到最低,点击确定之后重启电脑~~(如果这一部不做的话,导致第二步无法完成) 2.设置IE8浏览器, tools -- internet options -- advanced 里面, 取…

让你的Tex代码更加美观就这么简单----Tex代码的自动格式化

用TeX编写文档,当文档比较长,结构复杂,公式众多时,感觉写的TeX文本非常凌乱,自己看起来都不舒服。 像C, C, C#, Java, Python, C#等程序设计语言的源代码都有代码自动格式化的功能,因此,TeX代码…

hdu 4279 Number

代码如有错,请指出 找规律题。。。 打的表如下: View Code n 满足有公因子且不整除的数的个数 满足为奇数的个数(要求的答案) 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 1 1 7 0 1 8 1 2 9 1 3 10 3 4 11 0 4 12…

中文TeX的编辑环境推荐

编写带有中文的TeX文档,个人认为使用TeXLive(目前版本为2016)作为TeX的编译环境支持。使用TeXStudio作为编辑器。特点是,这个组合编辑环境使用方便,有代码自动完成功能,TeXlive自带CTex,对中文支…

shell的简介

在计算机科学中,shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command.com。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言…

mysql 删除用户变量_MySql安装与MySQL添加用户、删除用户与授权

MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):1.新建用户1.1 登录MYSQL:>mysql -u root -p>密码1.2 创建用户:mysql> insert into mysql.user(Host,User,Password) values("localhos…

Python的正则表达式笔记

1. "先抓大再抓小": 遇到一个正则表达式无法一次性筛选出所需内容时, 可以先在一个范围内筛选第一次, 再在小范围中筛选第二次. 2. pattern re.compile(rREGEXP, re.S(ingle-line) | re.M(ulti-line)): 先编译正则表达式, re.S让.的作用范围包括换行符\n 3. re.sear…

关于LaTeX中的正文的字体大小

当我得知LaTeX文档中通过\documnetclass[12pt]{article}设置正文的字体大小只有3种值10pt,11pt,12pt,本人表示目瞪口呆!设置这3种值之外的其它值确实不起作用。难道真的是这样?请高手指点。

移动开发:iphone开发之触摸事件详解

转:http://blog.sina.com.cn/s/blog_8988732e01012eaf.html iPhoneOS中的触摸事件基于多点触摸模型。用户不是通过鼠标和键盘,而是通过触摸设备的屏幕来操作对象、输入数据、以及指示自己的意图。iPhoneOS将一个或多个和屏幕接触的手指识别为多点触摸序列…

如何复制mysql数据库_怎么复制mysql数据库到另一台电脑上?

有两种办法。1、在B机器上装mysql。将A机器上的mysql/data下的你的数据库目录整个拷贝下来。将B机器上的mysql服务停止。找到B机器上的mysql/data目录,将你拷贝的目录粘贴进去,然后启动mysql服务就可以了。2、使用SQL语句备份和恢复你可以使用SELECT INT…

每天一个linux命令(9):nl命令

nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。 1.命令格式: nl […

.net显示今天农历的代码

using System;using System.Globalization;//namespace Project.ChinaDate{///<summary>/// 显示今天农历类///</summary>publicclass CNDate{private DateTime m_Date; //今天的日期privatereadonlyint cny; //农历的年月日privateint cnm; //农历的年月日private…

mysql 修复模式_Mysql表修复

mysqlcheckmysqlcheck客户端可以检查和修复MyISAM表。它还可以优化和分析表。mysqlcheck的功能类似myisamchk&#xff0c;但其工作不同。主要差别是当mysqld服务器在运行时必须使用mysqlcheck&#xff0c;而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止…

Office Word界面和页面字体模糊不清的解决方案

最近在打开Word编辑文档时&#xff0c;发现了一个非常让人懊恼的现象&#xff0c;整个Word的界面和页面中的字体变得模糊不清&#xff0c;光标所到之处会短暂地局部变清晰&#xff0c;完全没法正常使用。 觉得很奇怪&#xff0c;以前一直能正常使用&#xff0c;为什么现在就出…