Поделиться через


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

Внимание

Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.

Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.

Язык GPD предоставляет такие условные операторы, которые позволяют описать зависимости, которые некоторые атрибуты принтера могут иметь в конфигурации принтера. Например, поля и источник курсора для страницы могут зависеть от ориентации страницы. Операторы *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 компонента3, зависит как от компонента 1, так и от компонента2.

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

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

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

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

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

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

Место размещения инструкции *Switch

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

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

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

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

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

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

Что следует поместить внутри *Switch, *Case и *Default Statements

В записи *Switch можно поместить только записи *Case и *Default.

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

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

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

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

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

  • *Элементы компонента и *Параметры (хотя атрибуты компонентов и атрибуты параметра перемещаются).

Один из методов определения правильности размещения записей внутри операторов *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

Обратите внимание, что разрешение задается перед входнымbinм в производном 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