Paleta del sistema
El sistema mantiene una paleta del sistema para cada dispositivo que usa paletas. La paleta del sistema contiene los valores de color de todos los colores que el dispositivo puede mostrar o dibujar actualmente. Aparte de ver el contenido de la paleta del sistema, las aplicaciones no pueden acceder directamente a la paleta del sistema. En su lugar, el sistema tiene control total de la paleta del sistema y permite el acceso solo a través del uso de paletas lógicas.
Una aplicación puede ver el contenido de la paleta del sistema mediante la función GetSystemPaletteEntries . Esta función recupera el contenido de una o varias entradas, hasta el número total de entradas de la paleta del sistema. El total siempre es igual al número devuelto para el valor SIZEPALETTE por la función GetDeviceCaps y es el mismo que el tamaño máximo de cualquier paleta lógica determinada.
Aunque las aplicaciones no pueden cambiar los colores de la paleta del sistema directamente, pueden provocar cambios al realizar paletas lógicas. Para obtener una paleta, el sistema examina cada color solicitado e intenta buscar una entrada en la paleta del sistema que contiene una coincidencia exacta. Si el sistema encuentra un color coincidente, asigna el índice de paleta lógica al índice de paleta del sistema correspondiente. Si el sistema no encuentra una coincidencia exacta, copia el color solicitado en una entrada de paleta del sistema sin usar antes de asignar los índices. Si todas las entradas de paleta del sistema están en uso, el sistema asigna el índice de paleta lógica a la entrada de paleta del sistema cuyo color coincide más estrechamente con el color solicitado. Una vez establecida esta asignación, las aplicaciones no pueden invalidarlo. Por ejemplo, las aplicaciones no pueden usar índices de paleta del sistema para especificar colores; solo se permiten índices de paleta lógica.
Las aplicaciones pueden modificar la forma en que se asignan los índices estableciendo el miembro peFlags de la estructura PALETTEENTRY en valores seleccionados al crear la paleta lógica. Por ejemplo, la marca PC_NOCOLLAPSE dirige al sistema para copiar inmediatamente el color solicitado en una entrada de paleta del sistema sin usar, independientemente de si una entrada de paleta del sistema ya contiene ese color. Además, la marca PC_EXPLICIT dirige al sistema para asignar el índice de paleta lógica a un índice de paleta del sistema especificado explícitamente. (La aplicación proporciona el índice de paleta del sistema en la palabra de orden bajo de la estructura PALETTEENTRY ).
Las paletas se pueden realizar como una paleta de fondo o una paleta de primer plano especificando TRUE o FALSE respectivamente para el parámetro bForceBackground en la función SelectPalette . Solo puede haber una paleta de primer plano en el sistema a la vez. Si la ventana es la ventana activa actualmente o un descendiente de la ventana activa actualmente, puede darse cuenta de una paleta de primer plano. De lo contrario, la paleta se realiza como una paleta de fondo independientemente del valor del parámetro bForceBackground . La propiedad crítica de una paleta de primer plano es que, cuando se realiza, puede sobrescribir todas las entradas (excepto las entradas estáticas) en la paleta del sistema. El sistema logra esto marcando todas las entradas que no son estáticas en la paleta del sistema como no utilizadas antes de la realización de una paleta de primer plano, lo que elimina todas las entradas usadas. No se produce ningún preprocesamiento en la paleta del sistema para realizar una paleta de fondo. La paleta de primer plano establece todos los posibles colores no estáticos. Las paletas de fondo solo pueden establecer lo que permanece abierto y se priorizan de primera manera. Normalmente, las aplicaciones usan paletas de fondo para ventanas secundarias que se dan cuenta de sus propias paletas individuales. Esto ayuda a minimizar el número de cambios que se producen en la paleta del sistema.
Una entrada de paleta del sistema sin usar es cualquier entrada que no está reservada y no contiene un color estático. Las entradas reservadas se marcan explícitamente con el valor PC_RESERVED. Estas entradas se crean cuando una aplicación se da cuenta de una paleta lógica para la animación de paleta. El sistema crea entradas de color estáticas y corresponden a los colores de la paleta predeterminada. La función GetDeviceCaps se puede usar para recuperar el valor NUMRESERVED, que especifica el número de entradas de paleta del sistema reservadas para los colores estáticos.
Dado que la paleta del sistema tiene un número limitado de entradas, seleccionar y realizar una paleta lógica para un dispositivo determinado puede afectar a los colores asociados a otras paletas lógicas para el mismo dispositivo. Estos cambios de color son especialmente dramáticos cuando se producen en la pantalla. Una aplicación puede asegurarse de que se usan colores razonables para su paleta lógica seleccionada actualmente restableciendo la paleta antes de cada uso. Una aplicación restablece la paleta llamando a las funciones UnrealizeObject y RealizePalette . El uso de estas funciones hace que el sistema vuelva a asignar los colores de la paleta lógica a colores razonables en la paleta del sistema.