Partilhar via


Declarações condicionais

Importante

A moderna plataforma de impressão é o meio preferido do Windows para comunicar com as impressoras. Recomendamos que utilize o controlador de classe da caixa de entrada IPP da Microsoft, juntamente com as Aplicações de Suporte de Impressão (PSA), 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 Guia de design do aplicativo de suporte de impressão v1 e v2.

A linguagem GPD fornece instruções condicionais semelhantes a C que permitem descrever dependências que alguns atributos de 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 se expressem tais dependências. O formato destas declarações é o seguinte:

*Switch FeatureName { *Case Option1_Name { } *Case Option2_Name { } etc. *Case OptionN_Name { } *Default { } }

FeatureName deve ser o nome de uma funcionalidade especificada no ficheiro GPD com a 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 não incluíres todas as opções e não incluíres um comando *Default, deves avaliar atributos relevantes (no exemplo, *PrintableArea, *PrintableOrigine *CursorOrigin) noutra parte do arquivo GPD, antes do comando *Switch.

Especificando várias dependências

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, AttributeX, pertencente a optionE de feature3, depende de feature1 e feature2.

Se o usuário selecionou optionA para feature1, optionD para feature2 e optionE para feature3, attributeX será definido como ValueX.

Se o usuário selecionou optionA para feature1, optionC para feature2 e optionE para feature3, attributeX será definido como ValueY.

Se o usuário selecionou optionB para feature1 e optionE para feature3, attributeX será definido como ValueZ. 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 de *Switch. Usando o exemplo, tu não podes usar uma entrada de *Switch para indicar que feature3 é dependente de feature1 e, posteriormente, numa instrução *Switch não aninhada, indicar que feature3 é dependente de feature2.

  • Não é possível especificar o mesmo recurso mais de uma vez em cada entrada aninhada *Switch.

Onde colocar uma Instrução *Switch

Você pode colocar uma instrução *Switch nos seguintes locais dentro de um ficheiro GPD:

  • Dentro de uma instrução *Option

  • Dentro de uma declaração *Funcionalidade

  • Dentro de uma *Declaração de caso

  • Dentro de uma *Default instrução

  • No nível superior do ficheiro (ou seja, não dentro de um bloco de chaves)

O que colocar dentro das instruções *switch, *case e *default

Dentro de uma entrada *Switch, pode apenas colocar entradas *Case e *Default.

As entradas de arquivo GPD que podem ser colocadas dentro das entradas *Case ou *Default, são referidas como entradas relocáveis. Os seguintes tipos de entradas GPD são realocáveis:

  • A maioria dos atributos impressora, exceto atributos somente de nível raiz. (Atributos gerais devem ser precedidos por EXTERN_GLOBAL a menos que a entrada *Switch esteja no nível raiz - não dentro de chaves.)

  • Entradas aninhadas de comutador, 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 de nível raiz.

  • *Entradas TTFS para especificar a fonte substituída.

  • *Constraints, *InvalidCombination, *InvalidInstallableCombination, *NotInstalledConstraints são entradas que definem combinações inválidas de opções, conforme descrito em Option Constraints.

  • *Entradas de característica e *opção (embora os atributos de característica e os atributos de opção sejam realocá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 de interruptor 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 seguinte cenário. Você tem um driver de impressora v4 que é derivado de um driver de classe v4 ao definir RequiredClass no driver de classe em um arquivo *-manifest.ini.

O arquivo GPD do driver de classe tem a seguinte árvore de switch:

* Option: A4
    1. Switch: Resolution
* Option: Letter
    1. Switch: Resolution
    2. Switch: InputBin

O driver de impressora v4 derivado deseja adicionar o MarginSetting switch, para que seu arquivo GPD tenha a seguinte árvore de switch:

* Option: A4
    1. Switch: Resolution
    2. Switch: InputBin
    3. Switch: MarginSetting
* Option: Letter
    1. Switch: Resolution
    2. Switch: InputBin
    3. Switch: MarginSetting

Observe que de resolução é 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 do driver da classe base, adicionando MarginSetting no final.

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