系統選擇區

系統會針對使用調色盤的每個裝置維護 系統調 色盤。 系統調色盤包含裝置目前可顯示或繪製之所有色彩的色彩值。 除了檢視系統選擇區的內容之外,應用程式無法直接存取系統選擇區。 相反地,系統會完全控制系統調色盤,並只允許透過使用邏輯選擇區進行存取。

應用程式可以使用 GetSystemPaletteEntries 函式來檢視系統選擇區的內容。 此函式會擷取一或多個專案的內容,最多可擷取系統調色盤中的專案總數。 總計一律等於 GetDeviceCaps 函式針對 SIZEPALETTE 值傳回的數位,而且與任何指定邏輯選擇區的大小上限相同。

雖然應用程式無法直接變更系統調色盤中的色彩,但在實現邏輯調色盤時可能會造成變更。 為了實現調色盤,系統會檢查每個要求的色彩,並嘗試在包含完全相符專案的系統調色盤中尋找專案。 如果系統找到相符的色彩,它會將邏輯調色盤索引對應至對應的系統調色盤索引。 如果系統找不到完全相符的專案,則會在對應索引之前,將要求的色彩複製到未使用的系統調色盤專案。 如果所有系統調色盤專案都正在使用中,系統會將邏輯調色盤索引對應至最符合所要求色彩的系統調色盤專案。 設定此對應之後,應用程式就無法覆寫它。 例如,應用程式無法使用系統調色盤索引來指定色彩;只允許邏輯選擇區索引。

應用程式可以在建立邏輯調色盤時,將PALETTEENTRY結構的peFlags成員設定為選取的值,來修改索引的對應方式。 例如,不論系統調色盤專案是否已經包含該色彩,PC_NOCOLLAPSE旗標會指示系統立即將要求的色彩複製到未使用的系統調色盤專案。 此外,PC_EXPLICIT旗標會指示系統將邏輯調色盤索引對應至明確指定的系統調色盤索引。 (應用程式會以 PALETTEENTRY 結構的低序字提供系統調色盤索引。)

SelectPalette函式中分別為bForceBackground參數指定TRUEFALSE,即可將調色盤視為背景調色盤或前景調色盤。 系統一次只能有一個前景調色盤。 如果視窗是目前使用中的視窗或目前使用中視窗的子代,它可以實現前景調色盤。 否則,不論 bForceBackground 參數的值為何,調色盤都會成為背景調色盤。 前景調色盤的重要屬性是,在實現時,它可以覆寫系統調色盤中靜態專案) 以外的所有專案 (。 系統會在實現前景調色盤之前,將系統調色盤中非靜態的所有專案標示為未使用,藉此消除所有已使用的專案來完成此目的。 背景調色盤實現的系統調色盤上不會發生前置處理。 前景調色盤會設定所有可能的非靜態色彩。 背景調色盤只能設定保持開啟的狀態,並以初次提供的第一個服務方式設定優先順序。 一般而言,應用程式會針對子視窗使用背景調色盤,以瞭解自己的個別調色盤。 這有助於將系統調色盤發生的變更數目降至最低。

未使用的系統調色盤專案是未保留且不包含靜態色彩的任何專案。 保留專案會以PC_RESERVED值明確標示。 當應用程式實現調色盤動畫的邏輯選擇區時,就會建立這些專案。 靜態色彩專案是由系統所建立,並對應至預設調色盤中的色彩。 GetDeviceCaps函式可用來擷取 NUMRESERVED 值,指定保留給靜態色彩的系統調色盤專案數目。

由於系統調色盤的專案數目有限,因此選取並實現指定裝置的邏輯調色盤可能會影響與相同裝置的其他邏輯調色盤相關聯的色彩。 這些色彩變更在顯示器上發生時特別明顯。 應用程式可以藉由在每次使用之前重設調色盤,以確保其目前選取的邏輯調色盤使用合理的色彩。 應用程式會藉由呼叫 UnrealizeObjectRealizePalette 函式來重設調色盤。 使用這些函式會導致系統將邏輯調色盤中的色彩重新對應至系統調色盤中的合理色彩。