Partilhar via


Mensagens de botão

Um botão pode enviar mensagens para sua janela pai e uma janela pai pode enviar mensagens para um botão.

Os tópicos a seguir são discutidos nesta seção.

Enviando mensagens para botões

Uma janela pai pode enviar mensagens para um botão em uma janela sobreposta ou filho usando a função SendMessage ou pode enviar mensagens para um botão em uma caixa de diálogo usando as funções SendDlgItemMessage, CheckDlgButton, CheckRadioButton e IsDlgButtonChecked.

Um aplicativo pode usar a mensagem BM_GETCHECK para recuperar o estado de seleção de uma caixa de seleção ou botão de opção. Um aplicativo também pode usar a mensagem BM_GETSTATE para recuperar os estados atuais do botão (o estado de verificação, o estado de envio e o estado de foco). Para obter informações sobre um estado específico, use uma máscara de bits no valor de estado retornado.

A mensagem BM_SETCHECK define o estado de seleção de uma caixa de seleção ou botão de opção, a mensagem retorna zero. A mensagem BM_SETSTATE define o estado de pressão de um botão, essa mensagem também retorna zero. A mensagem BM_SETSTYLE altera o estilo de um botão. Ele foi projetado para alterar estilos de botão dentro de um tipo (por exemplo, alterar uma caixa de seleção para uma caixa de seleção automática). Ele não foi projetado para alterar entre tipos (por exemplo, alterar uma caixa de seleção para um botão de opção). Um aplicativo não deve alterar um botão de um tipo para outro.

Um botão do estilo BS_BITMAP ou BS_ICON exibe um bitmap ou ícone em vez de texto. A mensagem BM_SETIMAGE associa um identificador a um bitmap ou ícone com um botão. A mensagem BM_GETIMAGE recupera um identificador para o bitmap ou ícone associado a um botão.

Um aplicativo também pode usar a mensagem DM_GETDEFID para recuperar o identificador do controle de botão padrão em uma caixa de diálogo. Um aplicativo pode usar a mensagem DM_SETDEFID para definir o botão padrão para uma caixa de diálogo.

Chamar a função CheckDlgButton ou CheckRadioButton é equivalente a enviar uma mensagem BM_SETCHECK. Chamar a função IsDlgButtonChecked é equivalente a enviar uma mensagem BM_GETCHECK.

Manipulando mensagens de um botão

As notificações de um botão são enviadas como mensagens WM_COMMAND ou WM_NOTIFY. Informações sobre qual mensagem é usada podem ser encontradas na página de referência de cada notificação.

Para obter mais informações sobre como manipular mensagens, consulte Controlar mensagens. Consulte também Mensagens de botão.

Mensagens de notificação de botões

Quando o usuário clica em um botão, seu estado muda e o botão envia códigos de notificação, na forma de mensagens WM_COMMAND, para sua janela pai. Por exemplo, um controle de botão envia o código de notificação BN_CLICKED sempre que o usuário escolhe o botão. Em todos os casos (exceto para BCN_HOTITEMCHANGE), a palavra de ordem baixa do parâmetro wParam contém o identificador de controle, a palavra de ordem alta de wParam contém o código de notificação e o parâmetro lParam contém o identificador da janela de controle.

A mensagem e a resposta da janela pai dependem do tipo, estilo e estado atual do botão. A seguir estão os códigos de notificação de botão que um aplicativo deve monitorar e processar.

Código de notificação Descrição
BCN_HOTITEMCHANGE O mouse entrou ou saiu da área do cliente de um botão.
BN_CLICKED O usuário clicou em um botão.
BN_DBLCLK ou BN_DOUBLECLICKED O usuário clicou duas vezes em um botão.
BN_DISABLE Um botão está desativado.
BN_PUSHED ou BN_HILITE O usuário apertou um botão.
BN_KILLFOCUS O botão perdeu o foco do teclado.
BN_PAINT O botão deve ser pintado.
BN_SETFOCUS O botão ganhou o foco do teclado.
BN_UNPUSHED ou BN_UNHILITE O botão não é mais pressionado.

 

Um botão envia os códigos de notificação BN_DISABLE, BN_PUSHED, BN_KILLFOCUS, BN_PAINT, BN_SETFOCUS e BN_UNPUSHED somente se tiver o estilo BS_NOTIFY. BN_DBLCLK códigos de notificação são enviados automaticamente para os botões BS_USERBUTTON, BS_RADIOBUTTON e BS_OWNERDRAW. Outros tipos de botão enviam BN_DBLCLK somente se tiverem o estilo BS_NOTIFY. Todos os botões enviam o código de notificação BN_CLICKED, independentemente de seus estilos de botão.

Para botões automáticos, o sistema altera o estado de pressão e pinta o botão. Nesse caso, o aplicativo normalmente processa apenas os códigos de notificação BN_CLICKED e BN_DBLCLK . Para botões que não são automáticos, o aplicativo normalmente responde ao código de notificação enviando uma mensagem para alterar o estado do botão. Para obter informações sobre como enviar mensagens para botões, consulte Enviando mensagens para botões.

Quando o usuário seleciona um botão desenhado pelo proprietário, o botão envia à janela pai uma mensagem de WM_DRAWITEM contendo o identificador do controle a ser desenhado e informações sobre suas dimensões e estado.

Mensagens de cor do botão

O sistema fornece valores de cor padrão para botões. Um aplicativo pode recuperar os valores padrão para essas cores chamando a função GetSysColor ou definir os valores chamando a função SetSysColors. A tabela a seguir mostra os valores padrão de cor do botão.

Valor Elemento colorido
COLOR_BTNFACE Faces de botão.
COLOR_BTNHIGHLIGHT Área de realce (bordas superior e esquerda) de um botão.
COLOR_BTNSHADOW Área de sombra (bordas inferior e direita) de um botão.
COLOR_BTNTEXT Texto normal (não acinzentado) nos botões.
COLOR_GRAYTEXT Texto desativado (cinza) nos botões. Essa cor será definida como 0 se o driver de vídeo atual não oferecer suporte a uma cor cinza sólida.
COLOR_WINDOW Fundos de janela.
COLOR_WINDOWFRAME Caixilhos de janela.
COLOR_WINDOWTEXT Texto em janelas.

 

No entanto, chamar SetSysColors afeta todos os aplicativos, portanto, você não deve chamar essa função para personalizar botões para seu aplicativo.

O sistema envia uma mensagem de WM_CTLCOLORBTN para a janela pai de um botão antes de desenhar um botão. Essa mensagem contém um identificador para o contexto do dispositivo do botão e um identificador para a janela filho. A janela pai pode usar essas alças para alterar as cores do texto e do plano de fundo do botão. No entanto, apenas os botões desenhados pelo proprietário respondem à janela pai que processa a mensagem.

Processamento de mensagens padrão do botão

O procedimento de janela para a classe de janela de controle de botão predefinida executa o processamento padrão para todas as mensagens que o procedimento de controle de botão não processa. Quando o procedimento de controle de botão retorna FALSE para qualquer mensagem, o procedimento de janela predefinido verifica as mensagens e executa as ações padrão listadas na tabela a seguir.

Mensagem Ação padrão
BM_CLICK Envia ao botão uma mensagem WM_LBUTTONDOWN e uma mensagem WM_LBUTTONUP e envia à janela pai um código de notificação BN_CLICKED.
BM_GETCHECK Retorna o estado de verificação do botão.
BM_GETIMAGE Retorna um identificador para o bitmap ou ícone associado ao botão ou NULL se o botão não tiver nenhum bitmap ou ícone.
BM_GETSTATE Retorna o estado de verificação atual, o estado de push e o estado de foco do botão.
BM_SETCHECK Define o estado de verificação para todos os estilos de botões de opção e caixas de seleção. Se o parâmetro wParam for maior que zero para botões de opção, o botão receberá o estilo WS_TABSTOP.
BM_SETIMAGE Associa o bitmap especificado ou o identificador de ícone ao botão e retorna um identificador ao bitmap ou ícone anterior.
BM_SETSTATE Define o estado de pressão do botão. Para botões desenhados pelo proprietário, uma mensagem de WM_DRAWITEM é enviada para a janela pai se o estado do botão tiver sido alterado.
BM_SETSTYLE Define o estilo do botão. Se a palavra de ordem baixa do parâmetro lParam for TRUE, o botão será redesenhado.
WM_CHAR Marca uma caixa de seleção ou caixa de seleção automática quando o usuário pressiona as teclas de adição (+) ou igual (=). Desmarca uma caixa de seleção ou caixa de seleção automática quando o usuário pressiona a tecla de subtração (–).
WM_ENABLE Pinta o botão.
WM_ERASEBKGND Apaga o plano de fundo dos botões desenhados pelo proprietário. Os planos de fundo de outros botões são apagados como parte do processamento de WM_PAINT e WM_ENABLE.
WM_GETDLGCODE Retorna valores que indicam o tipo de entrada processada pelo procedimento de botão padrão, conforme mostrado na tabela a seguir.
Estilo do botão Retornos
BS_AUTOCHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_AUTORADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON
BS_CHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_DEFPUSHBUTTON DLGC_DEFPUSHBUTTON | DLGC_BUTTON
BS_GROUPBOX DLGC_STATIC
BS_PUSHBUTTON DLGC_UNDEFPUSHBUTTON | DLGC_BUTTON
BS_RADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON

 

WM_GETFONT Retorna um identificador para a fonte atual.
WM_KEYDOWN Pressiona o botão se o usuário pressionar a barra de espaços.
WM_KEYUP Libera a captura do mouse para todos os casos, exceto a tecla TAB.
WM_KILLFOCUS Remove o retângulo de foco de um botão. Para botões de pressão e botões padrão, o retângulo de foco é invalidado. Se o botão tiver a captura do mouse, a captura será liberada, o botão não será clicado e qualquer estado de push será removido.
WM_LBUTTONDBLCLK Envia um código de notificação BN_DBLCLK para a janela pai para botões de opção e botões desenhados pelo proprietário. Para outros botões, um clique duplo é processado como uma mensagem WM_LBUTTONDOWN.
WM_LBUTTONDOWN Realça o botão se a posição do cursor do mouse estiver dentro do retângulo do cliente do botão.
WM_LBUTTONUP Libera a captura do mouse se o botão tiver a captura do mouse.
WM_MOUSEMOVE Executa a mesma ação que WM_LBUTTONDOWN, se o botão tiver a captura do mouse. Caso contrário, nenhuma ação será executada.
WM_NCCREATE Transforma qualquer botão BS_OWNERDRAW em um botão BS_PUSHBUTTON.
WM_NCHITTEST Retorna HTTRANSPARENT, se o controle de botão for uma caixa de grupo.
WM_PAINT Desenha o botão de acordo com seu estilo e estado atual.
WM_SETFOCUS Desenha um retângulo de foco no botão obtendo o foco. Para botões de opção e botões de opção automáticos, a janela pai recebe um código de notificação BN_CLICKED .
WM_SETFONT Define uma nova fonte e, opcionalmente, atualiza a janela.
WM_SETTEXT Define o texto do botão. No caso de uma caixa de grupo, a mensagem é pintada sobre o texto preexistente antes de repintar a caixa de grupo com o novo texto.
WM_SYSKEYUP Libera a captura do mouse para todos os casos, exceto a tecla TAB.

 

O procedimento de janela predefinido passa todas as outras mensagens para a função DefWindowProc para processamento padrão.

Mensagens de controle