Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cuál es la idea detrás de Procedural Snow (Regalo de Navidad)?

¿Cuál es la idea detrás de Procedural Snow (Regalo de Navidad)?

De hecho. La pregunta es muy simple. ,

Hay muchas formas de implementarlo:

☆ Método uno:

Inicialización. . . . .

1. Primero cree un mapa de bits del mismo tamaño que el escritorio (hBmpDesktop).

2. Utilice ganchos para interceptar mensajes WM_PAINT desde ventanas de escritorio.

Nuevo mensaje WM_PAINT. . . . . .

3. Llame al WM_PAINT original del escritorio, pero dibújelo en un mapa de bits (hBmpDesktop) en lugar de dibujarlo en el escritorio.

4. Vuelve a dibujar el copo de nieve en el mapa de bits.

5. Copie el mapa de bits al DC del escritorio. (Copia el mapa de bits)

De esta manera, no importa cómo el usuario manipule el escritorio, el fondo de los copos de nieve siempre será el escritorio, porque la ventana del escritorio se dibuja en el "fondo" cada vez.

☆Método 2:

1. Crea una ventana transparente con una transparencia totalmente transparente y un estilo que esté siempre en la parte superior. Y defina la máscara de color (ColorKey) como un color que no sea un copo de nieve. De esta manera se pueden pintar los copos de nieve, mientras que los demás colores quedan transparentes.

3. Según el mensaje WM_PAINT, primero dibuja el fondo de la ventana (no uses el mismo color que el copo de nieve). Luego dibuja los copos de nieve.

2. Corresponda a WM_KEYDOWN, WM_MOUSEMOVE y otros mensajes de operación del usuario de esta ventana transparente, y reenvíe estos mensajes a la ventana debajo de la posición correspondiente del mensaje.

Personalmente creo que el método 1 es mejor porque con el método 2 hay que conseguir que los copos de nieve tengan una gama de colores específica. Y el Método 2 tiene más problemas que resolver. Porque, si el usuario tiene un programa abierto, diga "Mi PC", y el usuario quiere manipular la ventana "Mi PC", entonces su programa Snowflake tiene que reenviar el mensaje a "Mi PC" en lugar del escritorio. "en lugar del escritorio. Puede usar EnumWindow para enumerar ventanas y luego juzgar, según la posición del mensaje, si está ubicado en la ventana enumerada. Si es así, reenvíelo a esa ventana. Si no, enumere la siguiente ventana, si aún no está allí se enumera, se envía al escritorio, pero esto no es eficiente

n horas después....... ....................

De repente, me di cuenta de que ninguno de los dos métodos anteriores es tan bueno como el siguiente método Simple

1. Determine la posición actual de la pantalla del copo de nieve.

2. Enumere todas las ventanas

3. Obtenga la ventana utilizando el tamaño de ventana enumerado y la posición de la pantalla.

4. Determine si la ventana enumerada está cubierta por el copo de nieve.

5. Si es así, envíe un mensaje WM_PAINT a la ventana. Hasta que se enumeren todas las ventanas

7. Dibuja el copo de nieve a la siguiente posición.