Partilhar via


Considerações sobre programação da caixa de diálogo

Esta visão geral discute algumas considerações de programação relativas a caixas de diálogo.

A visão geral inclui os seguintes tópicos.

Procedimentos da caixa de diálogo

Um procedimento de caixa de diálogo é semelhante a um procedimento de janela em que o sistema envia mensagens para o procedimento quando tem informações para dar ou tarefas para realizar. Ao contrário de um procedimento de janela, um procedimento de caixa de diálogo nunca chama a funçãoDefWindowProc. Em vez disso, ele retorna TRUE se processar uma mensagem ou FALSE se não processar.

Cada procedimento de caixa de diálogo tem a seguinte forma:

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

Os parâmetros de procedimento servem a mesma finalidade de um procedimento de janela, com o parâmetro hwndDlg recebendo o identificador de janela da caixa de diálogo.

A maioria dos procedimentos de caixa de diálogo processa a mensagem WM_INITDIALOG e as mensagens WM_COMMAND enviadas pelos controles, mas processa poucas ou nenhuma outra mensagem. Se um procedimento de caixa de diálogo não processar uma mensagem, ele deverá retornar FALSO para direcionar o sistema a processar a mensagem internamente. A única exceção a esta regra é a mensagem WM_INITDIALOG. O procedimento da caixa de diálogo deve retornar TRUE para direcionar o sistema para processar ainda mais a mensagem WM_INITDIALOG. Em qualquer caso, o procedimento não deve chamar DefWindowProc.

A Mensagem WM_INITDIALOG

O sistema não envia uma mensagem WM_CREATE para o procedimento da caixa de diálogo. Em vez disso, ele envia uma mensagem WM_INITDIALOG quando cria a caixa de diálogo e todos os seus controles, mas antes de exibir a caixa de diálogo. O procedimento deve executar qualquer inicialização necessária para garantir que a caixa de diálogo exiba as configurações atuais associadas à tarefa. Por exemplo, quando uma caixa de diálogo contém um controle para mostrar a unidade e o diretório atuais, o procedimento deve determinar a unidade e o diretório atuais e definir o controle para esse valor.

O procedimento pode inicializar controles usando funções como SetDlgItemText e CheckDlgButton. Como os controles são janelas, o procedimento também pode manipulá-los usando funções de gerenciamento de janelas, como EnableWindow e SetFocus. O procedimento pode recuperar o identificador de janela para um controle usando o função GetDlgItem.

O procedimento da caixa de diálogo pode alterar o conteúdo, o estado e a posição de qualquer controle, conforme necessário. Por exemplo, em uma caixa de diálogo que contém uma caixa de listagem de nomes de arquivos e um botão Abrir, o procedimento pode desativar o botão Abrir até que o usuário selecione um arquivo da lista. Neste exemplo, o modelo de caixa de diálogo especifica o estilo de WS_DISABLED para o botão Abrir e o sistema desativa automaticamente o botão ao criá-lo. Quando o procedimento da caixa de diálogo recebe uma mensagem de notificação da caixa de listagem indicando que o usuário selecionou um arquivo, o procedimento chama a função EnableWindow para habilitar o botão Abrir.

Para exibir um ícone personalizado na barra de legenda da caixa de diálogo, o manipulador de WM_INITDIALOG pode enviar a mensagem WM_SETICON à caixa de diálogo.

Se o aplicativo criar a caixa de diálogo usando uma das funções DialogBoxParam, DialogBoxIndirectParam, CreateDialogParamou CreateDialogIndirectParam, o parâmetro lParam para a mensagem WM_INITDIALOG conterá o parâmetro extra passado para a função. Os aplicativos normalmente usam esse parâmetro extra para passar um ponteiro para informações de inicialização adicionais para o procedimento da caixa de diálogo, mas o procedimento da caixa de diálogo deve determinar o significado do parâmetro. Se o aplicativo usa outra função para criar a caixa de diálogo, o sistema define o parâmetro lParam como NULL .

Antes de retornar da mensagem WM_INITDIALOG, o procedimento deve determinar se ele deve definir o foco de entrada para um controle especificado. Se o procedimento da caixa de diálogo retornar TRUE, o sistema define automaticamente o foco de entrada para o controle cuja alça de janela está no parâmetro wParam. Se o controlo que recebe o foco padrão não for apropriado, pode-se definir o foco para o controlo apropriado usando a função SetFocus. Se o procedimento define o foco de entrada, ele deve retornar FALSO para impedir que o sistema defina o foco padrão. O controle que recebe o foco de entrada padrão é sempre o primeiro controle especificado no modelo que está visível, não desabilitado e tem o estilo WS_TABSTOP. Se esse controle não existir, o sistema define o foco de entrada padrão para o primeiro controle no modelo.

A mensagem WM_COMMAND

Um controle pode enviar uma mensagem WM_COMMAND para o procedimento da caixa de diálogo quando o usuário executa uma ação no controle. Essas mensagens, chamadas mensagens de notificação, informam o procedimento de entrada do usuário e permitem que ele execute respostas apropriadas.

Todos os controles predefinidos, exceto controles estáticos, enviam mensagens de notificação para ações de usuário selecionadas. Por exemplo, um botão envia a mensagem de notificação BN_CLICKED sempre que o utilizador clica no botão. Em todos os casos, 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.

O procedimento da caixa de diálogo deve monitorar e processar mensagens de notificação. Em particular, o procedimento deve processar mensagens com os identificadores IDOK ou IDCANCEL; Essas mensagens representam uma solicitação do usuário para fechar a caixa de diálogo. O procedimento deve fechar a caixa de diálogo usando as funções EndDialog para caixas de diálogo modais e DestroyWindow para caixas de diálogo não-modais.

O sistema também envia mensagens WM_COMMAND para o procedimento da caixa de diálogo se a caixa de diálogo tiver um menu, como a janela menu, e o usuário clicar em um item de menu. Em particular, o sistema envia uma mensagem WM_COMMAND com o parâmetro wParam definido para IDCANCEL sempre que o usuário clica em Fechar no menu da janela da caixa de diálogo. A mensagem é quase idêntica à mensagem de notificação enviada pelo botão Cancelar e deve ser processada exatamente da mesma maneira.

A mensagem WM_PARENTNOTIFY

Um controle envia uma mensagem WM_PARENTNOTIFY sempre que o usuário pressiona um botão do mouse enquanto aponta para o controle. Alguns aplicativos interpretam essa mensagem como um sinal para executar uma ação relacionada ao controle, como exibir uma linha de texto descrevendo a finalidade do controle.

O sistema também envia mensagens WM_PARENTNOTIFY quando cria e destrói uma janela, mas não para controles criados a partir de um modelo de caixa de diálogo. O sistema impede essas mensagens especificando o estilo WS_EX_NOPARENTNOTIFY ao criar os controles. Um aplicativo não pode substituir esse comportamento padrão, a menos que crie seus próprios controles para a caixa de diálogo.

Control-Color Mensagens

Os controles e o sistema podem enviar mensagens de cor de controle quando quiserem que o procedimento da caixa de diálogo pinte o plano de fundo de um controle ou outra janela usando um pincel e cores específicos. Isso pode ser útil quando os aplicativos substituem as cores padrão usadas em caixas de diálogo e seus controles. A seguir estão as mensagens de cor de controle, que substituíram a mensagem WM_CTLCOLOR.

Um controlador envia uma mensagem de cor para o procedimento da caixa de diálogo imediatamente antes de pintar o seu próprio plano de fundo. A mensagem permite que o procedimento especifique qual pincel usar e defina as cores de plano de fundo e primeiro plano. O procedimento especifica um pincel retornando a alça do pincel. Para definir as cores de plano de fundo e de primeiro plano, o procedimento utiliza as funções de SetBkColor e de SetTextColor com o contexto do dispositivo de exibição do controle. A mensagem de controlo de cor fornece um identificador para o contexto do dispositivo de exibição ao procedimento no parâmetro wParam da mensagem.

O sistema envia uma mensagem WM_CTLCOLORDLG para o procedimento da caixa de diálogo se o procedimento não processar a mensagem WM_ERASEBKGND. A classe de caixa de diálogo predefinida não tem um pincel de plano de fundo de classe, portanto, essa mensagem permite que o procedimento defina o seu próprio plano de fundo sem precisar incluir código para realizar essa tarefa.

Em qualquer caso, quando um procedimento de caixa de diálogo não processa uma mensagem de cor de controle, o sistema usa um pincel com a cor de janela padrão para pintar o plano de fundo de todos os controles e janelas, exceto barras de rolagem. Um aplicativo pode recuperar a cor da janela padrão passando o valor COLOR_WINDOW para a funçãoGetSysColor. Enquanto o plano de fundo é pintado, a cor de primeiro plano para o contexto do dispositivo de exibição é definida como a cor de texto padrão (COLOR_WINDOWTEXT). Para barras de rolagem, o sistema usa um pincel com a cor padrão da barra de rolagem (COLOR_SCROLLBAR). Nesse caso, as cores de plano de fundo e primeiro plano para o contexto do dispositivo de exibição são definidas como branco e preto, respectivamente.

Caixa de diálogo Processamento de mensagens padrão

O procedimento de janela para a classe de caixa de diálogo predefinida executa o processamento padrão para todas as mensagens que o procedimento da caixa de diálogo não processa. Quando o procedimento da caixa de diálogo retorna FALSE para qualquer mensagem, o procedimento de janela predefinido verifica as mensagens e executa as seguintes ações padrão:

Mensagem Ação padrão
DM_GETDEFID Pode enviar esta mensagem para uma caixa de diálogo. A caixa de diálogo retorna o identificador de controle do botão de pressão padrão, se a caixa de diálogo tiver um; caso contrário, ele retorna zero.
DM_REPOSITION Você pode enviar essa mensagem para uma caixa de diálogo de nível superior. A caixa de diálogo reposiciona-se para que caiba na área de trabalho.
DM_SETDEFID Pode enviar esta mensagem para uma caixa de diálogo. A caixa de diálogo define o botão de pressão padrão para o controle especificado pelo identificador de controle no parâmetro wParam.
WM_ACTIVATE Restaura o foco de entrada para o controle identificado pelo identificador salvo anteriormente se a caixa de diálogo estiver ativada. Caso contrário, o procedimento salva o identificador para o controle com o foco de entrada.
WM_CHARTOITEM Retorna zero.
WM_CLOSE Posta a mensagem de notificação de BN_CLICKED na caixa de diálogo, especificando IDCANCEL como o identificador de controle. Se a caixa de diálogo tiver um identificador de controle IDCANCEL e o controle estiver desativado no momento, o procedimento soará um aviso e não postará a mensagem.
WM_COMPAREITEM Devolve zero.
WM_ERASEBKGND Preenche a área do cliente da caixa de diálogo utilizando a escova retornada da mensagem WM_CTLCOLORDLG ou a cor padrão da janela.
WM_GETFONT Retorna um identificador para a fonte da caixa de diálogo definida pelo aplicativo.
WM_INITDIALOG Retorna zero.
WM_LBUTTONDOWN Envia uma mensagem CB_SHOWDROPDOWN para a caixa de combinação com o foco de entrada, direcionando o controle para ocultar sua caixa de listagem suspensa. O procedimento chama DefWindowProc para concluir a ação padrão.
WM_NCDESTROY Libera memória global alocada para editar controles na caixa de diálogo (aplica-se a caixas de diálogo que especificam o estilo DS_LOCALEDIT) e libera qualquer fonte definida pelo aplicativo (aplica-se a caixas de diálogo que especificam o estilo DS_SETFONT ou DS_SHELLFONT). O procedimento chama a função DefWindowProc para concluir a ação padrão.
WM_NCLBUTTONDOWN Envia uma mensagem CB_SHOWDROPDOWN para a caixa de combinação com o foco de entrada, instruindo o controlo a ocultar a sua caixa de listagem suspensa. O procedimento chama DefWindowProc para concluir a ação padrão.
WM_NEXTDLGCTL Define o foco de entrada para o controle seguinte ou anterior na caixa de diálogo, para o controle identificado pelo identificador no parâmetro wParam ou para o primeiro controle na caixa de diálogo que está visível, não desabilitado e tem o estilo WS_TABSTOP. O procedimento ignora essa mensagem se a janela atual com o foco de entrada não for um controle.
WM_SETFOCUS Define o foco de entrada para o controle identificado por uma alça de janela de controle salva anteriormente. Se esse identificador não existir, o procedimento define o foco de entrada para o primeiro controle no modelo de caixa de diálogo que está visível, não desabilitado e tem o estilo WS_TABSTOP. Se esse controle não existir, o procedimento define o foco de entrada para o primeiro controle no modelo.
WM_SHOWWINDOW Salva um identificador para o controle com o foco de entrada se a caixa de diálogo estiver oculta e, em seguida, chama DefWindowProc para concluir a ação padrão.
WM_SYSCOMMAND Salva um identificador para o controle com o foco de entrada se a caixa de diálogo estiver sendo minimizada e, em seguida, chama DefWindowProc para concluir a ação padrão.
WM_VKEYTOITEM Retorna zero.

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

Interface de teclado da caixa de diálogo

O sistema fornece uma interface de teclado especial para caixas de diálogo que realiza processamento especial para várias teclas. A interface gera mensagens que correspondem a determinados botões na caixa de diálogo ou altera o foco de entrada de um controle para outro. A seguir estão as chaves usadas nesta interface e suas respetivas ações.

Chave Ação
ALT+mnemónico Move o foco de entrada para o primeiro controle (com o estilo WS_TABSTOP) após o controle estático que contém o mnemônico especificado.
PARA BAIXO Move o foco de entrada para o próximo controlo do grupo.
ENTRAR Envia uma mensagem WM_COMMAND para o procedimento da caixa de diálogo. O parâmetro wParam é definido como IDOK ou identificador de controle do botão de pressão padrão.
ESC Envia uma mensagem WM_COMMAND para o procedimento da caixa de diálogo. O parâmetro wParam é definido como IDCANCEL.
ESQUERDA Move o foco de entrada para o controle anterior no grupo.
mnemónica Move o foco de entrada para o primeiro controle (com o estilo WS_TABSTOP) após o controle estático que contém o mnemônico especificado.
CERTO Move o foco de entrada para o próximo controle no grupo.
SHIFT+TAB Move o foco de entrada para o controle anterior que tem o estilo WS_TABSTOP.
ABA Move o foco de entrada para o próximo controle que tem o estilo WS_TABSTOP.
CIMA Move o foco de entrada para o controle anterior no grupo.

O sistema fornece automaticamente a interface do teclado para todas as caixas de diálogo modais. Ele não fornece a interface para caixas de diálogo não modais, a menos que o aplicativo chame a função IsDialogMessage para filtrar mensagens em seu loop principal de mensagens. Isso significa que o aplicativo deve passar a mensagem para IsDialogMessage imediatamente após recuperar a mensagem da fila de mensagens. A função processa as mensagens se for para a caixa de diálogo e retorna um valor diferente de zero para indicar que a mensagem foi processada e não deve ser passada para a função TranslateMessage ou DispatchMessage.

Como a interface de teclado da caixa de diálogo usa teclas de direção para navegar entre os controlos numa caixa de diálogo, uma aplicação não pode usar essas teclas para rolar o conteúdo de qualquer caixa de diálogo modal ou qualquer caixa de diálogo não modal na qual IsDialogMessage é chamado. Quando uma caixa de diálogo tem barras de rolagem, o aplicativo deve fornecer uma interface de teclado alternativa para as barras de rolagem. Observe que a interface do mouse para rolagem está disponível quando o sistema inclui um mouse.

O estilo WS_TABSTOP

O estilo WS_TABSTOP especifica os controles para os quais o usuário pode se mover pressionando as teclas TAB ou SHIFT+TAB.

Quando o usuário pressiona TAB ou SHIFT + TAB, o sistema primeiro determina se essas teclas são processadas pelo controle que atualmente tem o foco de entrada. Ele envia ao controle uma mensagem WM_GETDLGCODE e, se o controle retornar DLGC_WANTTAB, o sistema passa as chaves para o controle. Caso contrário, o sistema usa a função GetNextDlgTabItem para localizar o próximo controlo que está visível, não desativado e que tem o estilo WS_TABSTOP. A pesquisa começa com o controle que atualmente tem o foco de entrada e prossegue na ordem em que os controles foram criados, ou seja, a ordem em que eles são definidos na estrutura da caixa de diálogo. Quando o sistema localiza um controle com as características necessárias, o sistema move o foco de entrada para ele.

Se a busca pelo próximo controle com o estilo WS_TABSTOP encontrar uma janela com o estilo WS_EX_CONTROLPARENT, o sistema pesquisará recursivamente os filhos da janela.

Um aplicativo também pode usar GetNextDlgTabItem para localizar controles com o estilo WS_TABSTOP. A função recupera a alça da janela do controle seguinte ou anterior com o estilo WS_TABSTOP sem mover o foco de entrada.

O estilo WS_GROUP

Por padrão, o sistema move o foco de entrada para o controle seguinte ou anterior sempre que o usuário pressiona uma tecla de direção. Contanto que o controle atual com o foco de entrada não processe essas teclas e o controle seguinte ou anterior não seja um controle estático, o sistema continua a mover o foco de entrada através de todos os controles na caixa de diálogo enquanto o usuário continua a pressionar as teclas de direção.

Um aplicativo pode usar o estilo WS_GROUP para modificar esse comportamento padrão. O estilo marca o início de um grupo de controles. Se um controlador no grupo focar a entrada quando o usuário começar a pressionar as teclas de direção, o foco permanecerá no grupo. Em geral, o primeiro controle em um grupo deve ter o estilo WS_GROUP e todos os outros controles no grupo não devem ter esse estilo. Todos os controles no grupo devem ser contíguos, ou seja, devem ter sido criados consecutivamente sem controles intervenientes.

Quando o usuário pressiona uma tecla de direção, o sistema primeiro determina se o controle atual com o foco de entrada processa as teclas de direção. O sistema envia uma mensagem WM_GETDLGCODE para o controle e se o controle retorna o valor DLGC_WANTARROWS, passa a chave para o controle. Caso contrário, o sistema usa a função GetNextDlgGroupItem para determinar o próximo controle no grupo.

GetNextDlgGroupItem procura pelos controlos na ordem (ou ordem inversa) em que foram criados. Se o usuário pressionar a tecla RIGHT ou DOWN, GetNextDlgGroupItem retornará o próximo controle se esse controle não tiver o estilo WS_GROUP. Caso contrário, a função inverte a ordem da pesquisa e retorna o primeiro controle que tem o estilo WS_GROUP. Se o usuário pressionar a tecla LEFT ou UP, a função retorna o controle anterior, a menos que o controle atual já tenha o estilo WS_GROUP. Se o controle atual tiver esse estilo, a função inverte a ordem da pesquisa, localiza o primeiro controle com o estilo WS_GROUP e retorna o controle que precede imediatamente o controle localizado.

Se a busca pelo próximo controle no grupo encontrar uma janela com o estilo WS_EX_CONTROLPARENT, o sistema pesquisa recursivamente os filhos da janela.

Depois que o sistema tem o controle seguinte ou anterior, ele envia uma mensagem WM_GETDLGCODE para o controle para determinar o tipo de controle. Em seguida, o sistema move o foco de entrada para controlar se não for um controle estático. Se o controle for um botão de opção automático, o sistema enviará uma mensagem BM_CLICK para ele. Um aplicativo também pode usar GetNextDlgGroupItem para localizar controles em um grupo.

Geralmente, o primeiro controle no grupo combina os estilos WS_GROUP e WS_TABSTOP para que o usuário possa mover de grupo para grupo usando a tecla TAB. Se o grupo contiver botões de opção, o aplicativo deverá aplicar o estilo WS_TABSTOP somente ao primeiro controle do grupo. O sistema move automaticamente o estilo quando o usuário se move entre controles no grupo. Isso garante que o foco de entrada sempre estará no controle selecionado mais recentemente quando o usuário se move para o grupo usando a tecla TAB.

Mnemónica

Um mnemônico é uma letra ou dígito selecionado no rótulo de um botão ou no texto de um controle estático. O sistema move o foco de entrada para o controle associado ao mnemônico sempre que o usuário pressiona a tecla que corresponde ao mnemônico ou pressiona essa tecla e a tecla ALT em combinação. Os mnemônicos fornecem uma maneira rápida para o usuário se mover para um controle especificado usando o teclado.

Uma aplicação cria um mnemônico para um controle inserindo o sinal e comercial (&) imediatamente antes da letra ou dígito selecionado no rótulo ou texto do controle. Na maioria dos casos, a cadeia de caracteres terminada por nulo fornecida pelo controlo no modelo de caixa de diálogo contém o ampersand. No entanto, uma aplicação pode criar um mnemônico a qualquer momento, substituindo o rótulo ou texto existente de um controlo por meio da função SetDlgItemText. Apenas um mnemônico pode ser especificado para cada controle. Embora seja recomendado, os mnemónicos numa caixa de diálogo não precisam ser exclusivos.

Quando o usuário pressiona uma tecla de letra ou dígito, o sistema primeiro determina se o controle atual com o foco de entrada processa a chave. O sistema envia uma mensagem WM_GETDLGCODE para o controle e, se o controle retornar o valor DLGC_WANTALLKEYS ou DLG_WANTMESSAGE, o sistema passa a chave para o controle. Caso contrário, ele procura um controle cujo mnemônico corresponde à letra ou dígito especificado. Continua a procurar até localizar um controlo ou ter examinado todos os controlos. Durante a pesquisa, ele ignora todos os controles estáticos que têm o estilo SS_NOPREFIX.

Se a busca por um controle com um mnemônico correspondente encontra uma janela com o estilo WS_EX_CONTROLPARENT, o sistema pesquisa recursivamente os filhos da janela.

Se o sistema localizar um controle estático e o controle não estiver desativado, o sistema moverá o foco de entrada para o primeiro controle após o controle estático que está visível, não desativado e que tem o estilo WS_TABSTOP. Se o sistema localizar algum outro controle que tenha um mnemônico correspondente, ele moverá o foco de entrada para esse controle. Se o controlo for um botão de pressão padrão, o sistema enviará uma mensagem de notificação BN_CLICKED para o procedimento da caixa de diálogo. Se o controle for outro estilo de botão e não houver outro controle na caixa de diálogo com o mesmo mnemônico, o sistema enviará a mensagem BM_CLICK para o controle.

Configurações da caixa de diálogo

As configurações da caixa de diálogo são as seleções e valores atuais para os controles na caixa de diálogo. O procedimento da caixa de diálogo é responsável por inicializar os controles para essas configurações ao criar a caixa de diálogo. Ele também é responsável por recuperar as configurações atuais dos controles antes de destruir a caixa de diálogo. Os métodos usados para inicializar e recuperar configurações dependem do tipo de controle.

Para obter mais informações, consulte os seguintes tópicos:

Botões de rádio e caixas de seleção

As caixas de diálogo usam botões de opção e caixas de seleção para permitir que o utilizador escolha a partir de uma lista de opções. Os botões de opção permitem ao utilizador escolher entre opções mutuamente exclusivas; as caixas de seleção permitem que o utilizador escolha uma combinação de opções.

O procedimento da caixa de diálogo pode definir o estado inicial de uma caixa de seleção usando a funçãoCheckDlgButton, que define ou desmarca a caixa de seleção. Para botões de opção em um grupo de botões de opção mutuamente exclusivos, o procedimento da caixa de diálogo pode usar a funçãoCheckRadioButtonpara definir o botão de opção apropriado e limpar automaticamente qualquer outro botão de opção.

Antes de uma caixa de diálogo terminar, o procedimento da caixa de diálogo pode verificar o estado de cada botão de opção e caixa de seleção usando a função IsDlgButtonChecked, que retorna o estado atual do botão. Uma caixa de diálogo normalmente salva essas informações para inicializar os botões na próxima vez que criar a caixa de diálogo.

Caixa de diálogo Editar controles

Muitas caixas de diálogo têm controles de edição que permitem ao usuário fornecer texto como entrada. A maioria dos procedimentos da caixa de diálogo inicializa um controle de edição quando a caixa de diálogo é iniciada pela primeira vez. Por exemplo, o procedimento da caixa de diálogo pode colocar um nome de arquivo proposto no controle que o usuário pode selecionar, modificar ou substituir. O procedimento da caixa de diálogo pode definir o texto em um controle de edição usando a funçãoSetDlgItemText, que copia o texto de um buffer especificado para o controle de edição. Quando o controle de edição recebe o foco de entrada, ele seleciona automaticamente o texto completo para edição.

Como os controles de edição não retornam automaticamente o texto para a caixa de diálogo, o procedimento da caixa de diálogo deve recuperar o texto antes que ele seja encerrado. Ele pode recuperar o texto usando a função GetDlgItemText, que copia o texto do controle de edição para um buffer. O procedimento da caixa de diálogo normalmente salva esse texto para inicializar o controle de edição mais tarde ou o passa para a janela pai para processamento.

Algumas caixas de diálogo usam controles de edição que permitem que o usuário insira números. O procedimento da caixa de diálogo pode recuperar um número de um controle de edição usando a funçãoGetDlgItemInt, que recupera o texto do controle de edição e converte o texto em um valor decimal. O usuário digita o número em dígitos decimais. Pode ser assinado ou não. O procedimento da caixa de diálogo pode exibir um inteiro usando a função SetDlgItemInt. SetDlgItemInt converte um inteiro assinado ou não assinado em uma cadeia de caracteres de dígitos decimais.

Caixas de listagem, caixas de combinação e listagens de diretório

Algumas caixas de diálogo exibem listas de nomes a partir dos quais o usuário pode selecionar um ou mais nomes. Para exibir uma lista de nomes de ficheiros, por exemplo, uma caixa de diálogo normalmente usa uma lista e as funções DlgDirList e DlgDirSelectEx . A função DlgDirList preenche automaticamente uma caixa de listagem com os nomes de arquivo no diretório atual. A função DlgDirSelect recupera o nome do arquivo selecionado da caixa de listagem. Juntas, essas duas funções fornecem uma maneira conveniente para uma caixa de diálogo exibir uma listagem de diretório para que o usuário possa selecionar um arquivo sem ter que digitar seu nome e local.

Uma caixa de diálogo também pode usar uma caixa de combinação para exibir uma lista de nomes de arquivos. A função DlgDirListComboBox preenche automaticamente a parte da lista da caixa de combinação com os nomes de ficheiro no diretório atual. A funçãoDlgDirSelectComboBoxEx recupera um nome de arquivo selecionado da parte da caixa de listagem.

Mensagens de controle de caixa de diálogo

Muitos controles reconhecem mensagens predefinidas que, quando recebidas pelos controles, fazem com que eles executem alguma ação. Por exemplo, a mensagem BM_SETCHECK marca a caixa de verificação e a mensagem EM_GETSEL recupera a parte do texto do controlo que está atualmente selecionada. As mensagens de controle dão a um procedimento de diálogo acesso maior e mais flexível aos controles do que as funções padrão, por isso são frequentemente usadas quando a caixa de diálogo requer interações complexas com o usuário.

Um procedimento de uma caixa de diálogo pode enviar uma mensagem para um control fornecendo o identificador de controle e usando a função SendDlgItemMessage, que é idêntica à função SendMessage, exceto por usar um identificador de controle em vez de um identificador de janela para identificar o control que receberá a mensagem. Uma mensagem especificada pode exigir que o procedimento de diálogo envie parâmetros com a mensagem, e a mensagem pode ter valores de retorno correspondentes. A operação e os requisitos de cada mensagem de controle dependem da finalidade da mensagem e do controle que a processa.

Para obter mais informações sobre as mensagens de controle, consulte Controles do Windows.

Caixas de diálogo personalizadas

Um aplicativo pode criar caixas de diálogo personalizadas usando uma classe de janela definida pelo aplicativo para as caixas de diálogo em vez de usar a classe de caixa de diálogo predefinida. As aplicações normalmente utilizam este método quando uma caixa de diálogo é a sua janela principal, mas também é útil para criar caixas de diálogo modais e sem modais para aplicações que têm janelas padrão sobrepostas.

A classe de janela definida pelo aplicativo permite que o aplicativo defina um procedimento de janela para a caixa de diálogo e processe mensagens antes de enviá-las para o procedimento da caixa de diálogo. Ele também permite que o aplicativo defina um ícone de classe, um pincel de plano de fundo de classe e um menu de classe para a caixa de diálogo. O aplicativo deve registrar a classe window antes de tentar criar uma caixa de diálogo e deve fornecer o modelo de caixa de diálogo com o valor atom ou nome da classe window.

Muitos aplicativos criam uma nova classe de caixa de diálogo recuperando primeiro as informações de classe para a classe de caixa de diálogo predefinida e passando-as para a função deGetClassInfo, que preenche uma estrutura deWNDCLASScom as informações. O aplicativo modifica membros individuais da estrutura, como o nome da classe, pincel e ícone, em seguida, registra a nova classe usando a funçãoRegisterClass. Se uma aplicação preencher a estrutura WNDCLASS por si própria, deverá defini-lo para que o membro cbWndExtra seja o DLGWINDOWEXTRA, que é o número de bytes extras que o sistema requer para cada caixa de diálogo. Se um aplicativo também usa bytes extras para cada caixa de diálogo, eles devem estar além dos bytes extras exigidos pelo sistema.

O procedimento de janela para a caixa de diálogo personalizada tem os mesmos parâmetros e requisitos que qualquer outro procedimento de janela. Ao contrário de outros procedimentos de janela, no entanto, o procedimento de janela para esta caixa de diálogo deve chamar a funçãoDefDlgProc em vez da função DefWindowProc para quaisquer mensagens que não processa. DefDlgProc realiza o mesmo processamento de mensagem padrão que o procedimento de janela para a caixa de diálogo predefinida, que inclui chamar o procedimento da caixa de diálogo.

Um aplicativo também pode criar caixas de diálogo personalizadas subclassificando o procedimento de janela da caixa de diálogo predefinida. A funçãoSetWindowLongpermite que um aplicativo especifique o procedimento da janela para uma janela especificada. A aplicação também pode tentar subclassificar usando a função SetClassLong, mas isso afeta todas as caixas de diálogo no sistema, não apenas aquelas pertencentes à aplicação.

Os aplicativos que criam caixas de diálogo personalizadas às vezes fornecem uma interface de teclado alternativa para as caixas de diálogo. Para caixas de diálogo sem moderação, isso pode significar que o aplicativo não chama a função IsDialogMessage e, em vez disso, processa toda a entrada do teclado no procedimento de janela personalizada. Nesses casos, o aplicativo pode usar a mensagem WM_NEXTDLGCTL para minimizar o código necessário para mover o foco de entrada de um controle para outro. Esta mensagem, quando passada para DefDlgProc, move o foco de entrada para um controlo especificado e atualiza a aparência dos controlos, como alterar a posição do botão de comando padrão ou configurar um botão de opção automático.