Partilhar via


TN031: Barras de controlo

Observação

A nota técnica a seguir não foi atualizada desde que foi incluída pela primeira vez na documentação on-line. Como resultado, alguns procedimentos e tópicos podem estar desatualizados ou incorretos. Para obter as informações mais recentes, recomenda-se que pesquise o tópico de interesse no índice de documentação online.

Esta nota descreve as classes da barra de controle no MFC: o CControlBar geral, CStatusBar, CToolBar, CDialogBar e CDockBar.

CControlBar

A ControlBar é uma CWndclasse derivada que:

  • Está alinhado à parte superior ou inferior de uma janela de moldura.

  • Pode conter itens filho que são controlos baseados no HWND (por exemplo, CDialogBar) ou itens não baseados em HWND (por exemplo, CToolBar, CStatusBar).

As barras de controlo suportam os estilos adicionais:

  • CBRS_TOP, que é o padrão, fixa a barra de controle na parte superior.

  • CBRS_BOTTOM Fixe a barra de controle na parte inferior.

  • CBRS_NOALIGN Não reposicione a barra de comandos quando a janela principal for redimensionada.

As classes derivadas de CControlBar fornecem implementações mais interessantes:

  • CStatusBar Uma barra de status, os itens são painéis da barra de status que contêm texto.

  • CToolBar Uma barra de ferramentas, os itens são botões de bitmap alinhados numa fila.

  • CDialogBar Um quadro semelhante a uma barra de ferramentas contendo controles padrão do Windows (criado a partir de um recurso de modelo de diálogo).

  • CDockBar Uma área de encaixe generalizada para outros CControlBar objetos derivados. É provável que as funções e variáveis específicas do membro disponíveis nesta classe sejam alteradas em versões futuras.

Todos os objetos/janelas da barra de controle serão janelas filhas de alguma janela de quadro pai. Eles geralmente são adicionados como um elemento paralelo à área do cliente da estrutura (por exemplo, um cliente MDI ou visualização). O identificador da janela filha de uma barra de controle é importante. O layout padrão da barra de controle só funciona para barras de controle com IDs no intervalo de AFX_IDW_CONTROLBAR_FIRST a AFX_IDW_CONTROLBAR_LAST. Observe que, embora haja um intervalo de 256 IDs de barra de controle, os primeiros 32 IDs de barra de controle são especiais, pois são diretamente suportados pela arquitetura de visualização de impressão.

A CControlBar classe fornece implementação padrão para:

  • Alinhando a barra de controle com a parte superior, inferior ou de ambos os lados do quadro.

  • Alocando matrizes de itens de controle.

  • Apoio à implementação de classes derivadas.

Os objetos da barra de controle C++ geralmente serão incorporados como membros de uma CFrameWnd classe derivada e serão limpos quando o pai HWND e o objeto forem destruídos. Se você precisar alocar um objeto de barra de controle no heap, você pode simplesmente definir o membro m_bAutoDestruct como TRUE para fazer a barra de controle invocar delete this; quando o HWND for destruído.

Observação

Caso crie uma classe derivada própria em vez de utilizar uma das classes derivadas do MFC, como CControlBar, CStatusBar ou CToolBar, será necessário definir o membro da variável de dados m_dwStyle. Isso pode ser feito durante a substituição de Create:

// CMyControlBar is derived from CControlBar
BOOL CMyControlBar::Create(CWnd* pParentWnd,
    DWORD dwStyle,
    UINT nID)
{
    m_dwStyle = dwStyle;

.
.
.
}

Algoritmo de layout da barra de controle

O algoritmo de layout da barra de controle é muito simples. A janela do quadro envia uma mensagem WM_SIZEPARENT para todas as crianças no intervalo da barra de controle. Junto com essa mensagem, um ponteiro para o retângulo do cliente pai é passado. Esta mensagem é enviada às crianças na sequência Z. As crianças da barra de controle usam essas informações para se posicionar e diminuir o tamanho da área de cliente dos pais. O retângulo final que é deixado para a área normal do cliente (menos barras de controle) é usado para posicionar a janela principal do cliente (geralmente um cliente MDI, visualização ou janela divisora).

Consulte CWnd::RepositionBars e CFrameWnd::RecalcLayout para mais detalhes.

As mensagens privadas MFC do Windows, incluindo WM_SIZEPARENT, estão documentadas na Nota Técnica 24.

CStatusBar

Uma barra de status é uma barra de controle que tem uma linha de painéis de saída de texto. Há duas maneiras comuns de usar painéis de saída de texto:

  • Como uma linha de mensagem

    (por exemplo, a linha de mensagem de ajuda do menu padrão). Estes são normalmente acedidos por um índice começando em 0

  • Como indicadores de status

    (por exemplo, os indicadores PAC, NUM e SCRL). Eles geralmente são acessados por string/command ID.

A fonte para a barra de status é MS Sans Serif de 10 pontos (ditada pelo Guia de Design de Aplicativo de Interface do Windows ou pela melhor correspondência dos mapeadores de fontes de uma fonte proporcional suíça de 10 pontos). Em determinadas versões do Windows, como a edição japonesa, as fontes selecionadas são diferentes.

As cores usadas na barra de status também são consistentes com a recomendação do Windows Interface Application Design Guide. Essas cores não são codificadas e são alteradas dinamicamente em resposta à personalização do usuário no Painel de Controle.

Iteme Valor de Cor do Windows RGB padrão
Fundo da barra de estado COLOR_BTNFACE RGB(192, 192, 192)
Texto da barra de status COLOR_BTNTEXT RGB(000, 000, 000)
Cantos superiores/esquerdos da Barra de Status Cor realce do botão RGB(255, 255, 255)
Bot da barra de status/bordas direitas COLOR_BTNSHADOW RGB(128, 128, 128)

Suporte CCmdUI para CStatusBar

A forma como os indicadores são normalmente atualizados é através do mecanismo ON_UPDATE_COMMAND_UI. No tempo ocioso, a barra de status chamará o manipulador de ON_UPDATE_COMMAND_UI com o ID da cadeia de caracteres do painel indicador.

O manipulador de ON_UPDATE_COMMAND_UI pode chamar:

  • Enable: Para ativar ou desativar o painel. Um painel desativado se parece exatamente com um painel habilitado, mas o texto é invisível (ou seja, desativa o indicador de texto).

  • SetText: Para alterar o texto. Tenha cuidado se você usar isso, porque o painel não será redimensionado automaticamente.

Consulte a classe CStatusBar na Referência da Biblioteca de Classes para obter detalhes sobre CStatusBar APIs de criação e personalização. A maior parte da personalização das barras de status deve ser feita antes que a barra de status seja inicialmente tornada visível.

A barra de status suporta apenas um painel elástico, geralmente o primeiro painel. O tamanho desse painel é realmente um tamanho mínimo. Se a barra de status for maior do que o tamanho mínimo de todos os painéis, qualquer largura extra será dada ao painel elástico. O aplicativo padrão com uma barra de status tem indicadores alinhados à direita para CAP, NUM e SCRL, já que o primeiro painel é elástico.

CToolBar

Uma barra de ferramentas é uma barra de controle com uma linha de botões de bitmap que podem incluir separadores. Dois estilos de botões são suportados: botões de pressão e botões de caixa de seleção. A funcionalidade do grupo de opções pode ser criada com botões de caixa de seleção e ON_UPDATE_COMMAND_UI.

Todos os botões de bitmap na barra de ferramentas são retirados de um bitmap. Esse bitmap deve conter uma imagem ou glifo para cada botão. Normalmente, a ordem das imagens/glifos no bitmap é a mesma ordem em que serão desenhadas na tela. (Isso pode ser alterado usando as APIs de personalização.)

Cada botão deve ter o mesmo tamanho. O padrão é 24x22 pixels. Cada imagem/glifo deve ter o mesmo tamanho e estar lado a lado no bitmap. O tamanho padrão da imagem/glifo é 16x15 pixels. Portanto, para uma barra de ferramentas com 10 botões (usando tamanhos padrão), você precisa de um bitmap com 160 pixels de largura e 15 pixels de altura.

Cada botão tem uma e apenas uma imagem/glifo. Os diferentes estados e estilos de botão (por exemplo, pressionado, para cima, para baixo, desativado, desativado para baixo, indeterminado) são gerados algoritmicamente a partir dessa imagem/glifo. Qualquer bitmap de cor ou DIB pode ser usado em teoria. O algoritmo para gerar os diferentes estados de botão funciona melhor se a imagem original for em tons de cinza. Consulte os botões padrão da barra de ferramentas e o clipart fornecido nos exemplos gerais do MFC CLIPART para obter referências.

As cores usadas na barra de ferramentas também são consistentes com a recomendação do Windows Interface Application Design Guide. Essas cores não são codificadas e são alteradas dinamicamente em resposta à personalização do usuário no Painel de Controle.

Iteme Valor de Cor do Windows RGB padrão
Fundo da barra de ferramentas COLOR_BTNFACE RGB(192.192.192)
Bordas superiores/esquerdas dos botões da barra de ferramentas Cor realce do botão RGB(255.255.255)
Bordas inferiores/direitas dos botões da barra de ferramentas COLOR_BTNSHADOW RGB(128.128.128)

Além disso, os botões de bitmap da barra de ferramentas são recoloridos como se fossem controles de botão padrão do Windows. Essa recoloração ocorre quando o bitmap é carregado a partir do recurso e em resposta a uma alteração nas cores do sistema em resposta à personalização do usuário no Painel de Controle. As seguintes cores em um bitmap da barra de ferramentas serão recoloridas automaticamente, portanto, devem ser usadas com cuidado. Se você não deseja ter uma parte do seu bitmap recolorida, use uma cor que se aproxime de um dos valores RGB mapeados. O mapeamento é feito com base em valores RGB exatos.

Valor RGB Valor da cor mapeado dinamicamente
RGB(000, 000, 000) COLOR_BTNTEXT
RGB(128, 128, 128) COLOR_BTNSHADOW
RGB(192, 192, 192) COLOR_BTNFACE
RGB(255, 255, 255) Cor realce do botão

Consulte a classe CToolBar a Referência da Biblioteca de Classes para obter detalhes sobre as APIs de CToolBar criação e personalização. A maior parte da personalização das barras de ferramentas deve ser feita antes que a barra de ferramentas seja inicialmente tornada visível.

As APIs de personalização podem ser usadas para ajustar os IDs do botão, estilos, largura do espaçador e qual imagem/glifo é usado para qual botão. Por padrão, você não precisa usar essas APIs.

Suporte CCmdUI para CToolBar

A forma como os botões da barra de ferramentas são sempre atualizados é através do mecanismo ON_UPDATE_COMMAND_UI. No tempo ocioso, a barra de ferramentas chamará o manipulador de ON_UPDATE_COMMAND_UI com o ID de comando desse botão. ON_UPDATE_COMMAND_UI não é chamado para separadores, mas é chamado para botões de pressão e botões de caixa de verificação.

O manipulador de ON_UPDATE_COMMAND_UI pode chamar:

  • Enable: Para ativar ou desativar o botão. Isso funciona igualmente para botões de pressão e botões de caixa de seleção.

  • SetCheck: Para definir o estado de verificação de um botão. Ao chamar esta função para um botão da barra de ferramentas, ele será transformado num botão de caixa de verificação. SetCheck toma um parâmetro que pode ser 0 (não verificado), 1 (verificado) ou 2 (indeterminado)

  • SetRadio: Abreviação de SetCheck.

Os botões da caixa de seleção são botões de caixa de seleção "AUTO"; ou seja, quando o usuário pressioná-los, eles mudarão imediatamente de estado. Verificado é o estado para baixo ou deprimido. Não há nenhuma interface de usuário integrada para alterar um botão para o estado "indeterminado"; isso deve ser feito através de código.

As APIs de personalização permitirão que você altere o estado de um determinado botão da barra de ferramentas, de preferência você deve alterar esses estados no manipulador de ON_UPDATE_COMMAND_UI para o comando que o botão da barra de ferramentas representa. Lembre-se, o processamento em modo ocioso alterará o estado dos botões da barra de ferramentas com o manipulador de ON_UPDATE_COMMAND_UI, portanto, quaisquer alterações feitas nesse estado por meio de SetButtonStyle podem desaparecer após o próximo ciclo de ociosidade.

Os botões da barra de ferramentas enviarão mensagens WM_COMMAND, como botões normais ou itens de menu, e normalmente são manipulados por um manipulador de ON_COMMAND na mesma classe que fornece o manipulador de ON_UPDATE_COMMAND_UI.

Há quatro estilos de botão da Barra de Ferramentas (valores TBBS_) usados para estados de exibição:

  • TBBS_CHECKED: A caixa de seleção está marcada no momento (para baixo).

  • TBBS_INDETERMINATE: A caixa de seleção está indeterminada no momento.

  • TBBS_DISABLED: O botão está desativado no momento.

  • TBBS_PRESSED: O botão está pressionado no momento.

Os seis estilos de botão oficiais do Guia de Design de Aplicativo de Interface do Windows são representados pelos seguintes valores TBBS:

  • Para cima = 0

  • Mouse para baixo = TBBS_PRESSED (| qualquer outro estilo)

  • Desativado = TBBS_DISABLED

  • Para baixo = TBBS_CHECKED

  • Desativado Down = TBBS_CHECKED | TBBS_DISABLED

  • Indeterminado = TBBS_INDETERMINATE

CDialogBar

Uma barra de diálogo é uma barra de controle que contém controles padrão do Windows. Ele age como uma caixa de diálogo, pois contém os controles e suporta tabulação entre eles. Ele também age como uma caixa de diálogo, pois usa um modelo de diálogo para representar a barra.

A CDialogBar é usado para a barra de ferramentas de visualização de impressão, que contém controles de botão padrão.

Usar um CDialogBar é como usar um CFormView. Você deve definir um modelo de diálogo para a barra de diálogo e remover todos os estilos, exceto WS_CHILD. Observe que a caixa de diálogo não deve estar visível.

As notificações de controle para um CDialogBar serão enviadas para o elemento pai da barra de ferramentas (assim como os botões).

Suporte CCmdUI para CDialogBar

Os botões da barra de diálogo devem ser atualizados através do mecanismo do manipulador de ON_UPDATE_COMMAND_UI. No momento ocioso, a barra de diálogo chamará o manipulador de ON_UPDATE_COMMAND_UI com o ID de comando de todos os botões que têm um ID >= 0x8000 (ou seja, no intervalo de IDs de comando).

O manipulador de ON_UPDATE_COMMAND_UI pode chamar:

  • Ativar: para ativar ou desativar o botão.

  • SetText: para alterar o texto do botão.

A personalização pode ser feita por meio de APIs padrão do gerenciador de janelas.

Ver também

Notas técnicas por número
Notas técnicas por categoria