Compartilhar via


TN031: Barras de Controle

Observação

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

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

CControlBar

Uma ControlBar é uma CWndclasse derivada que:

  • É alinhado à parte superior ou inferior de uma janela de quadro.

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

As barras de controle dão suporte aos estilos adicionais:

  • CBRS_TOP (o padrão) fixe a barra de controle na parte superior.

  • CBRS_BOTTOM Fixar a barra de controle na parte inferior.

  • CBRS_NOALIGN Não reposicione a barra de controle quando o pai redimensiona.

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

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

  • CToolBar Uma barra de ferramentas, os itens são botões bitmap alinhados em uma linha.

  • CDialogBar Um quadro semelhante à barra de ferramentas que contém controles padrão do Windows (criado a partir de um recurso de modelo de caixa de diálogo).

  • CDockBar Uma área de encaixe generalizada para outros CControlBar objetos derivados. As funções de membro específicas e as variáveis disponíveis nesta classe provavelmente serão alteradas em versões futuras.

Todos os objetos/janelas da barra de controle serão janelas filho de alguma janela de quadro pai. Eles geralmente são adicionados como um irmão à área do cliente do quadro (por exemplo, um cliente MDI ou exibição). A ID da janela filho de uma barra de controle é importante. O layout padrão da barra de controle funciona apenas 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 da barra de controle, as primeiras 32 dessas IDs da barra de controle são especiais, pois têm suporte diretamente na arquitetura de visualização de impressão.

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

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

  • Alocando matrizes de itens de controle.

  • Suporte à implementação de classes derivadas.

Os objetos da barra de controle C++ geralmente serão inseridos 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, basta definir o membro m_bAutoDestruct como TRUE para fazer a barra de controle invocar delete this; quando ele HWND for destruído.

Observação

Se você criar sua própria CControlBarclasse derivada, em vez de usar uma das classes derivadas do MFC, como CStatusBar, CToolBarou CDialogBar, precisará definir o membro de dados m_dwStyle . Isso pode ser feito na substituição de Create:

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

.
.
.
}

Algoritmo layout da barra de controle

O algoritmo de layout da barra de controle é muito simples. A janela de quadro envia uma mensagem WM_SIZEPARENT para todos os filhos no intervalo da barra de controle. Junto com essa mensagem, um ponteiro para o retângulo do cliente pai é passado. Esta mensagem é enviada para crianças em ordem Z. Os filhos da barra de controle usam essas informações para se posicionarem e diminuirem o tamanho da área de cliente do pai. O retângulo final que é deixado para a área de cliente normal (menos barras de controle) é usado para posicionar a janela principal do cliente (geralmente um cliente MDI, exibição ou janela de divisor).

Veja CWnd::RepositionBars e CFrameWnd::RecalcLayout para obter mais detalhes.

Mensagens privadas do Windows MFC, 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). Eles geralmente são acessados por um indexado baseado em 0

  • Como indicadores de status

    (por exemplo, os indicadores CAP, NUM e SCRL). Geralmente, elas são acessadas por ID de cadeia de caracteres/comando.

A fonte da barra de status é MS Sans Serif de 10 pontos (ditada pelo Guia de Design de Aplicativo da Interface do Windows ou a melhor correspondência de mapeadores de fonte 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 Guia de Design de Aplicativo da Interface do Windows. Essas cores não são codificadas em código e são alteradas dinamicamente em resposta à personalização do usuário no Painel de Controle.

Elemento Valor COLOR do Windows RGB padrão
Plano de fundo da barra de status COLOR_BTNFACE RGB(192, 192, 192)
Texto da barra de status COLOR_BTNTEXT RGB(000, 000, 000)
Bordas superior/esquerda da barra de status COLOR_BTNHIGHLIGHT RGB(255, 255, 255)
Bot da barra de status/bordas direitas COLOR_BTNSHADOW RGB(128, 128, 128)

Suporte do CCmdUI para CStatusBar

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

O manipulador de ON_UPDATE_COMMAND_UI pode chamar:

  • Enable: para habilitar ou desabilitar o painel. Um painel desabilitado 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á redimensionar 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 visível.

A barra de status dá suporte a 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 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, NÚM e SCRL, pois o primeiro painel é elástico.

CToolBar

Uma barra de ferramentas é uma barra de controle com uma linha de botões bitmap que podem incluir separadores. Há suporte para dois estilos de botões: botões de botão e caixa de seleção. A funcionalidade do grupo de rádio 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. Este 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 é o padrão de 24 x 22 pixels. Cada imagem/glifo deve ter o mesmo tamanho e deve estar lado a lado no bitmap. O tamanho padrão da imagem/glifo é de 16 x 15 pixels. Portanto, para uma barra de ferramentas com 10 botões (usando tamanhos padrão), você precisa de um bitmap de 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, pressionados, para cima, para baixo, desabilitados, desabilitados, indeterminados) são gerados algoritmos 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 tons de cinza. Examine os botões da barra de ferramentas padrão e a clip-art do botão de barra de ferramentas fornecida no CLIPART de exemplo geral do MFC para obter exemplos.

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

Elemento Valor COLOR do Windows RGB padrão
Plano de fundo da Barra de Ferramentas COLOR_BTNFACE RGB(192.192.192)
Botões da Barra de Ferramentas nas bordas superior/esquerda COLOR_BTNHIGHLIGHT RGB(255.255.255)
Botões da Barra de Ferramentas bot/bordas direitas 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 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 cores a seguir em um bitmap da barra de ferramentas serão recoloridas automaticamente para que sejam usadas com cuidado. Se você não quiser ter uma parte do bitmap recolorida, use uma cor que aproxima de perto um dos valores RGB mapeados. O mapeamento é feito com base em valores RGB exatos.

Valor RGB Valor COLOR mapeado dinamicamente
RGB(000, 000, 000) COLOR_BTNTEXT
RGB(128, 128, 128) COLOR_BTNSHADOW
RGB(192, 192, 192) COLOR_BTNFACE
RGB(255, 255, 255) COLOR_BTNHIGHLIGHT

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

As APIs de personalização podem ser usadas para ajustar as IDs de 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 do CCmdUI para CToolBar

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

O manipulador de ON_UPDATE_COMMAND_UI pode chamar:

  • Enable: para habilitar ou desabilitar o botão. Isso funciona igualmente para botões de botão e caixa de seleção.

  • SetCheck: para definir o estado de verificação de um botão. Chamar isso para um botão de barra de ferramentas o transformará em um botão de caixa de seleção. SetCheck usa 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 os pressiona, ele altera o estado imediatamente. Verificado é o estado para baixo ou deprimido. Não há nenhuma maneira interna de interface do usuário para alterar um botão no estado "indeterminado"; que deve ser feito por meio do código.

As APIs de personalização permitirão que você altere o estado de um determinado botão de barra de ferramentas, preferencialmente, 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 de que o processamento ocioso alterará o estado dos botões da barra de ferramentas com o manipulador de ON_UPDATE_COMMAND_UI, portanto, todas as alterações feitas nesses estados por meio de SetButtonStyle poderão ser perdidas após o próximo ocioso.

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 (para baixo).

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

  • TBBS_DISABLED: o botão está desabilitado no momento.

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

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

  • Up = 0

  • Mouse Down = TBBS_PRESSED (| qualquer outro estilo)

  • Desabilitado = TBBS_DISABLED

  • Down = TBBS_CHECKED

  • Desabilitado = 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 na qual contém os controles e dá suporte à tabulação entre eles. Ele também age como uma caixa de diálogo, pois usa um modelo de caixa de diálogo para representar a barra.

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

Usar um CDialogBar é como usar um CFormView. Você deve definir um modelo de caixa 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 pai da barra de controle (assim como botões da barra de ferramentas).

Suporte do CCmdUI para CDialogBar

Os botões da barra de diálogo devem ser atualizados por meio do mecanismo de manipulador de ON_UPDATE_COMMAND_UI. Em tempo ocioso, a barra de diálogo chamará o manipulador de ON_UPDATE_COMMAND_UI com a ID de comando de todos os botões que têm uma ID >= 0x8000 (ou seja, no intervalo de IDs de comando).

O manipulador de ON_UPDATE_COMMAND_UI pode chamar:

  • Habilitar: habilitar ou desabilitar 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.

Consulte também

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