Working with Palettes
9/9/2008
A paleta é uma coleção que contém as cores que podem ser exibidas em um dispositivo saída. As paletas são usadas por dispositivos que podem exibir apenas um subconjunto de suas cores possíveis em qualquer tempo especificado.
Windows Embedded CE não tem nenhum padrão paleta de cores e cria uma paleta usar como padrão cada tempo você criar um contexto dispositivo. Windows Embedded CE baseia esta paleta em recursos de dispositivo. A maioria dos dispositivos possuem 256 cores. Dispositivos de vídeo, de exemplo, geralmente usam o padrão 16 vídeo cores adaptador (VGA) de elementos gráficos e 4 outras cores –defined Windows Embedded CE. Dispositivos de impressora podem usar outras cores usar como padrão. Se você especificar uma caneta ou texto cor não na paleta usar como padrão, Windows Embedded CE mais a cor exibir com a cor mais próxima na paleta. Ao exibir bitmaps, Windows Embedded CE atribui cores a um bitmap com base em associado do bitmap de tabela de cores. Se uma imagem não tiver nenhuma tabela de cores, Windows Embedded CE usa o paleta de cores no contexto de dispositivo selecionado no momento.
Não é possível alteração as entradas na paleta de usar como padrão. No entanto, você pode criar sua própria paleta lógica e selecione a paleta para um contexto para dispositivo no local da paleta de usar como padrão. Você pode usar as paletas lógicas para definir e usar cores que atendem às suas necessidades específicas. Windows Embedded CE permite que você crie múltiplo paletas lógicas. Você pode anexar cada paleta lógica para um exclusivo contexto dispositivo ou você pode alternar entre múltiplo paletas lógicas em um contexto único dispositivo.
Windows Embedded CE dá suporte a dois dispositivos exibir cor palletized e non-palletized. Palletized dispositivos possuem um paleta de cores codificado diretamente no seu cartão exibir. Dispositivos não-palletized usar valores bit pixel no vídeo memória para definir diretamente as cores in terms of seus valores RGB. Você pode usar o GetDeviceCaps função para determinar se um dispositivo oferece suporte à paleta cor.
Para criar um paleta de cores lógico
Atribuir valores aos membros de um LOGPALETTE estrutura e transmitir um ponteiro para a estrutura para o CreatePalette função.
A função retorna um identificador para uma paleta lógica com os valores especificados na LOGPALETTE estrutura.
Chamar o SelectPalette função para selecionar a paleta para o atual dispositivo contexto.
Chamar o RealizePalette função para fazer a paleta sistema o mesmo que a paleta no atual dispositivo contexto.
Sua paleta lógica deve ter apenas suficiente entradas para representar as cores que você precisa. Você pode chamar o GetDeviceCaps função com o SIZEPALETTE índice para recuperar o tamanho máximo paleta associado com um dispositivo.
Ao trabalhar com paletas, é possível alteração as cores em uma paleta lógica existente, bem como recuperar valores cor. A seguinte tabela mostra como modificar a paleta de cores.
Para | Chamar |
---|---|
Alterar as cores de uma paleta lógica existente. |
|
Atualize a exibir depois de alterar ou criar uma paleta. |
RealizePalette |
Recupere valores de cor para uma paleta lógico. |
|
Recupere o valor em uma paleta lógica especificada que corresponda melhor um valor cor especificada. |
|
Exclua uma paleta lógica. Certifique-se de que a paleta lógica não é marcada em um contexto dispositivo quando você exclui-lo. |
Observação
O GetSystemPaletteEntries e RealizePalette funções falhará se o dispositivo associado com o índice dispositivo selecionado não tem uma paleta que você pode definir.Chamar GetDeviceCaps Para determinar se o dispositivo possui uma paleta que você pode definir.
Windows Embedded CE não arbitrate entre as paletas dos aplicativos segundo plano e primeiro plano. O aplicativo execução no primeiro plano controla paleta de sistema. Os aplicativos que usam cores Other Than padrão cores Windows podem não exibir corretamente quando eles executar no segundo plano. Windows Embedded CE não executar qualquer compatível cor operações entre o primeiro plano e segundo plano aplicativos; Portanto, os aplicativos segundo plano não é possível com êxito chamar RealizePalette.
O seguinte exemplo de código mostra como criar paletas cor.
Observação
Para fazer o seguinte exemplo de código mais fácil de ler, verificação de erro não está incluído.Não usar este exemplo de código em uma configuração versão, a menos que você tenha modificado para incluir Seguro manipulação de erro.
HPALETTE CreateScalePalette (HDC hDC, int iColor)
{
HPALETTE hPalette = NULL; // Handle of the palette to be created
LPLOGPALETTE lpMem = NULL; // Buffer for the LOGPALETTE structure
// which defines the palette
int index, // An integer
iReserved, // Number of reserved entries in the
// system palette
iRasterCaps; // Raster capabilities of the display
// device context
// Retrieve the raster capabilities of the display device context.
// Check if it is capable of specifying a palette-based device, then
// determine the number of entries in the logical color palette.
iRasterCaps = GetDeviceCaps (hDC, RASTERCAPS);
iRasterCaps = (iRasterCaps & RC_PALETTE) ? TRUE : FALSE;
if (iRasterCaps)
{
iReserved = GetDeviceCaps (hDC, NUMRESERVED);
iPalSize = GetDeviceCaps (hDC, SIZEPALETTE) - iReserved;
}
else
iPalSize = GetDeviceCaps (hDC, NUMCOLORS);
// If there cannot be any entries in the logical color palette, exit.
if (iPalSize <= 0)
{
MessageBox (g_hwndMain,
TEXT("Palette can't be created, there can't be any")
TEXT("entries in it."),
TEXT("Info"),
MB_OK);
goto exit;
}
// Allocate a buffer for the LOGPALETTE structure.
if (!(lpMem = (LOGPALETTE *) LocalAlloc (LMEM_FIXED,
sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * iPalSize)))
goto exit;
lpMem->palNumEntries = (WORD) iPalSize;
lpMem->palVersion = (WORD) 0x0300;
switch(iColor)
{
case 0: // Red color component only
for (index = 0; index < iPalSize; index++)
{
lpMem->palPalEntry[index].peRed = (BYTE) index;
lpMem->palPalEntry[index].peGreen = 0;
lpMem->palPalEntry[index].peBlue = 0;
lpMem->palPalEntry[index].peFlags = 0;
}
break;
case 1: // Green color component only
for (index = 0; index < iPalSize; index++)
{
lpMem->palPalEntry[index].peRed = 0;
lpMem->palPalEntry[index].peGreen = (BYTE) index;
lpMem->palPalEntry[index].peBlue = 0;
lpMem->palPalEntry[index].peFlags = 0;
}
break;
case 2: // Blue color component only
for (index = 0; index < iPalSize; index++)
{
lpMem->palPalEntry[index].peRed = 0;
lpMem->palPalEntry[index].peGreen = 0;
lpMem->palPalEntry[index].peBlue = (BYTE) index;
lpMem->palPalEntry[index].peFlags = 0;
}
break;
case 3: // Grayscale palette
default:
for (index = 0; index < iPalSize; index++)
{
lpMem->palPalEntry[index].peRed = (BYTE) index;
lpMem->palPalEntry[index].peGreen = (BYTE) index;
lpMem->palPalEntry[index].peBlue = (BYTE) index;
lpMem->palPalEntry[index].peFlags = 0;
}
break;
}
// Create the palette.
hPalette = CreatePalette (lpMem);
// Free the memory object lpMem.
LocalFree ((HLOCAL) lpMem);
exit:
return hPalette;
}