Compartilhar via


Interoperação do WPF: Visão geral de regiões de janela e "Airspace"

"Espaço aéreo" é uma forma conceitual de pensar na maneira como as duas metades de um aplicativo de interoperação compartilham as áreas de renderização em uma janela de nível superior comum. Este tópico explica como o conceito de "espaço aéreo" pode influenciar o design da apresentação, bem como as considerações sobre o input para seu aplicativo de interoperação WPF.

Espaço aéreo

Em uma janela de nível superior, você pode imaginar que cada HWND que compreende uma das tecnologias de um aplicativo de interoperação tem seu próprio "espaço aéreo". Cada pixel dentro da janela pertence a exatamente uma HWND, que constitui o espaço aéreo daquela HWND. (Estritamente, há mais de um espaço aéreo WPF se houver mais de uma HWND WPF, mas para fins de explicar o conceito, suponha que há apenas um nos exemplos fornecidos neste tópico). O conceito de espaço aéreo implica que todas as camadas ou outras janelas que tentarem renderizar sobre aquele pixel durante o tempo de vida do aplicativo devem ser parte da mesma tecnologia de nível de renderização. Tentativas de renderizar pixels WPF por coma de Win32 produz resultados indesejáveis, e é proibido o quanto for possível por meio das APIs de interoperação.

Espaço aéreo por exemplo

O primeiro exemplo ilustra um aplicativo que mistura Win32, DirectX e WPF. Cada tecnologia usa seu próprio conjunto separado e disjunto de pixels, e não há problemas de espaço aéreo.

Uma janela que não tem problemas de espaço aéreo

Mas suponha que você inicie a partir desse aplicativo e crie uma animação que é controlada pela posição do ponteiro do mouse e, portanto, pode tentar renderizar sobre qualquer uma dessas três regiões. Eventualmente isso violaria o espaço aéreo. Não importa qual tecnologia era responsável pela animação e si; essa tecnologia violaria o espaço aéreo das outras duas. Isso é ilustrado na figura a seguir, onde o círculo verde está tentando mover-se pela janela:

Diagrama de interoperabilidade

Outra violação do espaço aéreo é se você tentar usar transparência/composição alpha entre diferentes tecnologias. Na figura abaixo, a caixa WPF está violando o espaço aéreo de Win32 e DirectX. Como pixels naquela caixa WPF são semitransparentes, eles precisariam ser propriedade conjunta por DirectX e WPF, o que não é possível. Portanto, esta é outra violação do espaço aéreo e não pode ser criado:

Diagrama de interoperabilidade

Os três exemplos anteriores usaram regiões retangulares, mas o espaço aéreo não necessariamente precisa ser retangular. Ele pode ser um retângulo com um buraco (por exemplo, o espaço aéreo Win32 aqui inclui tudo exceto o espaço aéreo WPF e DirectX):

Diagrama de interoperabilidade

Espaços aéreos também podem ser totalmente não retangulares, ou qualquer forma descritível por uma HRGN Win32 (região):

Diagrama de interoperabilidade

Transparência e janelas no nível superior

O processo do gerenciador de janelas (tanto em Windows Vista quanto em Microsoft Windows XP) na verdade processa somente HWNDs de Win32, portanto, cada Window de WPF é um HWND. O HWND do Window deve seguir as regras gerais para qualquer HWND. Dentro dessa HWND, código WPF pode fazer tudo o que a APIs geral do WPF suportar. Mas para interações com outros HWNDs na área de trabalho, WPF devem obedecer aos Win32 renderização e regras de renderização. WPF supports non-rectangular windows by using Win32 APIs—HRGNs for non-rectangular windows, and layered windows for a per-pixel alpha.

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

Janelas em camadas podem tornar a janela inteira translúcida (semitransparente) especificando um valor alpha para aplicar a cada pixel na janela. (Win32, na verdade, oferece suporte a alpha por pixel, mas isso é muito difícil de usar em programas práticos porque neste modo você precisaria desenhar qualquer HWND-filho você mesmo, inclusive caixas de diálogo e dropdowns).

WPF suporta HRGNs; no entanto, há não gerenciado APIs para essa funcionalidade. Você pode usar invocação de plataforma e HwndSource para chamar as APIs Win32 relevantes. Para mais informações, consulte: Chamar Nativo funções de código gerenciado.

Janelas em camadas WPF têm recursos diferentes em sistemas operacionais diferentes (isso ocorre porque WPF usa DirectX para renderizar, e janelas em camadas principalmente foram projetadas principalmente para renderização em GDI, não DirectX):

  • WPF oferece suporte a janelas em camadas com aceleração por hardware no Windows Vista. Janelas em camadas com aceleração por hardware no Microsoft Windows XP exigem suporte de Microsoft DirectX, portanto, os recursos dependerão da versão do Microsoft DirectX naquela máquina.

  • WPF não tem suporte para cores-chave de transparência, porque WPF não pode garantir a renderização da cor exata solicitada, especialmente quando a renderização é acelerada por hardware.

  • Se executando no Microsoft Windows XP, janelas em camadas por cima de superfícies DirectX piscarão quando o aplicativo DirectX renderizar. (A sequência de renderização real é que Microsoft Windows Graphics Device Interface (GDI) oculta a janela em camadas, depois DirectX desenha, e finalmente Microsoft Windows Graphics Device Interface (GDI) recoloca a janela em camadas). Janelas em camadas que não são WPF também têm essa limitação.

Consulte também

Tarefas

Tutorial: Criar um aplicativo Win32 Hosting conteúdo WPF

Tutorial: Criar um aplicativo WPF hospedando o conteúdo do Win32

Conceitos

Visão geral sobre interoperabilidade entre WPF e Win32