Условные операторы
Внимание
Современная платформа печати — это предпочтительный способ взаимодействия с принтерами 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:
Большинство атрибутов принтера, за исключением атрибутов только корневого уровня. (Общие атрибуты должны предшествовать EXTERN_GLOBAL, если запись *Switch не находится на корневом уровне , а не внутри фигурных скобок.)
Вложенные записи *Switch , позволяющие указать несколько зависимостей.
*Записи команд.
*TTFSEnabled?, что обеспечивает подстановку шрифта.
Следующие типы записей 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