Istruzioni condizionali

Importante

È consigliabile 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 stampanti.

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

Il linguaggio GPD fornisce istruzioni condizionali simili a C che consentono di descrivere le dipendenze che alcuni attributi della stampante possono avere sulla configurazione di una stampante. Ad esempio, i margini e l'origine del cursore per una pagina potrebbero 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 , proprio come nel linguaggio C. Se non si includono tutte le opzioni e non si include un'istruzione *Default , è necessario valutare gli attributi pertinenti (nell'esempio * PrintableArea, *PrintableOrigin e *CursorOrigin) altrove nel file GPD, prima dell'istruzione *Switch .

Specifica di più dipendenze

È possibile includere le 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, l'attributoX è impostato su ValueX.

Se l'utente ha selezionato l'opzioneA per feature1, l'opzioneC per feature2 e l'opzioneE per feature3, l'attributoX è impostato su ValueY.

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

Le regole seguenti si applicano quando si specificano più dipendenze:

  • È 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 annidata.

Dove 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 *Case e * Voci predefinite .

Le voci di file GPD che possono essere inserite all'interno di *Case o * Voci predefinite vengono definite voci spostabili. I tipi seguenti di voci GPD sono rilocalizzabili:

  • La maggior parte degli attributi della stampante, ad eccezione degli attributi di sola 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 consente la sostituzione dei caratteri.

I tipi seguenti di voci GPD non sono rilocalizzabili:

  • Attributi di sola livello 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 opzione (anche se gli attributi delle funzionalità e gli attributi delle opzioni sono rilocazione).

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 ancora corrette dopo la rimozione delle istruzioni *Switch e *Case .

Ordinamento di 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 di classe di base.

Si consideri lo scenario seguente. 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 degli 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 degli 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 La risoluzione è impostata prima che InputBin nell'oggetto Criteri di gruppo derivato e MarginSetting sia impostato dopo entrambi. Il file GPD del driver della stampante v4 derivato segue lo stesso ordine del driver della classe di base e aggiunge MarginSetting dopo.

Ad esempio, un file CRITERI di gruppo 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