Условные операторы

Важно!

Мы рекомендуем использовать драйвер класса "Входящие" от Майкрософт 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 принтера зависят от выбранного параметра для функции ориентации принтера.

Если вы не перечисляете все параметры компонента в качестве аргументов оператора *Case , можно включить оператор *Default , как в языке C. Если вы не включаете все параметры и не включаете инструкцию *Default , необходимо оценить соответствующие атрибуты (в примере *PrintableArea, *PrintableOrigin и *CursorOrigin) в другом месте файла GPD, предшествующем инструкции *Switch .

Указание нескольких зависимостей

Операторы Switch можно включить в *Операторы Case и *Default . Это позволяет указать несколько зависимостей следующим образом:

*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 {...} 
    }

В этом примере AttributeX, принадлежащий параметру optionE feature3, зависит от feature1 и feature2.

Если пользователь выбрал optionA для feature1, optionD для feature2 и optionE для feature3, атрибуту attributeX присваивается значение ValueX.

Если пользователь выбрал параметр OptionA для feature1, optionC для feature2 и optionE для feature3, атрибуту attributeX присваивается значение ValueY.

Если пользователь выбрал optionB для feature1 и optionE для feature3, атрибуту attributeX присваивается значение ValueZ. Параметр Feature2 не имеет значения.

При указании нескольких зависимостей применяются следующие правила:

  • В области одной записи *Switch необходимо указать несколько зависимостей. В примере, например, нельзя использовать запись *Switch , чтобы указать, что feature3 зависит от feature1, а затем в последующей невложенной инструкции *Switch указать, что feature3 зависит от feature2.

  • Нельзя указать одну и ту же функцию более одного раза в каждой вложенной записи *Switch .

Где разместить инструкцию *Switch

Оператор *Switch можно разместить в следующих местах в GPD-файле:

  • Внутри оператора *Option

  • Внутри оператора *Feature

  • Внутри оператора *Case

  • Внутри инструкции *Default

  • На верхнем уровне файла (то есть не внутри набора фигурных скобок)

Что помещать в *Операторы Switch, *Case и *Default

В записи *Switch можно поместить только *Регистр и *Записи по умолчанию .

Записи файла GPD, которые можно поместить в *Регистр или *Записи по умолчанию , называются перемещаемыми записями. Следующие типы записей GPD можно перемещать:

  • Большинство атрибутов принтера, за исключением атрибутов только корневого уровня. (Общие атрибуты должны предшествовать EXTERN_GLOBAL, если только запись *Switch не находится на корневом уровне, а не в фигурных скобках.)

  • Вложенные *переключения записей, которые позволяют указать несколько зависимостей.

  • *Записи команд.

  • *TTFSEnabled?, который включает подстановку шрифтов.

Следующие типы записей GPD не перемещаются:

  • Атрибуты только корневого уровня.

  • *Записи TTFS для указания заменяемого шрифта.

  • *Constraints, *InvalidCombination, *InvalidInstallableCombination, *NotInstalledConstraints записи, которые определяют недопустимые сочетания параметров, как описано в разделе Ограничения параметров.

  • *Элементы feature и *Option (хотя атрибуты признаков и атрибуты параметров можно перемещать).

Одним из способов определения правильности размещения записей в операторах *Case является удаление всех операторов *Switch и *Case . Если записи в операторах *Case верны, они по-прежнему верны после удаления операторов *Switch и *Case .

Упорядочение операторов switch в драйвере печати версии 4, производном от драйвера класса

Файл GPD производного драйвера принтера версии 4 должен соответствовать тому же порядку, что и драйвер базового класса.

Рассмотрим следующий сценарий. У вас есть драйвер принтера версии 4, производный от драйвера класса версии 4, задав RequiredClass драйвер класса в файле *-manifest.ini.

Файл GPD драйвера класса имеет следующее дерево переключения:

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

Производный драйвер принтера версии 4 хочет добавить параметр MarginSetting , поэтому его GPD-файл будет иметь следующее дерево переключателей:

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

Обратите внимание, что разрешение задается перед InputBin в производном GPD, а MarginSetting — после обоих. Файл GPD производного драйвера принтера версии 4 соответствует тому же порядку, что и драйвер базового класса, и добавляет MarginSetting после.

Например, неправильно производный файл GPD может выглядеть следующим образом:

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