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. (A rigor, há mais de uma região WPF se houver mais de uma WPF HWND, mas para fins desta discussão, você pode presumir que há apenas uma). 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 sobre Win32 leva a resultados indesejáveis e é proibida 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.

An example of an application that mixes Win32, DirectX, and 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.

An attempt to render a WPF circle over a Win32 region.

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 WPF são semitransparentes, eles teriam que ser de propriedade conjunta do DirectX e do WPF, o que não é possível. Portanto, essa é outra violação e não pode ser compilada.

Diagram showing a WPF box violating the Win32 and DirectX regions.

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 que é o tamanho das regiões WPF e DirectX combinadas.

Diagram that shows a Win32 region with a rectangular hole.

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

Diagram that shows a nonrectangular region.

Transparência e janelas de nível superior

O gerenciador de janelas no Windows só realmente processa Win32 HWNDs. Portanto, todo WPF Window é um HWND. O Window HWND deve cumprir as regras gerais para qualquer HWND. Dentro desse HWND, o código WPF pode fazer o que as APIs gerais do WPF suportarem. 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 oferece 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. (Win32 na verdade suporta alfa por pixel, mas isso é muito difícil de usar em programas práticos porque neste modo você precisaria desenhar qualquer filho HWND mesmo, incluindo diálogos e dropdowns).

WPF suporta HRGNs; no entanto, não há APIs gerenciadas para essa funcionalidade. Você pode usar a plataforma invocar 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 DirectX para renderizar, e as janelas em camadas foram projetadas principalmente para renderização GDI, não para renderização DirectX.

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

Confira também