Condividi tramite


Istruzioni condizionali

Importante

La piattaforma di stampa moderna è il mezzo preferito di Windows per comunicare con le stampanti. Ti consigliamo di usare il driver di classe IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi per stampanti.

Per altre informazioni, vedere Piattaforma di stampa moderna e guida alla progettazione dell'app di supporto per la stampa.

Il linguaggio GPD fornisce istruzioni condizionali simili a C che consentono di descrivere le dipendenze che alcuni attributi della stampante possono avere nella configurazione di una stampante. Ad esempio, i margini e l'origine del cursore per una pagina possono dipendere dall'orientamento della pagina. Le istruzioni *Switch e *Case consentono di esprimere tali dipendenze. Il formato di queste istruzioni è il seguente:

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

FeatureName deve essere il nome di una funzionalità specificata all'interno del file GPD con una voce *Feature . I nomi delle opzioni usati devono essere opzioni associate alla funzionalità specificata.

Per esprimere il caso in cui i margini della pagina e l'origine del cursore dipendono dall'orientamento della pagina, è possibile usare le voci seguenti:

*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)
            }
        }
    }
}

In questo esempio, le opzioni per la funzionalità PaperSize della stampante dipendono dall'opzione selezionata per la funzionalità Orientamento della stampante.

Se non si elencano tutte le opzioni di una funzionalità come argomenti dell'istruzione *Case , è possibile includere un'istruzione *Default , come nel linguaggio C. Se non si includono tutte le opzioni e non si include un'istruzione *Default , è necessario valutare gli attributi rilevanti (nell'esempio * PrintableArea, *PrintableOrigin e *CursorOrigin) altrove nel file GPD, precedendo l'istruzione *Switch .

Specifica di più dipendenze

È possibile includere *istruzioni Switch all'interno di *Case e *Istruzioni predefinite . In questo modo è possibile specificare più dipendenze, come indicato di seguito:

*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 {...} 
    }

In questo esempio AttributeX, appartenente all'opzioneE di feature3, dipende sia da feature1 che da feature2.

Se l'utente ha selezionato l'opzioneA per feature1, optionD per feature2 e optionE per feature3, attributeX è impostato su ValueX.

Se l'utente ha selezionato l'opzioneA per feature1, optionC per feature2 e optionE per feature3, attributeX è impostato su ValueY.

Se l'utente ha selezionato l'opzioneB per feature1 e optionE per feature3, attributeX è impostato su ValueZ. L'impostazione per Feature2 è irrilevante.

Quando si specificano più dipendenze, si applicano le regole seguenti:

  • È necessario specificare più dipendenze nell'ambito di una singola voce *Switch . Usando l'esempio, ad esempio, non è possibile usare una voce *Switch per indicare che feature3 dipende da feature1 e quindi, in un'istruzione *Switch successiva, non annidata, indicare che feature3 dipende da feature2.

  • Non è possibile specificare la stessa funzionalità più di una volta all'interno di ogni voce *Switch nidificata.

Posizione in cui inserire un'istruzione *Switch

È possibile inserire un'istruzione *Switch nei percorsi seguenti all'interno di un file GPD:

  • All'interno di un'istruzione *Option

  • All'interno di un'istruzione *Feature

  • All'interno di un'istruzione *Case

  • All'interno di un'istruzione *Default

  • Al livello superiore del file (ovvero non all'interno di un set di parentesi graffe)

Cosa inserire all'interno di *Switch, *Case e *Istruzioni predefinite

All'interno di una voce *Switch , è possibile inserire solo *Maiuscole/minuscole e *Voci predefinite .

Le voci del file GPD che possono essere inserite all'interno di *Case o *Defaultntries sono denominate voci rilocabili. I tipi di voci GPD seguenti sono rilocabili:

  • La maggior parte degli attributi della stampante, ad eccezione degli attributi di solo livello radice. Gli attributi generali devono essere preceduti da EXTERN_GLOBAL a meno che la voce *Switch non sia a livello radice, non all'interno delle parentesi graffe.

  • Voci *Switch annidate, che consentono di specificare più dipendenze.

  • *Voci di comando.

  • *TTFSEnabled?, che abilita la sostituzione dei caratteri.

I tipi seguenti di voci GPD non sono rilocate:

  • Attributi solo a livello di radice.

  • *Voci TTFS per specificare il tipo di carattere sostituito.

  • *Vincoli, *InvalidCombination, *InvalidInstallableCombination, *NotInstalledConstraints voci che definiscono combinazioni non valide di opzioni, come descritto in Vincoli di opzione.

  • *Funzionalità e *Voci di opzione (anche se gli attributi delle funzionalità e gli attributi delle opzioni sono rilocabili).

Un metodo per determinare se le voci sono state inserite correttamente all'interno delle istruzioni *Case consiste nel rimuovere tutte le istruzioni *Switch e *Case . Se le voci all'interno delle istruzioni *Case sono corrette, sono comunque corrette dopo la rimozione delle istruzioni *Switch e *Case .

Ordinamento delle istruzioni switch in un driver di stampa V4 derivato da un driver di classe

Il file GPD del driver della stampante v4 derivato deve seguire lo stesso ordine del driver della classe di base.

Si consideri il seguente scenario. Si dispone di un driver della stampante v4 derivato da un driver di classe v4 impostando RequiredClass sul driver di classe in un file *-manifest.ini.

Il file GPD del driver di classe ha l'albero switch seguente:

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

Il driver della stampante v4 derivato vuole aggiungere l'opzione MarginSetting , quindi il file GPD avrà l'albero switch seguente:

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

Si noti che resolution viene impostata prima che InputBin nel GPD derivato e MarginSetting siano impostati dopo entrambi. Il file GPD del driver della stampante v4 derivato segue lo stesso ordine del driver della classe base e aggiunge MarginSetting dopo.

Ad esempio, un file GPD derivato in modo non corretto può essere simile al seguente:

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