第十一章:设计菜单与工具栏

菜单工具栏为用户提供了一个结构化的、可访问的途径,便于使用应用程序中的命令和工具。恰当的计划并设计菜单和工具栏,将使应用程序的主要功能得以体现,用户也不会在使用应用程序时受挫。

有关定制 Visual FoxPro 工具栏的详细内容,请参阅《安装指南》中的第三章“配置 Visual FoxPro”

本章内容要点:

在应用程序中使用菜单

用户在查找信息之前,首先看到的便是菜单。如果把菜单设计得很好,那么只要根据菜单的组织形式和内容,用户就可以很好地理解应用程序。为此,Visual FoxPro 提供了“菜单设计器”,可以用来创建菜单,提高应用程序的质量。

Visual FoxPro 应用程序的每一部分都可以有自己的菜单系统。下面将说明创建菜单系统的方法,但没有说明如何将菜单系统融合到应用程序中去。有关在应用程序中添加菜单的详细内容,请参阅第十三章“编译应用程序”

以下各节的主要内容有:

创建菜单系统

创建菜单系统的大量工作是在“菜单设计器”中完成的,在那里可创建实际的菜单、子菜单和菜单选项。

菜单设计器

创建一个菜单系统包括若干步骤。不管应用程序的规模多大,打算使用的菜单多么复杂,创建菜单系统都需以下步骤:

规划菜单系统

应用程序的实用性一定程度上取决于菜单系统的质量。花费一定时间规划菜单,有助于用户接受这些菜单,同时也有助于用户对这些菜单的学习。

在设计菜单系统时,请考虑下列准则:

创建菜单、快捷菜单、菜单项和子菜单

规划好菜单系统之后,就可以使用菜单设计器创建该系统了。这时,您可以创建菜单、快捷菜单、菜单项、子菜单和菜单项组之间的分隔线等等。以下各节将对此作详细介绍。

创建菜单

要新建菜单,可以定制已有的 Visual FoxPro 菜单系统,也可以开发您自己的菜单系统。若要从已有的 Visual FoxPro 菜单系统开始创建菜单,则可以使用“快速菜单”功能。

若要用“快速菜单”创建菜单系统

  1. 请从“项目管理器”中选择“其他”选项卡,再选择“菜单”,然后选择“新建”。

  2. 选择“菜单”。

    此时出现“菜单设计器”。

  3. 从“菜单”菜单中,选择“快速菜单”命令。

    现在,“菜单设计器”中包含了关于 Visual FoxPro 主菜单的信息。

    使用“快速菜单”功能创建的菜单系统

  4. 通过添加或更改菜单项定制菜单系统。

    例如,如果要在“帮助”菜单前插入“Customer”菜单,可以选择与“帮助”菜单相关的移动钮,再选择“插入”按钮,然后在“菜单名称”栏中键入“Customer”。其结果如下:

    定制的菜单系统

提示 拖动移动钮可以改变菜单栏上各菜单的位置。

如果需要“帮助”菜单,应将它安排在菜单栏上的最后,这样用户能够很快找到它。

在应用程序中使用菜单之前,必须先生成它。

若要生成一个菜单

Visual FoxPro 提示将菜单系统以 .mnx 为文件扩展名保存。该文件是一个表,存储与菜单系统有关的所有信息。在保存菜单系统之后,Visual FoxPro 提示一个带有 .mpr 扩展名的输出文件。此文件将包含已生成的菜单程序。

创建快捷方式菜单

控件对象上单击右键时,就会显示快捷方式菜单,可以快速展示当前对象可用的所有功能。可用 Visual FoxPro 创建快捷方式菜单,并将这些菜单附加在控件中。例如,可创建包含“剪切”、“复制”和“粘贴”命令的快捷方式菜单,当用户在表格控件所包含的数据上单击右键时,将出现快捷方式菜单。

若要创建快捷方式菜单

  1. “项目管理器”中选择“其他”选项卡,选择“菜单”,并选定“新建”。

  2. 选择“快捷菜单”。

    则出现“快捷菜单设计器”。

进入“快捷菜单设计器”后,添加菜单项的过程与创建菜单完全相同。

有关快捷方式菜单的示例,请运行在 Visual FoxPro 的 Visual Studio …\Samples\Solution\Vfp98\Solution 目录下的 Solution.app。

创建 SDI 菜单

SDI 菜单是出现在单文档界面 (SDI) 窗口中的菜单。若要创建 SDI 菜单,必须在设计菜单时指出该菜单用于 SDI 表单。除此之外,创建 SDI 菜单的过程与创建普通菜单完全相同。

若要创建 SDI 菜单

创建菜单项

菜单创建好后,可以在菜单上设置菜单项。每个菜单项都表示了一个您希望用户执行的 Visual FoxPro 命令或过程,菜单项也可以包含子菜单,用以提供其他菜单项。

若要向菜单中添加菜单项

  1. 请在“菜单名称”栏中,选择要添加的菜单项的菜单标题。

  2. 在“结果”框中,选定“子菜单”命令。

    “创建”按钮出现在列表的右侧。

  3. 选定“创建”按钮。

    出现一个空的设计窗口。在此窗口中,输入菜单项。

  4. 在“菜单名称”栏中,键入新建的各菜单项的名称。

创建子菜单

对于每个菜单项,都可以创建包含其他菜单项的子菜单。

若要创建子菜单

  1. 请在“菜单名称”栏中,选择要添加子菜单的菜单项。

  2. 在“结果”框中,选择“子菜单”。

    此时“创建”按钮会出现在列表的右侧。如果已经有了子菜单,则此处出现的是“编辑”按钮。

  3. 选择“创建”或“编辑”。

  4. 在“菜单名称”栏中,键入新建的各菜单项的名称。

以编程方式添加菜单

一般用“菜单设计器”创建菜单和菜单项,但也可以使用 Visual FoxPro 命令创建。例如,创建菜单可使用 DEFINE PAD 命令,创建子菜单可使用 DEFINE POPUP 命令,而在子菜单上创建菜单项则可以使用一组 DEFINE BAR 命令。

菜单项分组

为增强可读性,可使用分隔线将内容相关的菜单项分隔成组。例如,在 Visual FoxPro 的“编辑”菜单中,就有一条线把“撤消”及“重做”命令与“剪切”、“复制”、“粘贴”、“选择性粘贴”和“清除”命令分隔开。

分组后的各菜单项

若要对菜单项分组

  1. 在“菜单名称”栏中,键入“\-”,便可以创建一条分隔线。

  2. 拖动“\-”提示符左侧的按钮,将分隔线移动到正确的位置。

将菜单另存为 HTML

创建菜单时,使用“文件”菜单上的“另存为 HTML”命令可以将菜单内容另存为一个 HTML (超文本标记语言)文件。

若要将菜单另存为 HTML

  1. 打开菜单。

  2. 选取“文件”菜单上的“另存为 HTML”命令(如果修改了菜单,系统将询问是否保存此修改)。

  3. 单击对话按钮,输入要创建的 HTML 文件名称,然后选择“保存”按钮。

在应用程序中包含菜单

创建了菜单系统后,可将其包含在应用程序中。

若要在应用程序中包含菜单

将快捷方式菜单附加到控件中

创建并生成了快捷方式菜单以后,就可将其附加到控件中。当用户在控件上单击鼠标右键时,显示典型的快捷方式菜单。在控件的 right-click 事件中输入少量代码即可将快捷方式菜单附加到特定的控件中。

  1. 选择要附加快捷方式菜单的控件。

  2. “属性”窗口中,选择“方法程序”选项卡并选择“RightClick Event”。

  3. 在代码窗口中,键入 DO menu.mpr,其中 menu 是快捷方式菜单的文件名。

    注释 引用快捷方式菜单时,必须使用 .mpr 作为扩展名。

将 SDI 菜单附加到表单中

创建了 SDI 菜单后,可将其附加到 SDI 表单中。另外必须:

若要将 SDI 菜单附加到表单中

  1. “表单设计器”中,将表单的 ShowWindow 属性设置为“2 – 作为顶层表单”。

  2. 在表单的 Init 事件中,调用该菜单。

    例如,假设菜单名为 SDIMENU.mpr,添加此代码:

    DO SDIMENU.mpr WITH THIS,.T.
    

为菜单系统指定任务

在创建菜单系统时,需要考虑系统访问的简便性,也必须为系统指定任务。必须为菜单和菜单项指定所执行的任务,如显示表单工具栏以及其他的菜单系统。应该定义可以访问菜单系统的访问键,还可以添加键盘快捷键,并且控制菜单何时可用。

指定访问键

设计良好的菜单都具有访问键,从而通过键盘可以快速地访问菜单的功能。在菜单标题或菜单项中,访问键用带有下划线的字母表示。例如,Visual FoxPro 的“文件”菜单使用“F”作为访问键。

如果没有为某个菜单标题或菜单项指定访问键,Visual FoxPro 将自动指定第一个字母作为访问键。例如,先前创建的“Customer”菜单并没有定义访问键,因此,Visual FoxPro 指定第一个字母(C)作为它的访问键。

具有访问键的菜单

若要为菜单或菜单项指定访问键

疑难解答 如果菜单系统的某个访问键不起作用,则可查看是否有重复的访问键。

指定键盘快捷键

除了指定访问键以外,还可以为菜单或菜单项指定键盘快捷键。和使用访问键一样,使用键盘快捷键是让您在按下某个键的同时,再按另一个键而选择菜单或菜单项。访问键与键盘快捷键的区别是:使用快捷键可以在不显示菜单的情况下选择此菜单中的一个菜单项。

Visual FoxPro 菜单项的快捷键一般用 CTRL 或 ALT 键与另一个键相组合。例如,按 CTRL+N 可在 Visual FoxPro 中创建新文件。

若要为菜单或菜单项指定快捷键

  1. 请在“菜单名称”栏中,选择相应的菜单标题或菜单项。

  2. 选择“选项”栏中的按钮,显示“提示选项”对话框。

  3. 在“键标签”框中,按下一组合键,可创建快捷键。

    如果一个菜单项没有快捷键,Visual FoxPro 将在“键标签”框中显示“按下要定义的键”。

  4. 在“键说明”框中,添加您希望在菜单项的旁边出现的文本。

    默认情况下,Visual FoxPro 在“键说明”框中重复“键标签”框的快捷键标记。不过,如果希望在应用程序中显示其他内容,也可以更改“键说明”框中的文字。例如,如果“键标签”和“键说明”均为“CTRL+R”时,您可以将“键说明”更改为“^R”。

    注释 CTRL+J 是无效的快捷键,因为在 Visual FoxPro 中,经常将其作为关闭某些对话框的快捷键。

启用和废止菜单项

可以根据逻辑条件启用或废止菜单及菜单项。

若要启用或废止菜单及菜单项

  1. 在“菜单名称”栏中,选择相应的菜单标题或菜单项。

  2. 选择“选项”栏中的按钮,显示“提示选项”对话框。

  3. 选择“跳过:”生成器按钮。

    出现“表达式生成器”。

    “表达式生成器”对话框

  4. 在“跳过”框中,键入表达式,此表达式将用于确定是启用菜单或菜单项,还是废止菜单或菜单项。

    如果此表达式取值为“假”(.F.),则启用菜单或菜单项。如果此表达式取值为“真”(.T.),则废止菜单或菜单项。有关详细内容,请参阅 DEFINE BARDEFINE PAD 主题。

    注释 显示菜单系统后,可以使用 SET SKIP OF 命令启用或废止菜单及菜单项。

标记菜单项的状态

在菜单中,如果菜单项左边有一个复选标记,则表明此菜单项对应的功能正在使用。例如,如果在前面创建的“Customer”菜单上的“Credit”菜单项左边设置了复选标记,则表示正在使用“Credit”功能。

在运行时,可以使用 SET MARK OF 命令在菜单项旁边设置复选标记。

有关废止与标记菜单项状态的示例,请运行 Visual FoxPro 的 Visual Studio …\Samples\Vfp98\Solution 目录中的Solution.app。

为菜单或菜单项指定任务

选择一个菜单或菜单项,将执行相应的任务,如显示表单工具栏或另一个菜单系统等等。要执行任务,菜单或菜单项就必须执行一个 Visual FoxPro 命令。此命令可以是一条语句,也可以是一个过程调用。

提示 如果预计在若干个地方都会使用同样一组命令,则应编写一个过程。该过程必须在菜单清理代码或其他菜单、对象能引用的位置明确命名和编写。

使用命令完成任务

要执行任务,可以为菜单或菜单项指定一个命令。此命令可以是任何有效的 Visual FoxPro 命令,包括对程序和过程的调用,其中的程序要在指定的路径上,过程则应该在“常规选项”对话框的“清理”选项中定义。有关详细内容,请参阅本章稍后的“为菜单系统创建默认过程”

若要为菜单或菜单项指定命令

  1. 在“菜单名称”栏中,选择相应的菜单标题或菜单项。

  2. 在“结果”框中,选择“命令”。

  3. 在“结果”框右侧的框中,键入正确的命令:

    为菜单指定命令

如果该命令调用了菜单的清理代码中的一个过程,请使用具有以下语法DO 命令:

DO procname IN menuname

在上面的语法中,menuname 指定过程的位置,代表菜单文件名,并有 .mpr 的扩展名。如果 menuname 没有指定菜单的位置,而在该菜单的清理代码中有该过程的定义,则必须使用 SET PROCEDURE menuname.mpr 命令指定此过程的位置。

显示表单和对话框

在菜单或菜单项上,使用命令或过程可以显示编译过的表单或对话框。例如,要显示名为 Orders 的表单,可使用下列命令:

DO FORM Orders

提示 要创建一个菜单或菜单项,用它显示表单或对话框,请在提示的后面放置三个点,表示需要用户进一步输入信息。

菜单项之后的点表示需要用户进一步输入信息

显示工具栏

如果在应用程序中创建了自定义工具栏,则可以从菜单或菜单项中调用此工具栏,将它显示出来。有关详细内容,请参阅本章稍后的“创建自定义工具栏”

使用过程完成任务

可以为菜单或菜单项指定一个过程。指定过程的方式取决于菜单或菜单项是否有子菜单。

若要为不含有子菜单的菜单或菜单项指定过程

  1. 请在“菜单名称”栏中,选择相应的菜单标题或菜单项。

  2. 在“结果”框中,选择“过程”。

    “创建”按钮出现在列表的右侧。如果先前已定义了一个过程,则这里出现的是“编辑”按钮。

  3. 选择“创建”或“编辑”。

    为不含有子菜单的菜单指定过程

  4. 在窗口中键入正确的代码。

    注释 由于 Visual FoxPro 会自动地生成 PROCEDURE 命令,因而不必在过程编辑窗口中键入此命令。只有在清理代码中才需要 PROCEDURE 命令。

若要为含有子菜单的菜单或菜单项指定过程

  1. 请在“菜单级”框中,选择包含相应菜单或菜单项的菜单级。

  2. 从“显示”菜单中,选择“菜单选项”菜单项。

    Visual FoxPro 显示“菜单选项”对话框。

    为含有子菜单的菜单指定过程

  3. 可以用下列方法之一指定一个过程:

向菜单系统添加初始化代码

向菜单系统添加初始化代码可以定制菜单系统。初始化代码可以包含创建环境的代码、定义变量的代码、打开所需文件的代码以及使用 PUSH MENUPOP MENU 保存或恢复菜单系统的代码。

若要向菜单系统中添加初始化代码

  1. 从“显示”菜单中选择“常规选项”。

  2. 在“菜单代码”区域,选择“设置”,然后再选择“确定”。

  3. 在初始化代码窗口中,键入适当的初始化代码。

    关闭“菜单设计器”时,同时保存所做的变更。

向菜单系统添加清理代码

向菜单系统添加清理代码可以减小菜单系统的大小。清理代码中常包含这样一些代码,它们在初始时启用或废止菜单系统中的菜单或菜单项。在生成并运行菜单程序时,初始化代码及菜单定义代码在清理代码之前执行。

若要向菜单系统添加清理代码

  1. 从“显示”菜单中,选择“常规选项”。

  2. 在“菜单代码”区域,选择“清理”,然后再选择“确定”。

  3. 在代码窗口中,键入正确的清理代码。

    关闭“菜单设计器”时,同时保存所做的变更。

提示 如果您设计的菜单是应用程序的主菜单,则应该在清理代码中包含 READ EVENTS 命令,并为退出菜单系统的菜单命令指定一个 CLEAR EVENTS 命令。这可以防止应用程序的运行过早地中断。

在运行时刻控制菜单

每个 Visual FoxPro 菜单都有两个名称,而每个菜单项都有一个名称与一个编号。Visual FoxPro 在用户界面上使用一个名称,而在生成的菜单程序 (.mpr) 中使用另一个名称或编号。可使用这些名称和编号在运行时刻引用和控制菜单及菜单项。如果在创建菜单和菜单项时没有指定名称或编号,在生成菜单程序时 Visual FoxPro 将会创建名称和编号。

有关运行时刻添加和删除菜单的示例,可参阅 Visual FoxPro 的 VISUAL STUDIO …\SAMPLES\VFP98\SOLUTION 目录下的 Solution.app。

注意 应该避免在代码中使用 Visual FoxPro 提供的主菜单名或菜单项编号,因为每次生成菜单程序时,它们都有可能会改变。因此,如果引用了提供的名称或编号,代码运行时可能会失败。

“菜单设计器”中,“菜单名称”栏中的内容出现在用户界面上,而“结果”框右栏中的内容则出现在生成程序中。

在生成的菜单程序中使用主菜单名引用一个菜单标题

在生成的菜单程序中使用菜单项编号引用一个菜单项

若要为菜单标题指定名称

  1. 请在“菜单名称”栏中,选择相应的菜单标题。

    注释 “结果”栏必须显示“命令”、“子菜单”或“过程” -- 而不是“填充名称”(主菜单名)。

  2. 选择“选项”栏中的按钮,显示“提示选项”对话框。

  3. 在“主菜单名”框中键入您选择的主菜单名。

  4. 选择“确定”返回“菜单设计器”。

若要为菜单项指定编号

  1. 请在“菜单名称”栏中,选择相应的菜单项。

    注释 “结果”栏中必须显示“命令”、“子菜单”或“过程” -- 而不能是“菜单项 #”。

  2. 选择“选项”栏中的按钮,显示“提示选项”对话框。

  3. 在“菜单项”框中,键入您选择的编号。

  4. 选择“确定”返回“菜单设计器”。

    提示 如果使用的是“快速菜单”功能,则不要更改 Visual FoxPro 为系统菜单或菜单项提供的名称或编号;否则,运行生成的菜单程序时,可能会得到无法预料的结果。

创建自定义工具栏

如果应用程序中包含一些用户经常重复执行的任务,那么可以添加相应的自定义工具栏,简化操作,加速任务的执行。例如,如果用户要经常从菜单中选择打印报表命令,则最好能提供带有打印按钮的工具栏,从而简化这项操作。

下面各节介绍的是为应用程序创建自定义工具栏的方法。 有关定制 Visual FoxPro 提供的工具栏的详细内容,请参阅“定制工具栏”对话框”

以下各节的主要内容有:

定义工具栏类

如果要创建一个工具栏,它要包含已有工具栏所没有的按钮,则可通过定义一个自定义工具栏完成此任务。Visual FoxPro 提供了一个工具栏基类,在此基础上,您可以创建所需的类。

定义了工具栏类以后,可向工具栏类添加对象,并为自定义工具栏定义属性、事件和方法程序。最后可将工具栏添加到表单集中。

若要定义一个自定义工具栏的类

  1. “项目管理器”中,选定“类”,然后选择“新建”按钮。

  2. 在“类名”框中,键入新类的名称。

  3. 从“派生于”框中,选择“Toolbar”,以使用工具栏基类。

    – 或者 –

    选择对话按钮,以便选择其他工具栏类。

  4. 在“存储于”框中,键入类库名,保存创建的新类。

    – 或者 –

    选择对话按钮,以便选择一个已有的类库。

  5. 在新建的工具栏类中添加对象。

例如,可以将派生于工具栏基类的 printing 类存储在 inventory 类库中。

在“新建类”对话框中创建一个新类

“新建类”对话框结束后,“类设计器”便显示出来。

在“类设计器”中的一个新建的自定义工具栏

可用下列任何一种操作定义工具栏类:

在自定义工具栏类中添加对象

创建好了一个自定义工具栏后,便可以在其中添加对象,只要是 Visual FoxPro 支持的对象就可以。例如,可以从“控件”工具栏添加对象。

若要将对象添加到自定义工具栏类中

  1. 请打开一个类库,其中应该包含了要添加对象的自定义工具栏类,打开这个类。

  2. “表单控件”工具栏上,选择所要添加的对象。

  3. 选择自定义工具栏,将对象放置在自定义工具栏上。

  4. 重复执行步骤 2 和 3,直至完成自定义工具栏。

  5. 如果需要的话,可以重新调整自定义工具栏上的对象。

例如,可以调整对象大小,拖动对象以更改其位置,按 DELETE 键删除对象,或在对象之间插入“表单控件”工具栏上的分隔符对象,增加对象间的空格。

注释 每次只能移动一个对象。

  1. 在“属性”窗口中,设置工具栏的属性。

  2. 保存自定义工具栏类。

提示 设置工具栏按钮的 Picture 属性,可以给按钮添加位图或图标。

在表单集中添加自定义工具栏

在定义一个工具栏之后,便可以用这个类创建一个工具栏。可以用“表单设计器”或者用编写代码的方法将工具栏与表单对应起来。

在“表单设计器”中协调工具栏和表单

可以在表单集中添加工具栏,让工具栏与表单集中的各个表单一起打开。但不能直接在某个表单中添加工具栏。

若要使用“表单设计器”在表单集中添加工具栏

  1. 请先注册并选定包含工具栏类库

  1. 打开要使用上述工具栏类的表单集,再从“表单控件”工具栏单击“查看类”按钮,然后从显示的列表中选择该工具栏类。

  2. 从“表单控件”工具栏中选择工具栏类。

  3. 在“表单设计器”中单击,添加此工具栏,然后将工具栏拖动到适当的位置。

    Visual FoxPro 将在表单集上添加工具栏,如果表单集尚未打开,Visual FoxPro 将提示您打开一个。

  4. 为工具栏及其按钮定义操作。(请参阅下一节的“定义工具栏的操作”。)

    提示 要确定某个对象的所属类,可以查看它在“表单控件”工具栏中的工具提示信息。

有关如何注册及选择包含工具栏类库的详细内容,请参阅第三章“面向对象程序设计”中的“将类添加到表单中”部分。

使用代码协调工具栏和表单

除了使用“表单设计器”外,还可以使用代码在表单集中添加工具栏

若要使用代码在表单集中添加工具栏

例如,要添加并显示基于 inventory 类库中 printing 类的工具栏 tbrPrint,可以在表单集的 Init 事件中添加下列代码:

SET CLASSLIB TO inventory
THIS.AddObject("tbrPrint","printing")
tbrPrint.Show

注释 如果工具栏类没有定义工具栏及其按钮要执行的操作,那么您必须在与工具栏及其按钮相关的事件过程中定义操作。有关的详细内容,请参阅下一节的“定义工具栏的操作”部分。

示例:创建自定义工具栏

可以在代码中定义工具栏的各个要素。例如,如果在表单集的 Init 事件中添加下列代码,当加载表单集时,Visual FoxPro 将创建并显示代码中定义的工具栏。这个工具栏包含有两个按钮。

有两个按钮的工具栏

若选择按钮,将更改表单集中 frmForm1 表单的字体属性。

表单集的 Init 事件代码

代码 注释
THIS.AddObject("tbrTool1","mytoolbar")
THIS.tbrTool1.Show
在当前表单集中添加 mytoolbar 工具栏,并将它显示出来。这段代码放在表单集的 Init 事件中。

类定义代码

代码 注释
DEFINE CLASS myToolBar AS TOOLBAR

ADD OBJECT cmdBold AS COMMANDBUTTON
ADD OBJECT sep1    AS SEPARATOR
ADD OBJECT cmdItalic AS COMMANDBUTTON
类定义的起始部分:工具栏上包含一个命令按钮、一个分隔符和另一个命令按钮。
Left = 1
Top  = 1
Width = 25
Caption = "Form Attributes"
设置工具栏对象的属性。
cmdBold.Caption = "B"
cmdBold.Height = 1.7
cmdBold.Width = 10

cmdItalic.Caption = "I"
cmdItalic.Height = 1.7
cmdItalic.Width = 10
cmdItalic.FontBold = .F.
设置控件的属性。注意这里并没有设置工具栏上控件的 Top 或 Left 属性。工具栏上的控件将自动按照添加的顺序定位。

cmdItalic 的 FontBold 属性设置为“假”(.F.),因为默认情况下 FontBold 属性为“真”(.T.)。
PROCEDURE Activate
   THIS.cmdBold.FontBold = ;
    THISFORMSET.frmForm1.FontBold
   THIS.cmdItalic.FontItalic = ;
    THISFORMSET.frmForm1.FontItalic
ENDPROC
工具栏激活时,设置两个命令按钮的字体属性,分别反映 frmForm1 的粗体设置和斜体设置。
PROCEDURE cmdBold.CLICK
   THISFORMSET.frmForm1.FontBold = ;
    !THISFORMSET.frmForm1.FontBold
   THIS.FontBold = ;
    THISFORMSET.frmForm1.FontBold
ENDPROC
用户单击 cmdBold 时,对 frmForm1 的 FontBold 设置求反,并将 cmdBold 的 FontBold 也设置为相同的内容。
PROCEDURE cmdItalic.CLICK
   THISFORMSET.frmForm1.FontItalic = ;
    !THISFORMSET.frmForm1.FontItalic
   THIS.FontItalic = ;
    THISFORMSET.frmForm1.FontItalic
ENDPROC
用户单击 cmdItalic 时,frmForm1 的 FontItalic 设置求反,cmdItalic 的 FontItalic 也设置为相同的内容。
ENDDEFINE
类定义结束。

设置自定义工具栏的属性

在设计自定义工具栏的同时,可以设置其属性,例如,可以设置 Movable 属性,以便允许用户移动工具栏。

此外,还可以使用方法程序事件控制自定义工具栏。例如,可以使用 Dock 方法程序停放或移出工具栏,也可以使用 BeforeDock 事件和 AfterDock 事件控制工具栏停放前后所发生的活动。

定义工具栏的操作

创建工具栏后,必须定义与工具栏及其对象相关的操作。例如,必须定义用户单击工具栏或其中某个按钮时所发生的活动。

若要定义工具栏的操作

  1. 选定要定义操作的对象:工具栏或其中某个按钮。

  2. “属性”窗口中,选择“方法程序”选项卡。

  3. 编辑相应的事件。

  4. 添加代码,以指定操作。

此外,也可以设置工具栏及其对象的属性和方法程序。

协调菜单和自定义工具栏

如果创建了工具栏,必须使菜单命令与对应的工具栏按钮同步工作。例如,如果启用了某个工具栏按钮,则必须同时启用对应的菜单命令。

在设计与创建应用程序时应做到:

当协调菜单和工具栏按钮时,请遵循如下步骤:

  1. 通过定义工具栏来创建工具栏,添加命令按钮,并将要执行的代码包括在对应于此命令按钮的 Click 事件方法程序中。

  2. 创建与之协调的菜单。

  3. 添加协调的工具栏和菜单到一个表单集中。

创建协调的菜单

如果将菜单工具栏相协调,则菜单项执行与对应工具栏相同的任务,并在对应的工具栏按钮废止时,菜单项也自动地废止。

若要创建与工具栏相协调的菜单

  1. “菜单设计器”中,根据工具栏上的每个按钮对应地创建子菜单。

  2. 在每个子菜单项的“结果”栏,选择“命令”。

  3. 对每个子菜单项,调用相关工具栏按钮的 Click 事件对应的代码。

    例如,如果工具栏按钮的名字为 cmdA,可以在子菜单项命令编辑框中添加如下代码:

    Formset.toolbar.cmdA.Click
    
  4. 在“选项”栏选择此按钮,打开“提示选项”对话框,选择“跳过”。

  5. “表达式生成器”中输入表达式,指出当工具栏命令按钮失效时,菜单功能应该“跳过”。

    例如,如果工具栏按钮的名称为 cmdA,可以在“跳过”框中输入如下表达式:

    NOT formset.toolbar.cmdA.Enabled
    
  6. 生成菜单。

  7. 把菜单添加到拥有此工具栏的表单集中,并运行表单集。

当用户打开菜单时,Visual FoxPro 计算“跳过”条件的值,如果相关的工具栏命令不可用,则菜单也不可用。当用户选择菜单项时,则执行相关工具栏命令的 Click 事件代码。

将相关的工具栏和菜单添加到表单集中

创建了协调工作的工具栏菜单之后,在表单集中协调它们就变得非常容易。

若要在表单集中加入协调的工具栏和菜单

  1. 请用下列三种方法中的一种将工具栏添加到表单集中:
  2. 在表单集中的 Load 事件中,保存已有菜单,运行菜单程序。

    例如,如果菜单名为 mymenu,可包含使用 PUSH MENUDO 命令的如下代码:

    PUSH MENU _MSYSMENU
    DO mymenu.mpr
    
  3. 在表单集中的 Unload 事件中,使用 POP MENU 命令恢复原有菜单:
    POP MENU _MSYSMENU
    

如果某些菜单命令使用频繁,可创建一个自定义工具栏,它包含那些频繁使用的命令按钮。这样用户在需要这些命令时只需简单地按动按钮就可以了。如果创建了工具栏,则需要使菜单命令和相应的按钮同步。例如,如果启用某个按钮,则需要启用与它相应的菜单命令。

测试与调试菜单系统

在设计菜单系统时,可以预览整个菜单系统,而在生成菜单程序后则可以对系统进行测试和调试。

若要在设计菜单系统时预览整个系统

选择“预览”后,已经定义的菜单系统出现在屏幕的最外层。此外,“预览”对话框可以显示出菜单系统的文件名(或临时文件的文件名)。

预览菜单系统

如果选定一个菜单标题或菜单项,则会在“预览”对话框中显示它,并显示为菜单或菜单项指定的命令。

若要测试菜单系统

  1. “菜单”菜单中,选择“生成”。

    如果对菜单作了修改,Visual FoxPro 会提示您是否保存所做修改。

  2. 在“生成菜单”对话框的“输出文件”框中键入生成的菜单程序的名称,或通过选择对话按钮进行输入。

  3. 选择“生成”按钮,就会生成扩展名为 .mpr 的菜单程序文件。

  4. 从“程序”菜单中,选择“运行”命令,运行此程序。

    注意 如果修改了生成的菜单程序(.mpr 文件),将丢失使用“菜单设计器”对菜单所做的修改,需重新生成此菜单程序。

如果菜单程序并没有按预想的那样正确运行,请使用 Visual FoxPro 提供的诊断工具进行调试。有关详细内容,请参阅第十四章“测试和调试应用程序”

疑难解答 如果在运行一个应用程序(.exe)时,它的主程序是一个菜单,且应用程序刚刚显示时,菜单即终止运行,则应在清理代码中包含 READ EVENTS 命令,并为退出菜单系统的菜单命令指定 CLEAR EVENTS 命令。

定制菜单系统

创建一个基本的菜单系统后,可以对它进行定制。例如,可以创建状态栏信息,定义菜单的位置,或定义默认过程。

显示状态栏信息

在选到一个菜单或菜单项时,可以在状态栏显示一些说明该菜单或菜单项的信息。这种信息可以帮助用户了解所选菜单的有关情况。

若要选择菜单或菜单项时显示信息

  1. 请在“菜单名称”栏中,选择相应的菜单标题或菜单项。

  2. 选择“选项”栏中的按钮,显示“提示选项”对话框。

  3. 选择“信息”。

    出现“表达式生成器”对话框。

  4. 在“信息”框中,键入适当的信息。

    提示 请用引号将字符串括起来。

定义菜单标题的位置

在应用程序中,可以预先设置用户自定义菜单标题的位置。选择“常规选项”对话框中的选项,可以设置自定义菜单相对于活动菜单系统的相对位置。另外,也可以指定在用户可视编辑一个对象时菜单标题的位置。

若要为用户自定义的菜单标题指定相对位置

  1. 从“显示”菜单中,选择“常规选项”。

  2. 选择适当的“位置”选项:“替换”、“追加”、“在...之前”或“在...之后”。

此时,Visual FoxPro 会重新排列所有菜单标题的位置。如果只想设置其中的几个,而不想全部重新设置,请在“菜单设计器”中将想要移动的菜单标题旁边的移动钮拖到正确的位置。

此外,也可以指定当用户在应用程序中编辑某个对象时,菜单标题的位置。如果您包含了一个对象,且被用户激活,那么除非您表明希望菜单标题出现在结果菜单栏上,否则它们不会显示在菜单栏上。

若要在对象的可视编辑期间控制菜单标题位置

  1. 在“菜单名称”栏中,选择相应的菜单标题。

  2. 选择“选项”栏中的按钮显示“提示选项”对话框。

  3. 设置“位置”框。

  4. 选择下列某一选项按钮:

如果选择了“无”选项,则当用户编辑对象时,此菜单标题并不出现在菜单栏上。有关对对象进行可视编辑的详细内容,请参阅第十六章“添加 OLE”

保存与还原菜单

可以使用 PUSH MENU 命令将菜单保存在堆栈中,也可以用 POP MENU 命令从堆栈中还原保存的菜单。如果想要临时移去某个菜单,暂时使用另一个菜单替换,使用完后,再将原来的菜单恢复过来,这时,入栈与出栈的技术就十分有用。

可保存在内存中的菜单的数目只受可用内存大小的限制。

提示 可使用 SYS(1016) 函数检查可用内存数量。例如,要检查菜单系统占用了多少内存,可以先调用 SYS(1016),再将菜单压入堆栈,然后再次调用 SYS(1016),两项相减即可得到菜单所占内存数。

为菜单系统创建默认过程

可以创建一个全局过程,应用于整个菜单系统。以后,如果选定一个没有指定过程的菜单,就运行此过程。

例如,假设您正在开发一个应用程序,其中有的菜单还没有设计好子菜单或过程。这时,您可以为这些菜单创建一个临时占位过程,当选定这些菜单时,执行此程序,这样有利于调试。比如,可以创建一个包含下列函数的通用的临时过程:

MESSAGEBOX("Feature not available")

若要创建默认过程

  1. 请打开正在设计的菜单系统。

  2. 从“显示”菜单中,选择“常规选项”命令。

  3. 选择下列任一操作,指定过程:

    – 或者 –

设置系统菜单

SET SYSMENU 命令可以用来管理使用 Visual FoxPro 菜单系统的菜单。使用 SET SYSMENU,可以废止菜单,向菜单中添加菜单项,或从菜单中移去菜单项,还原默认的 Visual FoxPro 菜单,以及控制在程序执行期间对菜单的访问。