Pregunta

He creado una capas ventana añadiendo el del WS_EX_LAYERED estilo extendido:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

Windows utilizará negro como el valor de color chroma key. Voy a dejar un gran borde de negro para hacer que el problema obvio:

alt text


Una vez que se construye la ventana, lo cuento a utilizar el negro como color chroma-key:

SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);

Ahora aparece parcialmente transparente la ventana emergente en capas:

alt text


El problema es el paso final. Quiero usar CS_DROPSHADOW estilo de clase , disponible ya que Windows XP, para crear una sombra base:

wndClass.Style = wndClass.Style | CS_DROPSHADOW;

Aparece la sombra, pero la sombra rodea la ventana rectangular original, y no toma en cuenta la transparencia de la ventana proporcionada por la ventana por capas:

¿Alguien sabe qué opción mágica que he perdido en algún lugar que hará que la sombra paralela honor a la ventana por capas no rectangular?


Otro ejemplo en el que aparece este problema es cuando no se incluye el relleno 6px / margen. La ventana de la pista como dibujado por temas Windows® es no rectangular. Esto deja un pequeño espacio visible en la ventana es transparente, pero no aparece la sombra:

alt text

Microsoft ha logrado hacer que funcione, como se puede ver en esta receta de Internet Explorer:

alt text


Mirando más de cerca a una ventana de la pista de clase de Windows tooltips. Con SpyXX - puedo conseguir su rect ventana, y estilos de clase:

SpyXX dice:

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

Así que todo apunta a que la propia ventana siendo 104x20 píxeles, con la sombra de la gota fuera de la ventana en sí. (Lo cual es consistente con CS_DROPSHADOW.)

A continuación puedo mirar a los estilos de la clase de ventana tooltips:

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

Lo interesante es que no utiliza CS_SAVEBITS (0x800); que es útil para las ventanas pequeñas, de corta duración,.

ni utiliza CS_DROPSHADOW (0x20000). Así que ahora me pregunto cómo se dibuja fuera de su propia ventana?

Nota:. ventanas en capas transparentes se documenta como la técnica preferida sobre regiones

Editar Capas de Windows han existido con Windows 2000. CS_DropShadow se añadió con XP

.
¿Fue útil?

Solución

  

ventanas por capas transparentes se documenta como la técnica preferida sobre regiones.

Sin embargo, CS_DROPSHADOW hace prestar atención a las regiones. Si recorta o dar forma a su ventana usando una región de otra forma, la sombra base seguirá el nuevo esquema.

Afortunadamente, puede las regiones de uso con ventanas superpuestas, y mediante la combinación de los dos conseguir el efecto que está buscando.

Por cierto:. Tooltips_class32 hace CS_DROPSHADOW uso - no se verá en los estilos de ventana porque es un estilo de clase, no un estilo de ventana

Otros consejos

¿Por qué no utilizar LWA_ALPHA y construir la sombra en la imagen?

Editar en respuesta a los tu comentario:

A) No se deja de usar un alfa PNG canalizada por sólo una sombra. BLT las 2 imágenes juntos y utilizar como una sola imagen.
B) No es difícil para generar una sombra. En la imagen se registró su negro con 3 diferentes valores alfa.
C) Sin embargo, no funciona lo hace? es decir, momento de ser creativo.
D) Entonces no tratar de conseguir ventanas para hacer algo que no lo hará por ti.
E) es totalmente irrelevante. ventanas superpuestas que manejan para usted.

Recomiendo a aprender más acerca de las ventanas en capas, ya que le puede ayudar a su objetivo.

Edit2: Usted tiene el mapa de bits. Su bastante fácil de escanear a través de la imagen y encontrar los bits que será introducido en color (mediante la identificación del mismo negro) y la gallina modificar esa tener un alfa de 0 donde todo lo demás tendrá un alfa de 255 (No: Puede que tenga que convertir la imagen de una imagen de 32 bits de un formato de color inferior a, usted puede hacer esto mediante la creación de un nuevo DC y la copia de la imagen). Esto le dará el mismo efecto con LWA_ALPHA como con LWA_COLORKEY. A partir de ahí su bastante fácil de identificar el pixel en el borde, donde el color cambia a (R = 0, G = 0, B = 0, A = 0). A continuación, cambiar ese primer elemento de imagen para tener un n alfa del 192, el golpe a 128 y el de abajo a 64. Ahora tiene una gradación alpha'd debajo de la imagen que se verá como la sombra. Se puede ajustar el alfa para conseguir el efecto deseado.

CS_DROPSHADOW sólo funciona con ventanas rectangulares estándar. WS_EX_LAYERED ventanas no son compatibles con todo. Son más de un bajo nivel, método de auto-servicio para dibujar exactamente lo que quiere.

Para obtener una gota de sombra, que tendrá que generar la sombra paralela a sí mismo desde el canal alfa en la imagen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top