Compartilhar via


Visão geral das regiões de tecnologia

Se várias tecnologias de apresentação forem usadas em um aplicativo, como WPF, Win32 ou DirectX, elas deverão compartilhar as áreas de renderização em uma janela de nível superior comum. Este tópico descreve problemas que podem influenciar a apresentação e a entrada para seu aplicativo de interoperação do WPF.

Regiões

Em uma janela de nível superior, você pode conceitualizar que cada HWND que abrange uma das tecnologias de um aplicativo de interoperação tem sua própria região (também chamada de "espaço aéreo"). Cada pixel na janela pertence a exatamente um HWND, que constitui a região daquele HWND. (Estritamente falando, há mais de uma região do WPF se houver mais de um HWND do WPF, mas para fins desta discussão, você pode supor que há apenas um). A região implica que todas as camadas ou outras janelas que tentarem renderizar acima daquele pixel durante o tempo de vida do aplicativo devem ser parte da mesma tecnologia de nível de renderização. A tentativa de renderizar pixels do WPF no Win32 leva a resultados indesejáveis e não é permitida tanto quanto possível por meio das APIs de interoperação.

Exemplos de região

A ilustração a seguir mostra um aplicativo que mistura Win32, DirectX e WPF. Cada tecnologia usa seu próprio conjunto de pixels separado, sem sobreposição e não tem problemas de região.

Um exemplo de um aplicativo que mistura Win32, DirectX e WPF.

Suponha que esse aplicativo usa a posição do ponteiro do mouse para criar uma animação que tenta renderizar sobre qualquer uma dessas três regiões. Não importa qual tecnologia era responsável pela animação em si, essa tecnologia violaria a região das outras duas. A ilustração a seguir mostra uma tentativa de renderizar um círculo do WPF em uma região do Win32.

Uma tentativa de renderizar um círculo do WPF em uma região Win32.

Outra violação ocorrerá se você tenta usar a transparência/combinação alfa entre tecnologias diferentes. Na ilustração a seguir, a caixa WPF viola as regiões Win32 e DirectX. Como os pixels nessa caixa do WPF são semitransparentes, eles teriam que pertencer em conjunto ao DirectX e ao WPF, o que não é possível. Portanto, essa é outra violação e não pode ser compilada.

Diagrama mostrando uma caixa WPF violando as regiões Win32 e DirectX.

Os três exemplos anteriores usaram regiões retangulares. No entanto, formas diferentes podem ser usadas. Por exemplo, uma região pode ter um espaço. A ilustração a seguir mostra uma região Win32 com um orifício retangular, esse é o tamanho das regiões WPF e DirectX combinadas.

Diagrama que mostra uma região Win32 com um orifício retangular.

As regiões também podem ser completamente não retangulares ou qualquer forma descritível por um Win32 HRGN (região).

Diagrama que mostra uma região não retangular.

Transparência e janelas de nível superior

O gerenciador de janelas no Windows só processa HWNDs Win32. Portanto, cada WPF Window é um HWND. O Window HWND deve cumprir as regras gerais para qualquer HWND. Dentro desse HWND, o código do WPF pode fazer o que quer que as APIs gerais do WPF suportem. Mas para interações com outros HWNDs na área de trabalho, o WPF deve obedecer às regras de processamento e renderização do Win32. O WPF dá suporte a janelas não retangulares usando APIs Win32 — HRGNs para janelas não retangulares e janelas em camadas para um alfa por pixel.

Não há suporte para alfa constante e chaves de cores. Os recursos de janela em camadas do Win32 variam de acordo com a plataforma.

As janelas em camadas podem tornar a janela inteira translúcida (semitransparente) ao especificarem um valor alfa para aplicar a cada pixel na janela. (O Win32 na verdade suporta alfa por pixel, mas isso é muito difícil de usar em programas práticos porque, nesse modo, você precisaria desenhar qualquer HWND filho, incluindo caixas de diálogo e menus suspensos).

O WPF dá suporte a HRGNs; no entanto, não há APIs gerenciadas para essa funcionalidade. Você pode usar a invocação de plataforma e HwndSource chamar as APIs Win32 relevantes. Para obter mais informações, consulte Chamando funções nativas do código gerenciado.

As janelas em camadas do WPF têm recursos diferentes em diferentes sistemas operacionais. Isso ocorre porque o WPF usa o DirectX para renderizar e as janelas em camadas foram projetadas principalmente para renderização GDI, não para renderização DirectX.

  • O WPF dá suporte a janelas em camadas aceleradas por hardware.

  • O WPF não dá suporte a chaves de cor de transparência, pois o WPF não pode garantir a renderização da cor exata solicitada, especialmente quando a renderização é acelerada por hardware.

Para obter mais informações sobre as limitações das regiões de interoperabilidade, consulte HWNDs dentro do WPF.

Confira também