Compartilhar via


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