Win32: Cómo dibujar fuera de mi ventana?
-
19-09-2019 - |
Pregunta
En cuanto a una ventana de la pista de clase tooltips
de Windows, veo que extrae su sombra base fuera rectángulo real de la ventana de la pista.
Con SpyXX - puedo conseguir rect ventana de la información sobre herramientas y estilos de clase:
Rectangle: (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect: (0, 0)-(104, 20), 104x20
Se dará cuenta de que la sombra que se ve es físicamente fuera de la ventana que se está elaborando. ¿Cómo se dibuja una sombra exterior alrededor de mi ventana, mientras que ser fuera mi ventana?
Nota: la sombra no se dibuja usando el estilo estándar de la clase CS_DROPSHADOW
he confirmado experimentalmente, y también se puede ver el estilo de clase de la ventana en la SpyXX ; que no utiliza 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
Entonces, ¿cómo puedo sacar fuera de mi ventana?
Nota: Tratando de dibujar en el escritorio de CC está fuera. A partir de Greg Schechter redireccionante GDI, DirectX y aplicaciones WPF :
Dibujo y lectura de la pantalla - baaaad
Por último, ya que estamos en la redirección tema, uno particularmente peligroso la práctica está escribiendo en la pantalla, ya sea mediante el uso de GetDC (NULL) y la escritura para que, o intentar hacer XOR líneas de banda de caucho, etc. son dos grandes razones por las que la escritura de la pantalla es mala:
Es caro ... por escrito a la pantalla en sí no es caro, pero casi siempre está acompañada de la lectura de la pantalla porque uno normalmente no leer-modificar-escribir operaciones XOR como al escribir a la pantalla. La lectura desde el video superficie de la memoria es muy caro, requiere sincronización con el DWM, y puestos de todo el tubo de GPU, como así como el tubo de aplicación DWM.
Es impredecible ... si de alguna manera gestionar llegar al primario real y escribir en él, no puede haber previsibilidad en cuanto a cuánto tiempo lo que escribió al primario permanecerá en pantalla. Desde la UCE no sabe al respecto, puede ser anulado en el fotograma siguiente actualización, o puede persistir durante mucho tiempo, dependiendo de ¿Qué más necesita ser actualizado en el pantalla. (Realmente no permitimos directa escrito a la primaria de todos modos, para esa misma razón ... si intenta acceder a las primarias de DirectDraw, por ejemplo, el DWM se apagará hasta se cierra la aplicación que accede)
Solución
No se puede dibujar fuera de su ventana de la manera que usted describe.
Si hace clic derecho sobre el escritorio y luego ir a propiedades / Apariencia / Efectos y desmarque 'Mostrar sombras bajo los menús' ... ya no tendrá la sombra.
El fondo es que este es un producto del gestor de ventanas no su programa.
Otros consejos
Q: ¿Cómo se dibuja exterior de una ventana? A: dibujar dentro de otro Ventana
Lo primero a destacar es que la clase información sobre herramientas realidad hace utiliza el estilo CS_DROPSHADOW
- pero tenga en cuenta que este es un class estilo, no un Ventana estilo, por lo que tiene que mirar el Class pestaña en las propiedades de Spy ++ diálogo para encontrarlo. Vas a ver que las ventanas tooltips_class32
tiene de hecho esto -. Y algunos otros
Pero eso lleva a la siguiente pregunta - ¿cómo lo hace que trabajo? Pues bien, parece que Windows implementa mediante la creación de un ayudante HWND para dibujar la sombra - presumiblemente está creando otra ventana emergente del mismo tamaño y forma que el uno está sombreado, llenándolo de color gris, colocándolo directamente debajo de la ventana principal, y el ajuste como un WS_EX_LAYERED ventana para que la sombra puede ser transparente y fade out alrededor de los bordes utilizando alfa-mezcla. Y no hay nada que le impida el uso de las mismas o similares técnicas de sí mismo si desea añadir un tipo diferente de efecto de sombra a una de sus propias ventanas.
Así, larga historia corta: si desea dibujar fuera de su propia ventana, crear una ventana transparente ayudante en el área general que desea recurrir, y se basan en esa ventana de ayuda en vez .
-
Ahora, si se intenta encontrar una de estas ventanas ayudante de sombra en Spy ++, no encontrará mucho. A diferencia de las ventanas tooltip_class32
, que son de larga vida y simplemente ocultar / mostrar a sí mismos como sea necesario, estas ventanas de sombra son una criatura más difícil de alcanzar: que sólo se crean durante el tiempo que sea necesario, por lo que tendría que actualizar Spy ++, mientras que hay una información sobre herramientas o el menú emergente u otra ventana usando la sombra presente - y eso es complicado, ya que la mayoría de la información de herramientas y menús desaparecerán tan pronto como se mueve el ratón para cambiar a Spy ++. Pero resulta que la información sobre herramientas en la barra de herramientas propia Spy ++ 's se quedarán: así que empieza Spy ++, coloca el cursor sobre un elemento de la barra de herramientas, y pulsa F5
para refrescar el árbol HWND mientras que la información sobre herramientas y sombras están presentes. Ahora se desplaza hacia abajo, y debería ver el tercer y cuarto HWNDs visibles en el árbol son la información de herramienta en sí, y justo después de eso, una ventana SysShadow
. Por desgracia, ya que la información sobre herramientas y sombras tienen por ahora desaparecieron, si se intenta obtener el diálogo de propiedades que HWND, obtendrá un obtener un diálogo de propiedad en blanco con el mensaje de una 'ventana no válida'. Si realmente quiere hurgar y ver cómo funciona ese SysShadow, qué estilos que a su vez utiliza y así sucesivamente, se puede crear una aplicación de destino con un emergente de larga duración que utiliza CS_DROPSHADOW
que entonces se puede explorar en Spy ++ en el ocio.
(Por último, tenga en cuenta que estas sombras son una cosa completamente diferente a las sombras que se ven cuando hay una ventana de aplicación es en la parte superior de la otra por encima de otro puesto de Vista: este tipo de sombra es parte del modo de Aero Glass y manejado por el mismo Desktop Manager Composición que se suma el efecto barra de título de vidrio, y no utiliza o necesita ventanas de ayuda para aplicar las sombras.)
No me sorprendería si esa sombra está íntimamente ligada al gestor de ventanas en sí; después de todo es el gestor de ventanas que decide lo ventana se pone a pintar piezas que de sí mismo y cuando que puede hacerlo. Yo no lo veo como un genio para pintar esa sombra si el control sobre todo lo que se gana, que tiene el gestor de ventanas.