标题:一个很有用的系统托盘类的使用说明
只看楼主
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
结帖率:97.44%
已结贴  问题点数:20 回复次数:3 
一个很有用的系统托盘类的使用说明
下面这个systary类是vfp系统自带的。
..\Solution\Toledo\Systray.vcx

Systray 类
导言
快速启动
属性
方法
图标事件
气球提示事件
使用菜单

导言
Systray 类,位于 Samples\Solution\Toledo\ 文件夹,提供对在“任务栏通知区域”(通常称之为“系统托盘”)使用图标的支持。它支持鼠标事件和气球提示。某些功能(如气球提示),仅在操作系统支持它们时才被支持。通过外部计时器对象支撑,你可以建立一个动态的系统托盘图标。

Systray 类支持系统托盘图标的 Visual FoxPro 快捷菜单,因此你可以使用 Visual FoxPro 菜单设计器的全部功能。

使用操作系统,每个图标保持它们自己的通信路径。这意味着在同一应用程序中可以使用 Systray 类的多个实例,而不用担心这多个图标会互相干扰。

Systray 类不能被用于 DLL。如果该项目被编译,为使 Systray 正常工作它必须编译为 EXE (或 APP) 文件。

快速启动
Systray 类派生于 VFP Hyperlink 类。象其他任何可视类一样,允许将 Systray 类拖放到一个表单上。

将 Systray 类添加到一个表单后,该单独的属性常常需要设置的是:

IconFile  给图标文件提供完整的路径和文件名。
TipText  在鼠标移动到图标上时显示的提示文本。
MenuText  菜单定义串或 MPR 文件名。
MenuTextIsMPR  如果 MenuText 包含 MPR 文件名,则设置为.T.。

在对象被例示时默认行为被添加到系统托盘图标,并且在图标被鼠标左键或右键按钮点击时显示菜单。

Systray 类也可以不带表单使用,因此它可以提供应用程序单独的用户界面。例如,下列代码将一个图标添加到系统托盘,并且等待用户点击该图标。

x = NEWOBJECT('systray', 'systray.vcx')
x.IconFile     = HOME() + "Graphics\Icons\Misc\Question.ico"
x.TipText     = "任务栏图标示例"
x.MenuText     = "Systray_shortcut.mpr"
x.MenuTextIsMPR = .T.
x.AddIconToSystray()
READ EVENTS  && 等待用户输入。
上述代码假设在最少一个菜单项或一个单独的计时器对象,将执行 CLEAR EVENTS。

在 Systray 对象被释放时,它从系统托盘自动移去图标,并释放所有图标资源。

属性
AddIconToSystrayAtInit (逻辑型,默认值.T.)
在系统托盘对象被例示时,如果为真,并且 IconFile 属性指向一个有效的图标文件,则该图标被添加到“系统托盘”。

CurrentIconIndex (数值型)
用于该系统托盘项图标列表的索引。使用 AddIconToIconList() 方法来加载单独的图标。然后 CurrentIconIndex 可以被用来选择哪些图标被显示,或确定读取哪些图标为当前显示。请参见:SwitchIcon() 方法、AddIconToIconList() 方法。

IconFile (字符型,无默认值)
设置要显示的单个图标文件的完整路径和文件名。该图标文件可以被包含在一个编译的 EXE 或 DLL 文件中。

使用 IconFile 属性只可设置单一图标或初始图标。如果要使用活动的多个图标,可使用 AddIconToIconList() 方法。在例示后设置 IconFile 属性将触发 ClearIconList() 方法,释放所有前面加载的图标。

请参见:AddIconToIconList(), ClearIconList(), AddIconToSystray(), SwitchIcon()
MenuOffsetFromRight (数值型,默认值是 200 象素)
当任务栏停靠在屏幕右侧时,菜单位移的象素数目。仅在任务栏停靠在右面时可使用。

由于 Visual FoxPro 快捷菜单不能拖动到任务栏的顶部,当它被停靠在右面时,需要确认菜单不与任务栏重叠。设置 MenuOffsetFromRight 属性来调整快捷菜单的位置。

MenuText (字符型,无默认值)
包含定义菜单的文本,或包含 Visual FoxPro 菜单文件(.MPR)的路径和文件名,取决于 MenuTextIsMPR 属性的值。

如果 MenuTextIsMPR = .F. (默认值),然后 MenuText 应该包含每个菜单栏的 ID 数目和项文本。在 MenuText 串中的项应该用分号隔开。例如:

Systray.MenuText = 1; This is bar one; 2; This is bar two <pre>
默认情况,在图标被点击时,用 MenuText 属性定义的菜单被显示。在菜单被点击或通过点击外部菜单被清除时,该 ProcessMenuEvent()
方法被调用,带有一个包含被选定项的数字 ID 的参数。因此用上述 MenuText 例子,如果用户点击该栏两次,则 ProcessMenuEvent()
将被调用,并且该参数将是数值 2。如果用户在清除菜单时没有选择项,则 ProcessMenuEvent 参数是 0。


如果 MenuTextIsMPR = .T.,那么 MenuText 属性应包含 Visual FoxPro 快捷菜单(.MPR)的完整路径和文件名。当 MenuTextIsMPR = .T.
时,ProcessMenuEvent()
方法不被调用。


请参见:ShowMenu(),ProcessMenuEvent(),IconClickEvent(), IconRightClickEvent(),MenuTextIsMPR,MenuOffsetFromRight

MenuTextIsMPR (逻辑型,默认值.F.)

指定 MenuText 属性是否说明 Visual FoxPro 快捷菜单文件(.MPR)的路径和文件名,或弹出生成的简易菜单说明数字记号和栏文本。


请参见:MenuText,ShowMenu()

TipText (字符型,无默认值)

当用户将鼠标指针移动到系统托盘的图标上时,显示该文本。在 Windows 98、Windows NT4 和早期版本限制为 63 个字符(不带换行)。在
Windows ME、Windows 2000/XP 和以后的操作系统,限制为 127 个字符(允许带换行)。


方法

AddIconToIconList(cIconFileName)

加载图标资源,并将其添加到一个内部的图标列表。如果不需要变动或动态图标,可用 IconFile 属性代替。cIconFileName
参数应包含有效图标文件的完整路径和文件名。该图标文件可以包含进编译的 exe 或 dll 文件。在图标被添加到图标列表后,SwitchIcon() 和 CurrentIconIndex
属性可用来更改显示在系统托盘的图标。你也可以仅通过更改 IconFile
属性来更改图标。但如果图标经常被更改,使用图标列表将提供更高的性能,因为图标源只需要加载一次。


AddIconToSystray()

将图标添加到系统托盘(任务栏通知区域),并启用所有图标事件。如果 AddIconToSystrayAtInit 属性为.T.(真)并且 IconFile
属性指向一个有效的图标文件,在 Systray 对象被例示时自动发生。


ClearIconList()

从图标列表中移去全部图标,并从系统托盘移去显示的图标。


GetShellVersion()

返回 Windows Shell 的版本号。用于内部确定通过操作系统支持哪个功能。

在 Windows 98 返回 4.xx。不支持气球提示。

在 Windows 2000 返回 5.0。支持气球提示,但无气球事件。

在 Windows ME 返回 5.5。完全支持气球提示。

在 Windows XP 返回 6.0。完全支持气球提示。


GetTaskbarPosition()

用于内部确定菜单需要显示在何处。

返回:

0 = 任务栏停靠在屏幕底部。

1 = 任务栏停靠在左面。

2 = 任务栏停靠在屏幕顶部。

3 = 任务栏停靠在右面。


IconClickEvent(), IconRightClickEvent(), IconMiddleClickEvent(),
IconDblClickEvent()

参见下面图标事件的论述。


ProcessMenuEvent(nMenuItemID)

在快捷菜单被用户清除后该事件被 Systray 调用,通过从该菜单选择一个项或通过点击外部菜单输入。它仅发生在 MenuTextIsMPR 属性为.F.(假),并且无参数被传递到 ShowMenu()
方法。


如果用户从该菜单选定一个项,该参数将被菜单项 ID 号码作为在 MenuText
属性中指定的。如果用户通过点击外部菜单或将焦点更改到另一个窗口来清除该菜单,该属性将为 0 (零)。


请参见:MenuText,MenuTextIsMPR,ShowMenu()

RemoveIconFromSystray()

从系统托盘移去图标。在 Systray 对象释放时被自动调用,因此该方法很少被使用。


请参见:AddIconToSystray(),ClearIconList()

SetForeGroundWindow([hWnd])

使用于内部,仅展示多功能性。hWnd 参数是该窗口构成前景窗口的系统窗口句柄。如果不提供 hWnd,则表单包含 Sytray
类,如果它在一个表单上,则带前景。


ShowBalloonTip(cBalloonText [, cBalloonTitle [, nStandardIcon [, nTimeOut]]])

依靠操作系统支持,在图标附近显示一个气球提示。Windows ME、Windows 2000、Windows XP 和以后的操作系统支持气球提示。Windows 2000
不支持气球事件,但在 Windows ME/XP,可以接收到通过 BalloonClickEvent()、BalloonTimeoutEvent()、BalloonShowEvent()
和 BalloonHideEvent() 方法的事件。


参数:


cBalloonText (字符型,必需) 在气球中的显示文本,长度最多为 255
个字符。可包含换行符。设置一个空串来清除现有的气球。


cBalloonTitle (字符型,可选,默认值 0) 显示为气球标题的文本,长度最多为 63 个字符。设置一个空串为无标题。


nStandardIcon (数值型,可选,默认值 0) 显示标准图标的数字ID。0 = 无图标,1 = 信息,2 = 警告,3 = 错误。


nTimeOut (数值型,可选,默认值0) 显示气球的时间长度,以秒计。该暂停时间受操作系统最小和最大值的限制,通常分别为10 和30
秒。该暂停时间也取决于用户的动作。如果鼠标和键盘被空闲,则暂停周期将被延长。


在 Windows XP,调用 ShowBalloonTip() 将释放任何现有的联合这个图标的气球提示。在早期的操作系统,该同样的图标气球将列队等待。


在任何时候只有一个汽球提示可以显示,因此操作系统需要列队请求气球提示。当你的应用程序调用 ShowBalloonTip()
方法时,如果另一个应用程序显示气球提示,那么你的气球提示将要等到前面的气球最小暂停时间终止为止。在支持气球事件的操作系统中,当你的气球已经显示时,可以添加代码到 BalloonShowEvent()
方法来进行探测。


请参见:BalloonClickEvent(),BalloonTimeoutEvent(),
BalloonShowEvent(),BalloonHideEvent()

ShowMenu([cMPRFileName [, p1 [, p2 [, p3 [, p4 [, p5 [, p6]]]]]]])
方法

在系统托盘图标附近显示一个快捷菜单。如果没有指定参数,ShowMenu 使用MenuText 和 MenuTextIsMPR
属性的内容来定义显示的菜单。使用 ShowMenu() 参数来覆盖 MenuText 的内容,并将参数(按引用)传递到该菜单程序(.MPR)。


参数:


cMPRFileName (字符型,可选) 定义 Visual FoxPro 快捷菜单 MPR 文件的名称。如果没有提供该参数,则 MenuText
和 MenuTextIsMPR 属性的内容被用于定义该菜单。


p1 - p6 (任何数据类型,可选)
指定在 cMPRFileName 中传递(按引用)到 MPR 文件的参数。如果 cMPRFileName 是空的或无效的,这些参数将被忽略。在它的 Setup
代码中,该菜单定义必须有一个 PARAMETERS 语句。


SwitchIcon()

显示图标列表中的下一个图标,并返回当前显示图标的数字索引。例如,如果用 AddIconToIconList() 方法加载了三个图标,并且图标#1
是当前显示的,则调用 SwitchIcon() 将显示图标#2。如果在列表中最后的图标是当前显示的,则调用 SwitchIcon() 将显示图标#1。读取 CurrentIconIndex
属性来确定哪个图标是当前显示的。


请参见:AddIconToIconList(),CurrentIconIndex,IconFile

图标事件

在图标事件发生时,下列方法被 Systray 调用。这些方法不接收参数。


IconClickEvent()

在用户用鼠标左键点击图标时调用该方法。默认行为是调用 ShowMenu() 方法来显示菜单。这个行为可以简单通过在子类的系统托盘对象的 IconClickEvent  
方法中引进代码来覆盖。


IconRightClickEvent()

在用户用鼠标右键点击图标时调用该方法。默认行为是调用 ShowMenu() 方法来显示菜单。这个行为可以简单通过在子类的系统托盘对象的 IconRightClickEvent
方法中引进代码来覆盖。


IconMiddleClickEvent()

在用户用鼠标中间键(或滚轮)点击图标时调用该方法。无默认行为。


IconDoubleClickEvent()

在用户用鼠标任何键双击图标时调用该方法。在 Windows
ME/XP 和以后的版本,在发送 Double-click 事件后,系统直接发送第二个 Click 事件。



在单击和双击事件中支持行为是困难的,由于在 Cilck 事件中创建一个模式环境(如显示菜单)可以从事件中防止
Double-click。一个通常的使用选择是在右键点击事件时仅显示菜单。



参见对单击和双击行为使用提供清除支持的外部计时器对象示例的 Systray 示例表单。


气球提示事件

在 Systray 接收到“气球”(Balloon)
事件时,下列方法被它调用。


BalloonClickEvent()

在用户点击气球提示时或在气球提示显示时点击图标,被调用。该气球事件仅被 Windows ME/XP
和以后的版本的操作系统支持。


BalloonShowEvent()

在气球提示被操作系统显示时被调用。由于气球提示被系统列队,在 ShowBalloonTip() 方法被调用后,该事件发生可能要几秒钟。该气球事件仅被 Windows ME/XP
和以后的版本的操作系统支持。


BalloonTimeoutEvent()

在气球由于超时被清除,或用户在气球提示上点击关闭按钮被释放时调用。该气球事件仅被 Windows ME/XP
和以后的版本的操作系统支持。


BalloonHideEvent()

在气球提示由于其他原因隐藏时被调用,例如图标被从系统托盘中移去。该气球事件仅被 Windows ME/XP
和以后的版本的操作系统支持。


使用菜单

用 Systray 类有三种使用菜单的方法。在三个已知的选项中,可确定对你的应用程序最适合的一个。


选项1: MenuTextIsMPR = .F., 并且无参数传递到 ShowMenu()

这是用 Systray 类使用菜单最简单的方法。用数字标记和文本定义一个菜单,并将其放置到 MenuText 属性中。
通过选择一个项或点击外部菜单后,该菜单已经被用户清除,Systray 调用 ProcessMenuEvent() 方法,传递用户选定的菜单项数字标记。


oSystray = CREATEOBJECT("MenuSample1")
READ EVENTS

DEFINE CLASS MenuSample1 AS Systray OF Systray.VCX

    IconFile = HOME() + "Graphics\Icons\Misc\Face02.ico"
    TipText = "菜单示例#1"
    MenuText = "1;显示状态; 2;退出应用程序"

    PROCEDURE ProcessMenuEvent
        LPARAMETERS nMenuItemID
        DO CASE
            CASE nMenuItemID = 0
                * 用户清除该菜单。未执行操作。
            CASE nMenuItemID = 1
                * 显示状态
                MESSAGEBOX("Status")
            CASE nMenuItemID = 2
                * 退出应用程序
                THIS.RemoveIconFromSystray()
                CLEAR EVENTS
        ENDCASE
    ENDPROC
ENDDEFINE



选项2: MenuTextIsMPR = .T., 并且无参数传递到 ShowMenu()

如果 MenuTextIsMPR 为“真”,那么 MenuText 属性应该包含生成 Visual FoxPro 菜单文件(.MPR)的路径和文件名。Systray
对象然后执行 MPR 代替生成的弹出菜单。这样允许你使用 Visual FoxPro 菜单的所有功能,包括子菜单、图标、失效项等等。



在 MPR 文件运行后,ProcessMenuEvent() 方法未获调用。


oSystray = CREATEOBJECT("MenuSample2")
READ EVENTS

DEFINE CLASS MenuSample2 AS Systray OF Systray.VCX
    IconFile = HOME() + "Graphics\Icons\Misc\Face03.ico"
    TipText = "菜单示例#2"
    MenuText = "Systray_shortcut.mpr"
    MenuTextIsMPR = .T.
    * 菜单代码的所有工作将完成,因而在此没有更多的代码。
    * 对于该示例,确认至少有一个菜单项执行 CLEAR EVENTS。
ENDDEFINE

选项3: 将参数传递到 ShowMenu() 方法。

通过传递 MPR 的文件名到 ShowMenu() 方法,覆盖 MenuText 属性的内容。这个也允许传递参数(按引用)到菜单,并在 ShowMenu()
方法返回时检查这些参数的内容。



在前面的例子中,请注意我们没有添加任何显示菜单的代码。默认情况,只要用户点击或右键点击图标,该菜单就会显示。该默认行为可以通过覆盖 IconClickEvent
和 IconRightClick 来封锁,如这个示例中展示的。


oSystray = CREATEOBJECT("MenuSample3")
READ EVENTS

DEFINE CLASS MenuSample3 AS Systray OF Systray.VCX
    IconFile = HOME() + "Graphics\Icons\Misc\Face03.ico"
    TipText = "菜单示例#3"

    PROCEDURE IconClickEvent
        LOCAL lcUserChoice
        lcUserChoice = "Unchanged" && 初始化变量。

        THIS.ShowMenu("Systray_Shortcut.mpr", @lcUserChoice)

        * ShowMenu() 已经返回,因此菜单已经被点击或清除。
        DO CASE
            CASE lcUserChoice == "Unchanged"
                * 没有选择项,用户清除的菜单。
                * 未执行操作。
            OTHERWISE
                * 执行用户选定的动作。
                WAIT WINDOW lcUserChoice NOWAIT
        ENDCASE
    ENDPROC

    PROCEDURE IconRightClickEvent
        * 在右键点击事件的动作上复制。
        THIS.IconClickEvent
    ENDPROC
ENDDEFINE




搜索更多相关主题的帖子: 属性 菜单 显示 图标 方法 
2023-01-04 13:33
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:7 
感谢分享
2023-01-04 13:57
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:7 
谢谢分享!
2023-01-05 06:44
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:7 
谢谢分享!
2023-01-05 08:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511048-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.102010 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved