Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Esta seção contém informações gerais sobre a funcionalidade de desenho personalizado e fornece uma visão geral conceitual de como um aplicativo pode dar suporte ao desenho personalizado. Atualmente, os seguintes controles dão suporte à funcionalidade de desenho personalizado:
- Controles de cabeçalho
- Controles de exibição de lista
- Controles de barra de barras
- Controles da barra de ferramentas
- Controles de dica de ferramenta
- Controles de barra de controle
- Controles de exibição de árvore
Sobre mensagens de notificação de desenho personalizado
Todos os controles comuns que dão suporte ao desenho personalizado enviam códigos de notificação NM_CUSTOMDRAW em pontos específicos durante operações de desenho. Esses códigos de notificação descrevem operações de desenho que se aplicam a todo o controle, bem como operações de desenho específicas a itens dentro do controle. Como muitos códigos de notificação, NM_CUSTOMDRAW notificações são enviadas como mensagens WM_NOTIFY .
O parâmetro lParam de uma notificação de desenho personalizada será o endereço de uma estrutura NMCUSTOMDRAW ou uma estrutura específica de controle que contém uma estrutura NMCUSTOMDRAW como seu primeiro membro. A tabela a seguir ilustra a relação entre os controles e as estruturas que eles usam.
| Estrutura | Usado por |
|---|---|
| NMCUSTOMDRAW | Barra de barras, barra de controle e controles de cabeçalho |
| NMLVCUSTOMDRAW | Controles de exibição de lista |
| NMTBCUSTOMDRAW | Controles da barra de ferramentas |
| NMTTCUSTOMDRAW | Controles de dica de ferramenta |
| NMTVCUSTOMDRAW | Controles de exibição de árvore |
Ciclos de pintura, estágios de desenho e mensagens de notificação
Como todos os aplicativos do Windows, os controles comuns se pintam e apagam periodicamente com base em mensagens recebidas do sistema ou de outros aplicativos. O processo de uma pintura de controle ou apagamento em si é chamado de ciclo de pintura. Controles que dão suporte ao desenho personalizado enviam códigos de notificação NM_CUSTOMDRAW periodicamente em cada ciclo de pintura. Esse código de notificação é acompanhado por uma estrutura NMCUSTOMDRAW ou outra estrutura que contém uma estrutura NMCUSTOMDRAW como seu primeiro membro.
Uma informação que a estrutura NMCUSTOMDRAW contém é o estágio atual do ciclo de pintura. Isso é conhecido como o estágio de desenho e é representado pelo valor no membro dwDrawStage da estrutura. Um controle informa ao pai sobre quatro estágios básicos de desenho. Esses estágios básicos ou globais de desenho são representados na estrutura pelos seguintes valores de sinalizador (definidos em Commctrl.h).
| Valores de fase de desenho global | Descrição |
|---|---|
| CDDS_PREPAINT | Antes do ciclo de pintura começar. |
| CDDS_POSTPAINT | Após a conclusão do ciclo de pintura. |
| CDDS_PREERASE | Antes do início do ciclo de apagamento. |
| CDDS_POSTERASE | Depois que o ciclo de apagamento for concluído. |
Cada um dos valores anteriores pode ser combinado com o sinalizador CDDS_ITEM para especificar estágios de desenho específicos aos itens. Para conveniência, Commctrl.h contém os seguintes valores específicos do item.
| Valores de estágio de desenho específicos do item | Descrição |
|---|---|
| CDDS_ITEMPREPAINT | Antes de um item ser desenhado. |
| CDDS_ITEMPOSTPAINT | Depois que um item for desenhado. |
| CDDS_ITEMPREERASE | Antes que um item seja apagado. |
| CDDS_ITEMPOSTERASE | Depois que um item for apagado. |
| CDDS_SUBITEM | Common Control Versions 4.71. Sinalizador combinado com CDDS_ITEMPREPAINT ou CDDS_ITEMPOSTPAINT se um subitem estiver sendo desenhado. Isso só será definido se CDRF_NOTIFYITEMDRAW for retornado de CDDS_PREPAINT. |
Seu aplicativo deve processar o código de notificação NM_CUSTOMDRAW e retornar um valor específico que informe ao controle o que ele deve fazer. Consulte as seções a seguir para obter mais informações sobre esses valores retornados.
Aproveitando os serviços de desenho personalizados
A chave para aproveitar a funcionalidade de desenho personalizado está em responder aos códigos de notificação NM_CUSTOMDRAW enviados por um controle. Os valores retornados que seu aplicativo envia em resposta a essas notificações determinam o comportamento do controle para esse ciclo de pintura.
Esta seção contém informações sobre como seu aplicativo pode usar NM_CUSTOMDRAW valores de retorno de notificação para determinar o comportamento do controle.
Os detalhes são divididos nos seguintes tópicos:
- Respondendo à notificação de pré-compilação
- Solicitando notificações específicas do item
- Desenhando o item por conta própria
- Alterando fontes e cores
Respondendo à notificação de pré-compilação
No início de cada ciclo de pintura, o controle envia o código de notificação NM_CUSTOMDRAW , especificando o valor CDDS_PREPAINT no membro dwDrawStage da estrutura de NM_CUSTOMDRAW que acompanha. O valor que seu aplicativo retorna para esta primeira notificação determina como e quando o controle envia notificações de desenho personalizadas subsequentes para o restante desse ciclo de pintura. Seu aplicativo pode retornar uma combinação dos sinalizadores a seguir em resposta à primeira notificação.
| Valor de retorno | Efeito |
|---|---|
| CDRF_DODEFAULT | O controle se desenhará. Ele não enviará notificações de NM_CUSTOMDRAW adicionais para esse ciclo de pintura. Esse sinalizador não pode ser usado com nenhum outro sinalizador. |
| CDRF_DOERASE | O controle desenhará apenas a tela de fundo. |
| CDRF_NEWFONT | Seu aplicativo especificou uma nova fonte para o item; o controle usará a nova fonte. Para obter mais informações sobre como alterar fontes, consulte Alterando fontes e cores. Isso ocorre quando dwDrawStage é igual a CDDS_ITEMPREPAINT. |
| CDRF_NOTIFYITEMDRAW | O controle notificará o pai de todas as operações de desenho específicas do item. Ele enviará NM_CUSTOMDRAW códigos de notificação antes e depois de desenhar itens. Isso ocorre quando dwDrawStage é igual a CDDS_PREPAINT. |
| CDRF_NOTIFYPOSTERASE | O controle notificará o pai depois de apagar um item. Isso ocorre quando dwDrawStage é igual a CDDS_PREPAINT. |
| CDRF_NOTIFYPOSTPAINT | O controle enviará uma notificação NM_CUSTOMDRAW quando o ciclo de pintura de todo o controle for concluído. Isso ocorre quando dwDrawStage é igual a CDDS_PREPAINT. |
| CDRF_NOTIFYSUBITEMDRAW | Versão 4.71. Seu aplicativo receberá uma notificação NM_CUSTOMDRAW com dwDrawStage definido como CDDS_ITEMPREPAINT | CDDS_SUBITEM antes que cada subitem de exibição de lista seja desenhado. Em seguida, você pode especificar a fonte e a cor de cada subitem separadamente ou retornar CDRF_DODEFAULT para processamento padrão. Isso ocorre quando dwDrawStage é igual a CDDS_ITEMPREPAINT. |
| CDRF_SKIPDEFAULT | Seu aplicativo desenhou o item manualmente. O controle não desenhará o item. Isso ocorre quando dwDrawStage é igual a CDDS_ITEMPREPAINT. |
| CDRF_SKIPPOSTPAINT | O controle não desenhará o retângulo de foco em torno de um item. |
Solicitando notificações específicas do item
Se o aplicativo retornar CDRF_NOTIFYITEMDRAW à notificação de desenho personalizada de pré-estrutura inicial, o controle enviará notificações para cada item desenhado durante esse ciclo de pintura. Essas notificações específicas de item terão o valor CDDS_ITEMPREPAINT no membro dwDrawStage da estrutura NMCUSTOMDRAW que acompanha. Você pode solicitar que o controle envie outra notificação quando terminar de desenhar o item retornando CDRF_NOTIFYPOSTPAINT para essas notificações específicas do item. Caso contrário, retorne CDRF_DODEFAULT e o controle não notificará a janela pai até que comece a desenhar o próximo item.
Desenhando o item por conta própria
Se o aplicativo desenhar o item inteiro, retorne CDRF_SKIPDEFAULT. Isso permite que o controle ignore os itens que ele não precisa desenhar, diminuindo assim a sobrecarga do sistema. Tenha em mente que retornar esse valor significa que o controle não desenhará nenhuma parte do item.
Alterando fontes e cores
Seu aplicativo pode usar o desenho personalizado para alterar a fonte de um item. Basta selecionar o HFONT desejado no contexto do dispositivo especificado pelo membro hdc da estrutura NMCUSTOMDRAW associada à notificação de desenho personalizada. Como a fonte selecionada pode ter métricas diferentes da fonte padrão, inclua o bit CDRF_NEWFONT no valor retornado da mensagem de notificação. Para obter mais informações sobre como usar essa funcionalidade, consulte o código de exemplo em Usando o Desenho Personalizado. A fonte especificada pelo aplicativo é usada para exibir esse item quando ele não está selecionado. O desenho personalizado não permite que você altere os atributos de fonte para itens selecionados.
Para alterar as cores de texto para todos os controles que dão suporte ao desenho personalizado, exceto para a exibição de lista e exibição de árvore, basta definir o texto desejado e as cores de plano de fundo no contexto do dispositivo fornecido na estrutura de notificação de desenho personalizada com as funções SetTextColor e SetBkColor . Para modificar as cores de texto no modo de exibição de lista ou de árvore, você precisa colocar os valores de cor desejados nos membros clrText e clrTextBk da estrutura NMLVCUSTOMDRAW ou NMTVCUSTOMDRAW .
Observação
Antes da versão 6.0 dos controles comuns, as barras de ferramentas ignoram o sinalizador de CDRF_NEWFONT . A versão 6.0 dá suporte ao sinalizador CDRF_NEWFONT e você pode usá-lo para selecionar uma fonte diferente para a barra de ferramentas. No entanto, você não pode alterar a cor de uma barra de ferramentas quando um estilo visual está ativo. Para alterar a cor de uma barra de ferramentas na versão 6.0, primeiro desabilite os estilos visuais chamando SetWindowTheme e não especificando nenhum estilo visual:
SetWindowTheme (hwnd, "", "");
Desenho personalizado com controles de List-View e Tree-View
A maioria dos controles comuns pode ser tratada essencialmente da mesma maneira. No entanto, os controles de exibição de lista e de exibição de árvore têm alguns recursos que exigem uma abordagem um pouco diferente para desenhar personalizado.
Para a versão 5.0, esses dois controles poderão exibir texto recortado se você alterar a fonte retornando CDRF_NEWFONT. Esse comportamento é necessário para compatibilidade com versões anteriores dos controles comuns. Se você quiser alterar a fonte de um controle de exibição de lista ou de exibição de árvore, obterá melhores resultados se enviar uma mensagem CCM_SETVERSION com o valor wParam definido como 5 antes de adicionar quaisquer itens ao controle.
Desenho personalizado com controles de List-View
Como os controles de exibição de lista têm subitens e vários modos de exibição, você precisará lidar com a notificação de NM_CUSTOMDRAW um pouco diferente dos outros controles comuns.
Para o modo de relatório, use o procedimento a seguir.
- A primeira notificação NM_CUSTOMDRAW terá o membro dwDrawStage da estrutura NMCUSTOMDRAW associada definida como CDDS_PREPAINT. Retornar CDRF_NOTIFYITEMDRAW.
- Em seguida, você receberá uma notificação NM_CUSTOMDRAW com dwDrawStage definido como CDDS_ITEMPREPAINT. Se você especificar novas fontes ou cores e retornar CDRF_NEWFONT, todos os subitens do item serão alterados. Se você quiser manipular cada subitem separadamente, retorne CDRF_NOTIFYSUBITEMDRAW.
- Se você retornou CDRF_NOTIFYSUBITEMDRAW na etapa anterior, receberá uma notificação NM_CUSTOMDRAW para cada subitem com dwDrawStage definido como CDDS_SUBITEM | CDDS_ITEMPREPAINT. Para alterar a fonte ou a cor desse subitem, especifique uma nova fonte ou cor e retorne CDRF_NEWFONT.
Para o ícone grande, ícone pequeno e modos de lista, use o procedimento a seguir.
- A primeira notificação NM_CUSTOMDRAW terá o membro dwDrawStage da estrutura NMCUSTOMDRAW associada definida como CDDS_PREPAINT. Retornar CDRF_NOTIFYITEMDRAW.
- Em seguida, você receberá uma notificação NM_CUSTOMDRAW com dwDrawStage definido como CDDS_ITEMPREPAINT. Você pode alterar as fontes ou cores de um item especificando novas fontes e cores e retornando CDRF_NEWFONT. Como esses modos não têm subitens, você não receberá nenhuma notificação de NM_CUSTOMDRAW adicional.
Para obter um exemplo de um manipulador de notificação de NM_CUSTOMDRAW de exibição de lista, consulte Usando o Desenho Personalizado.
Tópicos relacionados
- usando de desenho personalizado
- Referência de desenho personalizado