시스템 팔레트
시스템은 팔레트를 사용하는 각 디바이스에 대한 시스템 팔레트 를 유지 관리합니다. 시스템 팔레트에는 현재 디바이스에서 표시하거나 그릴 수 있는 모든 색에 대한 색 값이 포함되어 있습니다. 시스템 팔레트의 내용을 보는 것 외에 애플리케이션은 시스템 팔레트에 직접 액세스할 수 없습니다. 대신 시스템은 시스템 팔레트를 완전히 제어하고 논리 팔레트를 사용하여 액세스를 허용합니다.
애플리케이션은 GetSystemPaletteEntries 함수를 사용하여 시스템 팔레트의 내용을 볼 수 있습니다. 이 함수는 시스템 팔레트의 총 항목 수까지 하나 이상의 항목의 내용을 검색합니다. 합계는 항상 GetDeviceCaps 함수에서 SIZEPALETTE 값에 대해 반환되는 숫자와 같으며 지정된 논리 팔레트의 최대 크기와 동일합니다.
애플리케이션은 시스템 팔레트의 색을 직접 변경할 수는 없지만 논리적 팔레트를 실현할 때 변경될 수 있습니다. 팔레트를 실현하기 위해 시스템은 요청된 각 색을 검사하고 정확한 일치 항목이 포함된 시스템 팔레트에서 항목을 찾으려고 시도합니다. 시스템에서 일치하는 색을 찾으면 논리 색상표 인덱스가 해당 시스템 팔레트 인덱스로 매핑됩니다. 시스템에서 정확히 일치하는 항목을 찾지 못하면 인덱스를 매핑하기 전에 요청된 색을 사용하지 않는 시스템 팔레트 항목에 복사합니다. 모든 시스템 팔레트 항목을 사용하는 경우 시스템은 논리적 팔레트 인덱스 색을 요청된 색과 가장 일치하는 시스템 팔레트 항목에 매핑합니다. 이 매핑이 설정되면 애플리케이션에서 재정의할 수 없습니다. 예를 들어 애플리케이션은 시스템 색상표 인덱스를 사용하여 색을 지정할 수 없습니다. 논리 팔레트 인덱스만 허용됩니다.
애플리케이션은 논리적 팔레트를 만들 때 PALETTEENTRY 구조체의 peFlags 멤버를 선택한 값으로 설정하여 인덱스가 매핑되는 방식을 수정할 수 있습니다. 예를 들어 PC_NOCOLLAPSE 플래그는 시스템 팔레트 항목에 이미 해당 색이 포함되어 있는지 여부에 관계없이 요청된 색을 사용하지 않는 시스템 팔레트 항목에 즉시 복사하도록 시스템에 지시합니다. 또한 PC_EXPLICIT 플래그는 논리적 팔레트 인덱스를 명시적으로 지정된 시스템 팔레트 인덱스에 매핑하도록 시스템에 지시합니다. (애플리케이션은 PALETTEENTRY 구조체의 낮은 순서 단어로 시스템 팔레트 인덱스를 제공합니다.)
SelectPalette 함수에서 bForceBackground 매개 변수에 대해 각각 TRUE 또는 FALSE를 지정하여 색상표를 배경 팔레트 또는 전경 팔레트로 실현할 수 있습니다. 한 번에 하나의 포그라운드 팔레트만 시스템에 있을 수 있습니다. 창이 현재 활성 창이거나 현재 활성 창의 하위 창인 경우 전경 팔레트를 실현할 수 있습니다. 그렇지 않으면 색상표는 bForceBackground 매개 변수의 값에 관계없이 배경 팔레트로 실현됩니다. 전경 팔레트의 중요한 속성은 실현되면 시스템 팔레트의 모든 항목(정적 항목 제외)을 덮어쓸 수 있다는 것입니다. 시스템은 포그라운드 팔레트를 실현하기 전에 시스템 팔레트에 정적이지 않은 모든 항목을 사용하지 않음으로 표시하여 이 작업을 수행하므로 사용된 모든 항목이 제거됩니다. 배경 팔레트를 실현하기 위해 시스템 팔레트에서 전처리가 발생하지 않습니다. 전경 팔레트는 가능한 모든 비정적 색을 설정합니다. 배경 팔레트는 열려 있는 항목만 설정할 수 있으며 선착순으로 우선 순위가 지정됩니다. 일반적으로 애플리케이션은 고유한 개별 팔레트를 실현하는 자식 창에 배경 팔레트를 사용합니다. 이렇게 하면 시스템 팔레트에 발생하는 변경 횟수를 최소화할 수 있습니다.
사용하지 않는 시스템 팔레트 항목은 예약되지 않고 정적 색을 포함하지 않는 항목입니다. 예약된 항목은 PC_RESERVED 값으로 명시적으로 표시됩니다. 이러한 항목은 애플리케이션이 색상표 애니메이션에 대한 논리적 팔레트를 실현할 때 만들어집니다. 정적 색 항목은 시스템에서 생성되며 기본 색상표의 색에 해당합니다. GetDeviceCaps 함수를 사용하여 정적 색에 예약된 시스템 팔레트 항목 수를 지정하는 NUMRESERVED 값을 검색할 수 있습니다.
시스템 팔레트에는 제한된 수의 항목이 있으므로 지정된 디바이스에 대한 논리적 팔레트를 선택하고 실현하면 동일한 디바이스의 다른 논리 팔레트와 연결된 색에 영향을 줄 수 있습니다. 이러한 색 변경은 디스플레이에서 발생할 때 특히 극적입니다. 애플리케이션은 각 사용 전에 팔레트를 다시 설정하여 현재 선택한 논리 팔레트에 적절한 색이 사용되는지 확인할 수 있습니다. 애플리케이션은 UnrealizeObject 및 RealizePalette 함수를 호출하여 팔레트를 다시 설정합니다. 이러한 함수를 사용하면 시스템에서 논리 팔레트의 색을 시스템 팔레트의 적절한 색으로 다시 매핑합니다.