Retornando modos de exibição: DrvGetModes

O driver de exibição também deve dar suporte a DrvGetModes. Essa função fornece à GDI um ponteiro para uma matriz de estruturas DEVMODEW . As estruturas definem os atributos da exibição para os vários modos compatíveis, incluindo a dimensão (em pixels e milímetros), número de planos, bits por plano, informações de cor e assim por diante.

A ordem na qual um driver grava os modos de exibição disponíveis na memória quando a função DrvGetModes é chamada pode afetar o modo de exibição final escolhido pelo Windows. Em geral, se um aplicativo não especificar um modo padrão, o sistema selecionará o primeiro modo de correspondência na lista fornecida pelo driver.

Por exemplo, suponha que o modo de exibição atual seja

800x600x32bpp@60Hz DMDO_DEFAULT DMDFO_CENTER

e o driver especifica a lista de modos de exibição disponíveis da seguinte maneira:

Mode Detalhes do modo
A 600x800x32bpp@60Hz DMDO_270 DMDFO_STRETCH
B 600x800x32bpp@60Hz DMDO_90 DMDFO_STRETCH
C 600x800x32bpp@60Hz DMDO_90 DMDFO_CENTER
D 600x800x32bpp@60Hz DMDO_270 DMDFO_CENTER
  • Caso 1

    Se um aplicativo tentar definir o monitor como 600x800x32bpp@60Hz, mas os sinalizadores DM_DISPLAYORIENTATION e DM_DISPLAYFIXEDOUTPUT não forem definidos no membro dmFields de DEVMODEW, o sistema deverá escolher a orientação e os modos de saída fixos. Nesse caso, o sistema escolherá o modo de exibição C porque é o primeiro modo listado que corresponde à configuração de DMDFO_CENTER atual.

  • Caso 2

    Se o aplicativo tentar definir o monitor como 600x800x32bpp@60Hz DMDFO_STRETCH, o sistema escolherá o modo de exibição A.

  • Caso 3

    Se o aplicativo tentar definir o monitor como 600x800x32bpp@60Hz DMDO_270, o sistema escolherá o modo de exibição D.

  • Caso 4

    Se o aplicativo tentar definir o monitor como 600x800x32bpp@60Hz DMDO_DEFAULT, o sistema não encontrará uma correspondência aceitável.

Uma exceção se aplica a essas regras: quando o sistema busca uma correspondência para a orientação de exibição e a orientação não é especificada e o modo atual não pode ser correspondido, o sistema dará prioridade DMDO_DEFAULT sobre outras orientações de exibição.

Por exemplo, suponha que o modo de exibição atual seja

600x800x32bpp@60Hz DMDO_90 DMDFO_STRETCH

e o driver especifica a lista de modos de exibição disponíveis da seguinte maneira:

Mode Detalhes do modo
A 800x600x32bpp@60Hz DMDO_180 DMDFO_CENTER
B 800x600x32bpp@60Hz DMDO_180 DMDFO_STRETCH
C 800x600x32bpp@60Hz DMDO_DEFAULT DMDFO_CENTER
D 800x600x32bpp@60Hz DMDO_DEFAULT DMDFO_STRETCH

Nessa situação, se o aplicativo tentar definir o monitor como 800x600x32bpp@60Hz, o sistema escolherá o modo de exibição D.