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