Instruções condicionais
Importante
A plataforma de impressão moderna é o meio preferido do Windows para se comunicar com as impressoras. Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft juntamente com PSA (Aplicativos de Suporte à Impressão) para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.
Para obter mais informações, consulte Plataformade impressão moderna e o Guia de design do aplicativo de suporte de impressão.
A linguagem GPD fornece instruções condicionais semelhantes a C que permitem descrever as dependências que alguns atributos da impressora podem ter na configuração de uma impressora. Por exemplo, as margens e a origem do cursor de uma página podem depender da orientação da página. As instruções*Switch e *Case permitem que você expresse essas dependências. O formato dessas instruções é o seguinte:
*Switch FeatureName { *Case Option1_Name { } *Case Option2_Name { } etc. *Case OptionN_Name { } *Default { } }
FeatureName deve ser o nome de um recurso especificado no arquivo GPD com uma entrada *Feature. Os nomes de opção usados devem ser opções associadas ao recurso especificado.
Para expressar o caso em que as margens da página e a origem do cursor dependem da orientação da página, as seguintes entradas podem ser usadas:
*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)
}
}
}
}
Neste exemplo, as opções para o recurso PaperSize da impressora dependem da opção selecionada para o recurso Orientação da impressora.
Se você não listar todas as opções de um recurso como argumentos de instrução *Case, poderá incluir uma instrução *Default, assim como na linguagem C. Se você não incluir todas as opções e não incluir uma instrução *Default, deverá avaliar os atributos relevantes (no exemplo, *PrintableArea, *PrintableOrigin e *CursorOrigin) em outro lugar no arquivo GPD, precedendo a instrução *Switch.
Especificando várias dependências
Você pode incluir instruções *Switch dentro das instruções *Case e *Default. Isso permite que você especifique várias dependências, da seguinte maneira:
*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 {...}
}
Neste exemplo, o AttributeX, pertencente à optionE do feature3, depende do feature1 e do feature2.
Se o usuário tiver selecionado a optionA para o feature1, a optionD para o feature2 e a optionE para o feature3, o atributoX será definido como ValorX.
Se o usuário tiver selecionado a optionA para o feature1, a optionC para o feature2 e a optionE para o feature3, o atributoX será definido como ValorY.
Se o usuário tiver selecionado a option B para o feature1 e a optionE para o feature3, o atributoX será definido como ValorZ. A configuração do feature2 é irrelevante.
As seguintes regras se aplicam ao especificar várias dependências:
Várias dependências devem ser especificadas dentro do escopo de uma única entrada *Switch. Usando o exemplo, por exemplo, você não pode usar uma entrada *Switch para indicar que feature3 é dependente de feature1 e, em seguida, em uma instrução *Switch subsequente e não aninhada, indicar que feature3 é dependente de feature2.
Você não pode especificar o mesmo recurso mais de uma vez em cada entrada *Switch aninhada.
Onde colocar uma instrução *switch
Você pode colocar uma instrução *Switch nos seguintes locais em um arquivo GPD:
Dentro de uma instrução *Option
Dentro de uma instrução *Feature
Dentro de uma instrução *Case
Dentro de uma instrução *Default
No nível superior do arquivo (ou seja, não dentro de um conjunto de chaves)
O que colocar dentro das instruções *Switch, *Case e *Default
Em uma entrada *Switch, você pode colocar apenas entradas *Case e *Default.
As entradas de arquivo GPD que podem ser colocadas dentro de entradas *Case ou *Default são chamadas de entradas relocáveis. Os seguintes tipos de entradas GPD são realocáveis:
A maioria dos atributos de impressora, exceto os atributos somente no nível raiz. (Os atributos gerais devem ser precedidos por EXTERN_GLOBAL, a menos que a entrada *Switch esteja no nível raiz - não entre chaves.)
Entradas aninhadas *Switch, que permitem especificar várias dependências.
*Entradas de comando.
*TTFSEnabled?, que permite a substituição de fontes.
Os seguintes tipos de entradas GPD não são realocáveis:
Atributos somente no nível raiz.
*Entradas TTFS para especificar a fonte substituída.
*Constraints, *InvalidCombination, *InvalidInstallableCombination, *NotInstalledConstraints que definem combinações inválidas de opções, conforme descrito em Restrições de opção.
*Entradas de recurso e *Opção (embora os atributos feature e os atributos option sejam relocáveis).
Um método para determinar se as entradas foram colocadas corretamente dentro das instruções *Case é remover todas as instruções *Switch e *Case. Se as entradas dentro das instruções *Case estiverem corretas, elas ainda estarão corretas depois que as instruções *Switch e *Case forem removidas.
Ordenação de instruções switch em um driver de impressão V4 derivado de um driver de classe
O arquivo GPD do driver de impressora v4 derivado precisa seguir a mesma ordem que o driver de classe base.
Considere o cenário a seguir. Você tem um driver de impressora v4 derivado de um driver de classe v4 definindo RequiredClass como o driver de classe em um arquivo *-manifest.ini.
O arquivo GPD do driver de classe tem a seguinte árvore de opções:
* Option: A4
1. Switch: Resolution
* Option: Letter
1. Switch: Resolution
2. Switch: InputBin
O driver de impressora v4 derivado deseja adicionar a opção MarginSetting, portanto, seu arquivo GPD terá a seguinte árvore de opções:
* Option: A4
1. Switch: Resolution
2. Switch: InputBin
3. Switch: MarginSetting
* Option: Letter
1. Switch: Resolution
2. Switch: InputBin
3. Switch: MarginSetting
Observe que Resolution é definido antes de InputBin no GPD derivado e MarginSetting é definido após ambos. O arquivo GPD do driver de impressora v4 derivado segue a mesma ordem que o driver de classe base e adiciona MarginSetting depois.
Por exemplo, um arquivo GPD derivado incorretamente pode ter a seguinte aparência:
* Option: A4
1. Switch: MarginSetting
2. Switch: InputBin
3. Switch: Resolution
* Option: Letter
1. Switch: MarginSetting
2. Switch: InputBin
3. Switch: Resolution