Partilhar 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 WPF.

Regiões

Dentro de uma janela de nível superior, você pode conceituar que cada HWND que compreende 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 dentro da janela pertence exatamente a um HWND, que constitui a região desse HWND. (Estritamente falando, há mais de uma região WPF se houver mais de um WPF HWND, mas para fins desta discussão, você pode assumir que há apenas uma). A região implica que todas as camadas ou outras janelas que tentam renderizar acima desse pixel durante o tempo de vida do aplicativo devem fazer parte da mesma tecnologia de nível de renderização. A tentativa de renderizar pixels WPF sobre Win32 leva a resultados indesejáveis e não é permitida na medida do possível pelas APIs de interoperabilidade.

Exemplos de regiões

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

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

Suponha que este aplicativo use a posição do ponteiro do mouse para criar uma animação que tenta renderizar em qualquer uma dessas três regiões. Não importa qual tecnologia fosse 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 WPF sobre uma região Win32.

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

Outra violação é se tentar usar transparência/fusão alfa entre diferentes tecnologias. Na ilustração a seguir, a caixa WPF viola as regiões Win32 e DirectX. Como os pixels nessa caixa WPF são semitransparentes, eles teriam que ser de propriedade conjunta do DirectX e do WPF, o que não é possível. Portanto, esta é outra violação e não pode ser construída.

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

Os três exemplos anteriores usavam regiões retangulares, mas formas diferentes são possíveis. Por exemplo, uma região pode ter um buraco. A ilustração a seguir mostra uma região Win32 com um orifício retangular: este é 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-rectangulares, ou qualquer forma que possa ser descrita por um Win32 HRGN (região).

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

Transparência e Top-Level Windows

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

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

As janelas em camadas podem tornar toda a janela translúcida (semitransparente) especificando um valor alfa a ser aplicado a cada pixel da janela. (Na verdade, o Win32 suporta alfa por píxel, mas é muito difícil de usar em programas práticos porque, neste modo, teria que desenhar qualquer janela filha HWND manualmente, incluindo diálogos e menus suspensos).

WPF suporta HRGNs; no entanto, não há APIs gerenciadas para essa funcionalidade. Você pode usar a invocação da plataforma (P/Invoke) e o HwndSource para chamar as APIs Win32 relevantes. Para obter mais informações, consulte Chamando funções nativas do Managed Code.

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

  • O WPF suporta janelas em camadas aceleradas por hardware.

  • O WPF não oferece suporte a chaves de cores de transparência, porque 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 no WPF.

Ver também