Compartilhar via


Working with Palettes

Windows Mobile SupportedWindows Embedded CE Supported

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

  1. 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.

  2. Chamar o SelectPalette função para selecionar a paleta para o atual dispositivo contexto.

  3. 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.

SetPaletteEntries

Atualize a exibir depois de alterar ou criar uma paleta.

RealizePalette

Recupere valores de cor para uma paleta lógico.

GetPaletteEntries

Recupere o valor em uma paleta lógica especificada que corresponda melhor um valor cor especificada.

GetNearestPaletteIndex

Exclua uma paleta lógica. Certifique-se de que a paleta lógica não é marcada em um contexto dispositivo quando você exclui-lo.

ExcluirObjeto

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;
}

See Also

Concepts

Graphics Device Interface (GDI)