Pergunta

Estamos desenvolvendo um aplicativo de pele com várias bordas arredondadas na maioria de suas janelas. Eu estou usando regiões de janela para definir formas não-retangulares, mas quase todos os objetos ao irregulares aliasing este causas, porque pixels só pode ser totalmente opaca ou totalmente transparente.

Eu vim com uma solução para isso usando janelas em camadas, mas queremos ter certeza que essa será executado (e espero correr bem) em uma variedade de sistemas, e eu quero ver se alguém tem alguma idéia melhor, ou maneiras de otimizar o que estou fazendo. Eu sei janelas em camadas requer win2000 ou mais tarde, e que é bom, porque isto já é uma exigência por outras razões. A partir de alguns testes básicos parece ok no Vista, mas isso não é garantia ainda.

Aqui está o que eu faço: Eu tenho uma janela, chame-A, com controles e texto e qualquer compreende essa janela. Eu tenho janela B como um filho da janela A, exceto que ele tem o estilo WS_POPUP vez de WS_CHILD, para que ele possa posicionar-se fora da região de A e é desenhada em cima dos controles de A. Janela B também tem o estilo WS_EX_LAYERED, e na inicialização, eu chamo UpdateLayeredWindow com a bandeira ULW_ALPHA e uma fonte DC com um bitmap de 32 bits com um canal alfa, para obtê-lo a desenhar com alfa por pixel.

O bitmap usado na fonte DC para a janela B é praticamente apenas os pixels ao redor da borda da janela que eu quero misturar suavemente de fundo da janela para a total transparência. Gostaria que ignorar a abordagem de dois janela inteira e usar apenas uma única janela em camadas, exceto que quando você está usando UpdateLayeredWindow, ele é desenhado a partir de um tampão mantido na memória, em vez das mensagens WM_PAINT típicas e tudo isso, e tentar obter controles filho interativos (e janelas filho) para trabalhar bem com isso soa como um aborrecimento notável (e provavelmente não iria mesmo trabalhar para tudo).

Assim, é basicamente janela Um com todos os controles filho e tudo, com a janela B flutuante diretamente em cima dela, desenhando uma borda lisa agradável. I responder às mensagens WM_MOVE e assim por diante, movendo a janela B junto com ele, e eu tenho janela B desativada por isso nunca pode obter o foco ou de entrada (cliques já percorrer, uma vez que partes dela que são de opacidade zero, tais como a maioria de suas partes internas, já estão excluídos picking).

Para chutes, aqui está o que as peças parecem, para mostrar o que eu quero dizer um pouco melhor.

Assim, ele funciona, mas eu não posso ter a certeza de que é realmente a melhor maneira de fazer isso. Eu tenho duas perguntas:

  • Será que este som aceitável, ou há alguma coisa flagrantemente terrível sobre isso?
  • Como ele trabalha atualmente, parece que ele está usando um fora da tela tamponar o tamanho da janela (que pode ser de até 1024x768), embora muito poucos pixels de que tem todos os dados de opacidade diferentes de zero - seria vale a pena a sobrecarga ea complexidade adicional de cortá-lo em pedaços de fronteira separados e composição-los juntos?
Foi útil?

Solução

Os meus usos do produto em camadas janelas para desenhar as pequenas abas que ligam a cada janela. Eu costumava janelas em camadas para obter o arredondamento suave sem aliasing. O único problema desagradável eu ter executado em até agora é que algumas janelas OpenGL rabiscar em cima de janelas em camadas no Windows XP e Vista sem DWM. Seu problema um nível baixo e Microsoft não foi terrivelmente útil. Você pode reproduzi-lo, abrindo o Google Earth e arrastando sua aplicação sobre a janela de renderização principal, a sua janela em camadas irá desaparecer.

Outras dicas

Eu descobri uma coisa: ter peças quadro separado pode tornar significativamente mais rápido do que ter uma única janela do quadro gigante, com uma grande extensão de pixels vazios no meio. Eu não tenho quaisquer números reais, mas só a partir de um teste rápido de tentar ambos, houve uma latência perceptível quando várias janelas com janelas full frame sobrepostos uns aos outros, mas quando os seus quadros foram cortados em componentes menores, era muito snappier . Seja qual for a sobrecarga de ter múltiplas janelas em camadas com seus próprios contextos de dispositivo não contribui muito, e ter grandes extensões de pixels (em branco ou não!) Ainda contribui muito mais carga.

  1. Não se esqueça de teste sob RDP e VM (Hyper-V & VMWare)
  2. Tente vários cartões GFX e sobre netbooks e laptops (se aplicável).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top