条件语句

重要

新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

有关详细信息,请参阅新式打印平台打印支持应用设计指南

GPD 语言提供了类似 C 语言的条件语句,可用于描述某些打印机属性对打印机配置的依赖项。 例如,页面的页边距和光标原点可能取决于页面的方向。 可以使用 *Switch*Case 语句来表达此类依赖项。 这些语句的格式如下:

*Switch FeatureName { *Case Option1_Name { } *Case Option2_Name { } etc. *Case OptionN_Name { } *Default { } }

FeatureName 必须是 GPD 文件中通过 *Feature 条目指定的功能名称。 使用的选项名称必须是与指定功能相关的选项。

要表示页边距和光标原点取决于页面方向的情况,可以使用以下条目:

*Feature: Orientation
{
    *DefaultOption: Portrait
    *Option: Portrait
    {
        *Name: "Portrait"
        *rcIconID: =RC_ICON_PORTRAIT
    }
    *Option: LANDSCAPE_CC90
    {
        *Name: "Landscape"
        *rcIconID: =RC_ICON_LANDSCAPE
    }
}
*Feature: PaperSize
{
    *DefaultOption: Letter
    *Option: Letter
    {
        *Name: "Letter 8.5 x 11 inch"
        *switch: Orientation
        {
            *case: Portrait
            {
                *PrintableArea: PAIR(4800, 6324)
                *PrintableOrigin: PAIR(150, 150)
                *CursorOrigin: PAIR(150,100)
            }
            *case: LANDSCAPE_CC90
            {
                *PrintableArea: PAIR(4860, 6360)
                *PrintableOrigin: PAIR(120, 120)
                *CursorOrigin: PAIR(100,6480)
            }
        }
    }
}

在此示例中,打印机的 PaperSize 功能的选项取决于为打印机的 Orientation 功能所选的选项。

如果未将某个功能的所有选项都列为 *Case 语句参数,则可以加入 *Default 语句,就像在 C 语言中一样。 如果未包含所有选项,也不包含 *Default 语句,则必须在 GPD 文件的其他地方,在 *Switch 语句之前评估相关属性(在示例中为 *PrintableArea、*PrintableOrigin*CursorOrigin)。

指定多个依赖项

可以在 *Case*Default 语句中包含 *Switch 语句。 这样就可以指定多个依赖项,如下所示:

*Feature: feature1 {*Option: optionA {...} *Option: optionB {...}}
*Feature: feature2 {*Option: optionC {...} *Option: optionD {...}}
*Feature: feature3 
    {*Option: optionE 
        {*Switch: feature1 
            {*Case: optionA
                 {*Switch: feature2
                     {*Case: optionD
                         {AttributeX: ValueX}
                      *Default
                         {AttributeX: ValueY}
                     }
                 }
             *Default
                  {AttributeX: ValueZ}
             }
         }
    *Option: optionF {...} 
    }

在本示例中,属于 feature3 的 optionE 的 AttributeX 同时依赖于 feature1 和 feature2。

如果用户为 feature1 选择了 optionA,为 feature2 选择了 optionD,为 feature3 选择了 optionE,则 attributeX 就会被设为 ValueX。

如果用户为 feature1 选择了 optionA,为 feature2 选择了 optionC,为 feature3 选择了 optionE,则 attributeX 就会被设为 ValueY。

如果用户为 feature1 选择了 optionB,为 feature3 选择了 optionE,则 attributeX 就会被设为 ValueZ。 Feature2 的设置无关紧要。

指定多个依赖项时,以下规则适用:

  • 必须在单个 *Switch 条目的范围内指定多个依赖项。 例如,不能使用 *Switch 条目来表示 feature3 依赖于 feature1,然后在随后的非嵌套 *Switch 语句中表示 feature3 依赖于 feature2。

  • 不能在每个嵌套的 *Switch 条目中多次指定相同的功能。

放置 *Switch 语句的位置

可以在 GPD 文件的以下位置放置 *Switch 语句:

  • 在 *Option 语句内

  • 在 *Feature 语句内

  • *Case 语句内

  • *Default 语句内

  • 在文件的顶层(即不在大括号内)

在 *Switch、*Case 和 *Default 语句中放置哪些内容

*Switch 条目内,只能放置 *Case*Default 条目。

可放置在 *Case*Default 条目内的 GPD 文件条目称为可重定位条目。 以下类型的 GPD 条目可重定位:

  • 大多数打印机属性,但仅根级别属性除外。 (除非 *Switch 条目位于根级别,即不在大括号内,否则常规属性必须在前面加上 EXTERN_GLOBAL。)

  • 嵌套的 *Switch 条目,可通过其指定多个依赖项。

  • *命令条目。

  • *TTFSEnabled?,可启用字体替换。

以下类型的 GPD 条目不可重定位:

  • 仅限根级别的属性。

  • 用于指定替代字体的 *TTFS 条目。

  • *Constraints、*InvalidCombination、*InvalidInstallableCombination、*NotInstalledConstraints 条目定义了无效的选项组合,如选项约束中所述。

  • *Feature 和 *Option 条目(尽管功能属性选项属性可重定位)。

判断条目是否被正确放置在 *Case 语句中的一种方法是删除所有 *Switch 和 *Case 语句。 如果 *Case 语句内的条目是正确的,那么在删除 *Switch 和 *Case 语句后,它们仍然是正确的。

从类驱动程序派生的 V4 打印驱动程序中 switch 语句的排序

派生的 v4 打印机驱动程序的 GPD 文件需要遵循与基类驱动程序相同的顺序。

请考虑以下场景。 你有一个 v4 打印机驱动程序,通过在 *-manifest.ini 文件中将 RequiredClass 设置为类驱动程序,该驱动程序衍生自 v4 类驱动程序。

类驱动程序的 GPD 文件有以下开关树:

* Option: A4
    1. Switch: Resolution
* Option: Letter
    1. Switch: Resolution
    2. Switch: InputBin

派生的 v4 打印机驱动程序想要添加 MarginSetting 开关,因此其 GPD 文件将具有以下开关树:

* Option: A4
    1. Switch: Resolution
    2. Switch: InputBin
    3. Switch: MarginSetting
* Option: Letter
    1. Switch: Resolution
    2. Switch: InputBin
    3. Switch: MarginSetting

请注意,在派生 GPD 中,Resolution 设置在 InputBin 之前,而 MarginSetting 则设置在两者之后。 派生的 v4 打印机驱动程序的 GPD 文件遵循与基类驱动程序相同的顺序,并在后面添加了 MarginSetting

例如,错误导出的 GPD 文件可能如下所示:

* Option: A4
    1. Switch: MarginSetting
    2. Switch: InputBin
    3. Switch: Resolution
* Option: Letter
    1. Switch: MarginSetting
    2. Switch: InputBin
    3. Switch: Resolution