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

Essa visão geral discute algumas considerações de programação sobre caixas de diálogo.

A visão geral inclui os tópicos a seguir.

Procedimentos da caixa de diálogo

Um procedimento de caixa de diálogo é semelhante a um procedimento de janela no qual o sistema envia mensagens para o procedimento quando tem informações para fornecer ou tarefas a serem executadas. Ao contrário de um procedimento de janela, um procedimento de caixa de diálogo nunca chama a função DefWindowProc . Em vez disso, ele retornará TRUE se processar uma mensagem ou FALSE se não o fizer.

Cada procedimento da caixa de diálogo tem o seguinte formulário:

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 à mesma finalidade que em um procedimento de janela, com o parâmetro hwndDlg recebendo o identificador de janela da caixa de diálogo.

A maioria dos procedimentos da caixa de diálogo processa a mensagem WM_INITDIALOG e as mensagens WM_COMMAND enviadas pelos controles, mas processam poucas se houver outras mensagens. Se um procedimento de caixa de diálogo não processar uma mensagem, ele deverá retornar FALSE para direcionar o sistema para processar as mensagens internamente. A única exceção a essa 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 . De qualquer forma, 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 realizar 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 janela, como EnableWindow e SetFocus. O procedimento pode recuperar o identificador de janela para um controle usando a 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 arquivo e um botão Abrir , o procedimento pode desabilitar o botão Abrir até que o usuário selecione um arquivo na lista. Neste exemplo, o modelo da caixa de diálogo especifica o estilo WS_DISABLED para o botão Abrir e o sistema desabilita 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 para a caixa de diálogo.

Se o aplicativo criar a caixa de diálogo usando uma das funções DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam ou CreateDialogIndirectParam, o parâmetro lParam da 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 usar outra função para criar a caixa de diálogo, o sistema definirá 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 definirá automaticamente o foco de entrada para o controle cujo identificador de janela está no parâmetro wParam . Se o controle que recebe o foco padrão não for apropriado, ele poderá definir o foco para o controle apropriado usando a função SetFocus . Se o procedimento definir o foco de entrada, ele deverá retornar FALSE 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 visível, não desabilitado e tem o estilo WS_TABSTOP . Se esse controle não existir, o sistema definirá o foco de entrada padrão como o primeiro controle no modelo.

A mensagem de 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 de mensagens de notificação, informam o procedimento de entrada do usuário e permitem que elas realizem as 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 de push envia a mensagem de notificação BN_CLICKED sempre que o usuário clica no botão. Em todos os casos, a palavra de baixa ordem do parâmetro wParam contém o identificador de controle, a palavra de alta ordem 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 a função EndDialog para caixas de diálogo modais e a função DestroyWindow para caixas de diálogo modeless.

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 o menu da janela , 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 como IDCANCEL sempre que o usuário clica em Fechar no menu de 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 que descreve 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.

mensagens Control-Color

Os controles e o sistema podem enviar mensagens de cor de controle quando quiserem que o procedimento da caixa de diálogo pinte a tela 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 controle envia uma mensagem de cor de controle para o procedimento da caixa de diálogo pouco antes de pintar sua própria tela de fundo. A mensagem permite que o procedimento especifique qual pincel usar e defina as cores de plano de fundo e de primeiro plano. O procedimento especifica um pincel retornando o identificador de pincel. Para definir as cores de plano de fundo e de primeiro plano, o procedimento usa as funções SetBkColor e SetTextColor com o contexto do dispositivo de exibição do controle. A mensagem de cor de controle passa um identificador para o contexto do dispositivo de exibição para o procedimento no parâmetro wParam da mensagem.

O sistema enviará 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 sua própria tela de fundo sem precisar incluir o código para realizar o trabalho.

De qualquer forma, 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 da janela padrão para pintar a tela de fundo para 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ção GetSysColor . Enquanto a tela de fundo é pintada, a cor de primeiro plano do 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 da barra de rolagem padrão (COLOR_SCROLLBAR). Nesse caso, as cores de plano de fundo e de primeiro plano para o contexto do dispositivo de exibição são definidas como branco e preto, respectivamente.

Processamento de mensagem padrão da caixa de diálogo

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 Você pode enviar essa mensagem para uma caixa de diálogo. A caixa de diálogo retornará o identificador de controle do botão de push padrão, se a caixa de diálogo tiver um; caso contrário, ele retornará zero.
DM_REPOSITION Você pode enviar essa mensagem para uma caixa de diálogo de nível superior. A caixa de diálogo se reposiciona para que ela se encaixe na área de trabalho.
DM_SETDEFID Você pode enviar essa mensagem para uma caixa de diálogo. A caixa de diálogo define o botão de push 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 salvará o identificador no controle com o foco de entrada.
WM_CHARTOITEM Retorna zero.
WM_CLOSE Posta a mensagem de notificação 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 desabilitado no momento, o procedimento soará um aviso e não postará a mensagem.
WM_COMPAREITEM Retorna zero.
WM_ERASEBKGND Preenche a área do cliente da caixa de diálogo usando o pincel retornado da mensagem WM_CTLCOLORDLG ou com a cor da janela padrão.
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 controles de edição 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, direcionando o controle para ocultar 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 próximo 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 ignorará 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 um identificador de janela de controle salvo anteriormente. Se esse identificador não existir, o procedimento definirá o foco de entrada como o primeiro controle no modelo da caixa de diálogo visível, não desabilitado e tem o estilo WS_TABSTOP . Se esse controle não existir, o procedimento definirá o foco de entrada como o primeiro controle no modelo.
WM_SHOWWINDOW Salva um identificador no controle que tem o foco de entrada se a caixa de diálogo estiver sendo ocultada e, em seguida, chama DefWindowProc para concluir a ação padrão.
WM_SYSCOMMAND Salva um identificador no controle que tem 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 do teclado da caixa de diálogo

O sistema fornece uma interface de teclado especial para caixas de diálogo que realizam 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 nessa interface e suas respectivas ações.

Chave Ação
ALT+mnemonic Move o foco de entrada para o primeiro controle (tendo 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 controle no grupo.
Enter 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 push padrão.
ESC Envia uma mensagem WM_COMMAND para o procedimento da caixa de diálogo. O parâmetro wParam é definido como IDCANCEL.
LEFT Move o foco de entrada para o controle anterior no grupo.
Mnemônico Move o foco de entrada para o primeiro controle (tendo o estilo WS_TABSTOP ) após o controle estático que contém o mnemônico especificado.
RIGHT 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 .
TAB Move o foco de entrada para o próximo controle que tem o estilo WS_TABSTOP .
UP 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 modeless, a menos que o aplicativo chame a função IsDialogMessage para filtrar mensagens em seu loop de mensagem main. 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 do teclado da caixa de diálogo usa teclas de direção para mover entre controles em uma caixa de diálogo, um aplicativo não pode usar essas teclas para rolar o conteúdo de qualquer caixa de diálogo modal ou qualquer caixa de diálogo de modelagem para a 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 a tecla TAB ou as teclas 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 passará as chaves para o controle. Caso contrário, o sistema usa a função GetNextDlgTabItem para localizar o próximo controle visível, não desabilitado e que tem o estilo WS_TABSTOP . A pesquisa começa com o controle atualmente tendo o foco de entrada e prossegue na ordem em que os controles foram criados, ou seja, a ordem na qual eles são definidos no modelo 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 pesquisa do 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 o identificador de janela do controle seguinte ou anterior com o estilo WS_TABSTOP sem mover o foco de entrada.

O estilo de 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. Desde 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 continuará movendo o foco de entrada por todos os controles na caixa de diálogo à medida que o usuário continua pressionando 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 controle no grupo tiver o foco de 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, eles devem ter sido criados consecutivamente sem controles intermediários.

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

GetNextDlgGroupItem pesquisa controles 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 retornará 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 pesquisa pelo próximo controle no grupo encontrar uma janela com o estilo WS_EX_CONTROLPARENT , o sistema pesquisará recursivamente os filhos da janela.

Depois que o sistema tiver o controle seguinte ou anterior, ele enviará 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.

Em geral, 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 os controles no grupo. Isso garante que o foco de entrada sempre estará no controle selecionado mais recentemente quando o usuário se mover para o grupo usando a tecla TAB.

Mnemônicos

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. O Mnemonics fornece uma maneira rápida de o usuário passar para um controle especificado usando o teclado.

Um aplicativo cria um mnemônico para um controle inserindo o 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 em nulo fornecida com o controle no modelo da caixa de diálogo contém o e comercial. No entanto, um aplicativo pode criar um mnemônico a qualquer momento substituindo o rótulo ou texto existente de um controle usando a função SetDlgItemText . Somente um mnemônico pode ser especificado para cada controle. Embora seja recomendável, os mnemônicos em uma caixa de diálogo não precisam ser exclusivos.

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

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

Se o sistema localizar um controle estático e o controle não estiver desabilitado, o sistema moverá o foco de entrada para o primeiro controle após o controle estático visível, não desabilitado 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 controle for um botão de push 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 que tenha 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 estes tópicos:

Botões de opção e caixas de seleção

As caixas de diálogo usam botões de opção e caixas de marcar para permitir que o usuário escolha uma lista de opções. Os botões de opção permitem que o usuário escolha entre opções mutuamente exclusivas; marcar caixas permitem que o usuário escolha uma combinação de opções.

O procedimento da caixa de diálogo pode definir o estado inicial de uma caixa de marcar usando a função CheckDlgButton, que define ou limpa a caixa de marcar. 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ção CheckRadioButton para definir o botão de opção apropriado e limpar automaticamente qualquer outro botão de opção.

Antes que uma caixa de diálogo seja encerrada, o procedimento da caixa de diálogo pode marcar o estado de cada botão de opção e marcar caixa 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.

Controles de Edição da Caixa de Diálogo

Muitas caixas de diálogo têm controles de edição que permitem que o usuário forneça 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ção SetDlgItemText , 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 de terminar. 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 posteriormente 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ção GetDlgItemInt , 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. Ele pode ser assinado ou não assinado. O procedimento da caixa de diálogo pode exibir um inteiro usando a função SetDlgItemInt . SetDlgItemInt converte um inteiro com sinal ou sem sinal 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 dos quais o usuário pode selecionar um ou mais nomes. Para exibir uma lista de nomes de arquivo, por exemplo, uma caixa de diálogo normalmente usa uma caixa de listagem 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 de 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 precisar 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 arquivo. A função DlgDirListComboBox preenche automaticamente uma parte da caixa de listagem da caixa de combinação com os nomes de arquivo no diretório atual. A função DlgDirSelectComboBoxEx recupera um nome de arquivo selecionado da parte da caixa de listagem.

Mensagens de controle da caixa de diálogo

Muitos controles reconhecem mensagens predefinidas que, quando recebidas por controles, fazem com que elas realizem alguma ação. Por exemplo, a mensagem BM_SETCHECK define o marcar em uma caixa de marcar e a mensagem EM_GETSEL recupera a parte do texto do controle que está selecionada no momento. As mensagens de controle dão a um procedimento de diálogo um acesso maior e mais flexível aos controles do que as funções padrão, portanto, elas geralmente são usadas quando a caixa de diálogo requer interações complexas com o usuário.

Um procedimento de caixa de diálogo pode enviar uma mensagem para um controle fornecendo o identificador de controle e usando a função SendDlgItemMessage , que é idêntica à função SendMessage , exceto que ela usa um identificador de controle em vez de um identificador de janela para identificar o controle que deve 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 retornados 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. Os aplicativos normalmente usam esse método quando uma caixa de diálogo é sua janela main, mas também é útil para criar caixas de diálogo modais e sem janelas de modelagem para aplicativos que têm janelas sobrepostas padrão.

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 de janela antes de tentar criar uma caixa de diálogo e deve fornecer o modelo de caixa de diálogo com o valor atom ou o nome da classe de janela.

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 GetClassInfo , que preenche uma estrutura WNDCLASS com as informações. O aplicativo modifica membros individuais da estrutura, como o nome da classe, o pincel e o ícone, em seguida, registra a nova classe usando a função RegisterClass . Se um aplicativo preencher a estrutura WNDCLASS por conta própria, ele deverá definir o membro cbWndExtra como 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, ele deve 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 essa caixa de diálogo deve chamar a função DefDlgProc em vez da função DefWindowProc para todas as mensagens que ela não processa. O DefDlgProc executa 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 subclasse do procedimento de janela da caixa de diálogo predefinida. A função SetWindowLong permite que um aplicativo especifique o procedimento de janela para uma janela especificada. O aplicativo também pode tentar subclasse usando a função SetClassLong , mas isso afeta todas as caixas de diálogo no sistema, não apenas aquelas que pertencem ao aplicativo.

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 modelagem, isso pode significar que o aplicativo não chama a função IsDialogMessage e processa todas as entradas de teclado no procedimento de janela personalizado. 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. Essa mensagem, quando passada para DefDlgProc, move o foco de entrada para um controle especificado e atualiza a aparência dos controles, como mover a borda do botão de push padrão ou definir um botão de opção automático.