Instrucciones condicionales
Importante
La plataforma de impresión moderna es el medio preferido de Windows para comunicarse con impresoras. Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con aplicaciones de soporte técnico de impresión (PSA), para personalizar la experiencia de impresión en Windows 10 y 11 para el desarrollo de dispositivos de impresora.
Para obtener más información, consulte Plataforma de impresión moderna y la Guía de diseño de aplicaciones para compatibilidad con impresión.
El lenguaje GPD proporciona instrucciones condicionales similares a C que permiten describir las dependencias que algunos atributos de impresora pueden tener en la configuración de una impresora. Por ejemplo, los márgenes y el origen del cursor de una página pueden depender de la orientación de la página. Las instrucciones *Switch y *Case permiten expresar estas dependencias. El formato de estas instrucciones es el siguiente:
*Switch FeatureName { *Case Option1_Name { } *Case Option2_Name { } etc. *Case OptionN_Name { } *Default { } }
FeatureName debe ser el nombre de una característica especificada en el archivo GPD con una entrada *Feature. Los nombres de opción usados deben ser opciones asociadas a la característica especificada.
Para expresar el caso en el que los márgenes de página y el origen del cursor dependen de la orientación de la página, se pueden usar las siguientes entradas:
*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)
}
}
}
}
En este ejemplo, las opciones de la característica PaperSize de la impresora dependen de la opción seleccionada para la característica Orientation de la impresora.
Si no enumera todas las opciones de una característica como argumentos de instrucción *Case, puede incluir una instrucción *Default, igual que en el lenguaje C. Si no incluye todas las opciones y no incluye una instrucción *Default, debe evaluar los atributos pertinentes (en el ejemplo, *PrintableArea, *PrintableOrigin y *CursorOrigin) en otra parte del archivo GPD, antes de la instrucción *Switch.
Especificación de varias dependencias
Puede incluir instrucciones *Switch dentro de las instrucciones *Case y *Default. Esto le permite especificar varias dependencias, como se indica a continuación:
*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 {...}
}
En este ejemplo AttributeX, que pertenece a optionE de feature3, depende de feature1 y feature2.
Si el usuario ha seleccionado optionA para feature1, optionD para feature2 y optionE para feature3, attributeX se establece en ValueX.
Si el usuario ha seleccionado optionA para feature1, optionC para feature2 y optionE para feature3, attributeX se establece en ValueY.
Si el usuario ha seleccionado optionB para feature1 y optionE para feature3, attributeX se establece en ValueZ. La configuración de Feature2 es irrelevante.
Las reglas siguientes se aplican al especificar varias dependencias:
Se deben especificar varias dependencias dentro del ámbito de una sola entrada *Switch. Siguiendo con el ejemplo, no puede usar una entrada *Switch para indicar que feature3 depende de feature1 y, a continuación, en una instrucción *Switch no anidada posterior, indicar que feature3 depende de feature2.
No se puede especificar la misma característica más de una vez dentro de cada entrada *Switch anidada.
Dónde colocar una instrucción *Switch
Puede colocar una instrucción *Switch en las siguientes ubicaciones dentro de un archivo GPD:
Dentro de una instrucción *Option
Dentro de una instrucción *Feature
Dentro de una instrucción *Case
Dentro de una instrucción *Default
En el nivel superior del archivo (es decir, no dentro de un conjunto de llaves)
Qué colocar dentro de las instrucciones *Switch, *Case y *Default
Dentro de una entrada *Switch, solo puede colocar entradas *Case y *Default.
Las entradas del archivo GPD que se pueden colocar dentro de entradas *Case o *Default se conocen como entradas reubicables. Los siguientes tipos de entradas GPD se pueden reubicar:
La mayoría de los atributos de impresora, excepto los atributos de solo nivel raíz. (Los atributos generales deben ir precedidos de EXTERN_GLOBAL a menos que la entrada *Switch esté en el nivel raíz, no entre llaves).
Entradas *Switch anidadas, que permiten especificar varias dependencias.
Entradas *Command.
*TTFSEnabled?, que permite la sustitución de fuentes.
Los siguientes tipos de entradas GPD no se pueden reubicar:
Atributos de solo nivel raíz.
Entradas *TTFS para especificar una fuente sustituida.
Entradas *Constraints, *InvalidCombination, *InvalidInstallableCombination, *NotInstalledConstraints que definen combinaciones no válidas de opciones, como se describe en Restricciones de opciones.
Entradas *Feature y *Option (aunque los atributos de características y los atributos de opciones se pueden reubicar).
Un método para determinar si las entradas se han colocado correctamente dentro de las instrucciones *Case es quitar todas las instrucciones *Switch y *Case. Si las entradas dentro de las instrucciones *Case son correctas, siguen siendo correctas después de quitar las instrucciones *Switch y *Case.
Ordenación de instrucciones switch en un controlador de impresión V4 derivado de un controlador de clase
El archivo GPD del controlador de impresora v4 derivado debe seguir el mismo orden que el controlador de clase base.
Considere el siguiente escenario: Tiene un controlador de impresora v4 que se deriva de un controlador de clase v4 estableciendo RequiredClass en el controlador de clase en un archivo *-manifest.ini.
El archivo GPD del controlador de clase tiene el siguiente árbol de modificadores:
* Option: A4
1. Switch: Resolution
* Option: Letter
1. Switch: Resolution
2. Switch: InputBin
El controlador de impresora v4 derivado quiere agregar el modificador MarginSetting, por lo que su archivo GPD tendrá el árbol de modificadores siguiente:
* Option: A4
1. Switch: Resolution
2. Switch: InputBin
3. Switch: MarginSetting
* Option: Letter
1. Switch: Resolution
2. Switch: InputBin
3. Switch: MarginSetting
Tenga en cuenta que Resolution se establece antes que InputBin en el GPD derivado y que MarginSetting se establece después de ambos. El archivo GPD del controlador de impresora v4 derivado sigue el mismo orden que el controlador de clase base y agrega MarginSetting después.
Por ejemplo, un archivo GPD derivado incorrectamente puede ser similar al siguiente:
* Option: A4
1. Switch: MarginSetting
2. Switch: InputBin
3. Switch: Resolution
* Option: Letter
1. Switch: MarginSetting
2. Switch: InputBin
3. Switch: Resolution