Pergunta

Olhando para uma janela de classe tooltips dica do Windows, eu ver que ele tira a sua gota-sombra fora retângulo real da janela de dica.

Usando SpyXX - i pode obter rect janela da dica de ferramenta e estilos de classe:

Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect:   (0, 0)-(104, 20), 104x20

Você notará que a sombra que você vê é fisicamente fora a janela que está sendo desenhado. Como posso desenhar uma sombra em torno do lado de fora da minha janela, sendo fora minha janela?

Nota : a sombra não é desenhado usando o estilo de classe CS_DROPSHADOW padrão i já confirmou esta experimentalmente, e também pode ver o estilo de classe é para a janela em SpyXX ; ele não usa CS_DROPSHADOW:

Windows Styles:     94000001

    WS_POPUP        80000000
    WS_VISIBLE      10000000
    WS_CLIPSIBLINGS  4000000
    TTS_ALWAYSTIP          1

Extended Styles:    00080088

    WS_EX_LAYERED      80000
    WS_EX_TOOLWIN         80
    WS_EX_TOPMOST          8

Assim como pode eu tiro de fora da minha janela?

Nota: Tentar desenhar na área de trabalho DC está fora. A partir de Greg Schechter Redirecionando GDI, DirectX e aplicativos WPF :

Desenho e Lendo A partir da tela - Baaaad

Por último, uma vez que estamos no redirecionamento tópico, uma particularmente perigosa prática é escrita para a tela, quer através da utilização de GetDC (NULL) e escrever para que, ou a tentativa de Do XOR linhas de borracha de banda, etc. Há são duas grandes razões que escrever para a tela é ruim:

É caro ... escrito ao tela em si não é caro, mas é quase sempre acompanhada por a leitura da tela, porque um normalmente faz ler-modificar-escrever operações como XOR ao escrever para a tela. Lendo a partir do vídeo superfície de memória é muito caro, requer sincronização com o DWM, e tendas de todo o tubo GPU, como bem como o tubo de aplicação DWM.
É imprevisível ... se você de alguma forma conseguem chegar ao primário real e escrever para ela, não pode não ser previsibilidade de quanto tempo que você escreveu para o primário permanecerá no tela. Desde o UCE não sabe sobre isso, pode ser apagado na próximo quadro de actualização, ou pode persistir por um tempo muito longo, dependendo o que mais precisa ser atualizado na tela. (Nós realmente não permitem direta escrevendo para o primário de qualquer forma, para isso mesmo ... se você tentar acessar o DirectDraw primário, por exemplo, o DWM será desligado até sai do aplicativo acessando)

Foi útil?

Solução

Você não pode desenhar fora de sua janela da maneira que você descreve.

Se você clique direito seu desktop, em seguida, ir para propriedades / aparência / efeitos e desmarque 'Mostrar sombras sob menus' ... você já não terá a sombra.

A linha inferior é que este é um produto do gerenciador de janelas não o seu programa.

Outras dicas

Q: Como você desenhar fora de uma janela? A: Desenhe dentro outro janela

A primeira coisa a notar é que a classe dica realmente faz usar o estilo CS_DROPSHADOW - mas nota que este é um class estilo, não um janela estilo, então você tem que olhar para o Class na Spy ++ diálogo de propriedades para encontrá-lo. Você verá que as janelas tooltips_class32 de fato tem isso -. E alguns outros

Mas isso só leva à próxima pergunta - como faz que trabalho? Bem, parece que implementa o Windows isso criando um HWND ajudante para desenhar a sombra - presumivelmente é a criação de uma outra janela pop-up do mesmo tamanho e forma como aquele que de sombreamento, enchendo-o com cinza, colocando-o diretamente abaixo da janela principal e ajuste -lo como um WS_EX_LAYERED janela para que a sombra pode ser transparente e fade out torno das bordas, utilizando alfa-mistura. E não há nada para impedi-lo de usar as mesmas ou semelhantes técnicas de si mesmo se você quiser adicionar um tipo diferente de efeito de sombra de uma das suas próprias janelas.

Então, longa história curta: se você quiser tirar fora de sua própria janela, criar uma janela transparente ajudante na área geral que pretende desenhar, e desenhar sobre essa janela ajudante vez .

-

Agora, se você tentar encontrar uma dessas janelas ajudante de sombra em Spy ++, você não vai encontrar muito. Ao contrário das janelas tooltip_class32, que são de longa duração e apenas ocultar / mostrar-se como necessário, essas janelas de sombra são uma criatura mais evasivo: eles são criados apenas durante o tempo que for necessário, para que você teria que atualizar Spy ++ enquanto há uma dica de ferramenta ou no menu pop-up ou outra janela usando a sombra presente - e isso é complicado, pois a maioria das dicas de ferramentas e menus irá desaparecer assim que você mover o mouse para mudar para Spy ++. Mas verifica-se que as dicas sobre própria barra de ferramentas 's Spy ++ vai ficar por aqui: assim que começar a Spy ++, passar o mouse sobre um item na barra de ferramentas e F5 hit para atualizar a árvore HWND enquanto a dica de ferramenta e sombra estão presentes. Agora rolar para baixo, e você deve ver o terceiro e quarto HWNDs visíveis na árvore são a própria dica, e logo depois disso, uma janela SysShadow. Infelizmente, uma vez que a dica de ferramenta e sombra têm até agora desapareceu, se você tentar obter as propriedades de diálogo para que HWND, você vai ter um obter um diálogo de propriedades em branco com a mensagem de uma 'janela inválido'. Se você realmente quer picar ao redor e ver como isso funciona SysShadow, que estilos ele próprio usa e assim por diante, você pode criar um aplicativo alvo com um pop-up de longa duração que usos CS_DROPSHADOW, que você pode explorar em Spy ++ no lazer.

(Por fim, nota que essas sombras são uma coisa completamente diferente do que as sombras que você vê quando uma janela aplicativo é em cima do outro acima de outra, desde Vista: este tipo de sombra é parte do modo Aero Glass, e tratado pelo mesmo desktop Composição Gestor que adiciona o efeito da barra de título vidro, e ele não usa nem janelas necessidade de ajuda para implementar as sombras.)

Eu não ficaria surpreso se essa sombra está intimamente ligada ao próprio gerenciador de janelas; que é, afinal, o gerenciador de janelas que decide o janela começa a pintar que partes de si mesmo e quando pode fazê-lo. Eu não vê-lo como ciência do foguete para pintar aquela sombra se o controle sobre tudo o que se ganha, que o gerenciador de janelas tem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top