Criando uma caixa de diálogo sem janela restrita

Você cria uma caixa de diálogo sem janela restrita usando CreateDialog função, especificando o identificador ou nome de um recurso de modelo de caixa de diálogo e o endereço do procedimento de caixa de diálogo. CreateDialog carrega o modelo cria a caixa de diálogo e, opcionalmente, exibe-lo. Seu aplicativo é responsável por recuperar e distribuir mensagens de entrada de usuário para o procedimento caixa de diálogo.

No exemplo a seguir, o aplicativo exibe uma caixa de diálogo sem janela restrita — se ele não estiver sendo exibido — quando o usuário escolhe um comando de ir para um menu de aplicativo. A caixa de diálogo contém um Controlarar de editar, uma caixa de seleção e botões OK e Cancelar. O modelo de caixa de diálogo é um recurso no arquivo executável do aplicativo e o identificador de recurso DLG_GOTO. O usuário insere um número de linha no Controlarar de editar e verifica a caixa de seleção para especificar que o número de linha é relativo para a linha atual. Os identificadores de Controlarar são ID_LINE, ID_ABSREL, IDOK e IDCANCEL.

As instruções na primeira parte do exemplo de criar a caixa de diálogo sem janela restrita. Estas declarações, no procedimento de janela para a janela principal do aplicativo, criam a caixa de diálogo quando o procedimento janela recebe uma WM_COMMAND mensagem com o identificador de comando do IDM_GOTO, mas somente se a variável global hwndGoto já não contém um válido identificador. A segunda parte do exemplo é o loop de mensagem principal do aplicativo. O loop inclui o IsDialogMessage função para garantir que o usuário pode usar a interface de teclado de caixa de diálogo na caixa de diálogo sem janela restrita. A terceira parte do exemplo é o procedimento de caixa de diálogo. O procedimento recupera o conteúdo da caixa de seleção e Controlarar de Editar quando o usuário escolhe o botão OK. O procedimento destrói a caixa diálogo quando o usuário escolhe o botão Cancelar.

HwndGoto HWND = NULL;  / / janela identificador da caixa de diálogo. 
    . 
    . 
 
    casos WM_COMMAND: alternar (LOWORD(wParam)) {case IDM_GOTO: if (!IsWindow(hwndGoto)) {hwndGoto = CreateDialog (hinst, MAKEINTRESOURCE(DLG_GOTO), hwnd, GoToProc (DLGPROC)); 
                    ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } retornar 0 L 

 

Em declarações anteriores, CreateDialog é chamado somente se hwndGoto faz não contém um válido identificador janela. Isso garante que o aplicativo não exibe duas caixas de diálogo ao mesmo tempo. Para oferecer suporte a esse método de verificação, o procedimento caixa de diálogo deve definir hwndGoto como NULL quando ele destrói a caixa de diálogo.

O loop de mensagem para um aplicativo consiste as seguintes instruções:

while (GetMessage (amp; msg, NULL, NULL, NULL)) {se (!IsWindow(hwndGoto) | | !IsDialogMessage (hwndGoto & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

O loop verifica a validade do identificador de janela para a caixa de diálogo e apenas chama o IsDialogMessage função se o identificador é válido. IsDialogMessage processa somente a mensagem se ele pertence a caixa de diálogo. Caso contrário, retorna FALSE e o loop envia a mensagem para a janela apropriada.

As instruções a seguir definem o procedimento de caixa de diálogo:

int iLine;             / / recebe a linha número BOOL fRelative;        / / recebe o status da caixa de seleção chamada de retorno BOOL GoToProc (hwndDlg HWND, UINT mensagem, WP&ARAM wParam, LPARAM lParam) {BOOL fError; 
 
    comutador (mensagem) {case WM_INITDIALOG: CheckDlgButton (hwndDlg, ID_ABSREL, fRelative); 
            retornar TRUE; 
 
        casos WM_COMMAND: alternar (LOWORD(wParam)) {case IDOK: fRelative = IsDlgButtonChecked (hwndDlg, ID_ABSREL); 
                    iLine = GetDlgItemInt (hwndDlg, ID_LINE, amp; fError, fRelative); 
                    se (fError) {MessageBox (hwndDlg, SZINVALIDNUMBER, SZGOTOERR, MB_OK); 
                        SendDlgItemMessage (hwndDlg, ID_LINE, EM_SETSEL, 0,-1 L); 
                    } else / / notificar a janela de proprietário para transportar / / o comando. 
 
                    retornar TRUE; 
 
                caso IDCANCEL: DestroyWindow(hwndDlg); 
                    hwndGoto = NULL; 
                    retornar TRUE; 
            }} return FALSE; 
} 

 

Em declarações anteriores, o procedimento processa o WM_INITDIALOG e WM_COMMAND mensagens. Durante o WM_INITDIALOG processamento, o procedimento inicializa a caixa de seleção, passando o valor atual da variável global fRelative para CheckDlgButton. O procedimento retorna TRUE para direcionar o sistema para definir o foco de entrada padrão.

Durante o processamento de WM_COMMAND, o procedimento fecha a caixa de diálogo somente se o usuário escolhe o botão Cancelar — ou seja, o botão com o identificador IDCANCEL. O procedimento deve chamar DestroyWindow para fechar uma caixa de diálogo sem janela restrita. Observe que o procedimento também define a variável hwndGoto para NULL para garantir que outras instruções que dependem dessa variável funcionem corretamente.

Se o usuário escolhe o botão OK, o procedimento recupera o estado atual da caixa de seleção e atribui à variável fRelative . Ele usa a variável para recuperar o número de linha do Controlarar de Editarar. GetDlgItemInt converte o texto no Controlarar de Editarar em um número inteiro. O valor fRelative determina se a função interpreta o número como um valor assinado ou não assinado. Se o texto do Controlarar de editar não é um número válido, GetDlgItemInt define o valor da variável fError para diferente de zero. O procedimento verifica esse valor para determinar se deve exibir uma mensagem de erro ou executar o comando. No caso de um erro, o procedimento caixa diálogo envia uma mensagem para o Controlarar de editar, direcionando-o para selecionar o texto no Controlarar para que o usuário pode facilmente substituí-lo. Se GetDlgItemInt não retornar um erro, o procedimento pode executar o comando solicitado propriamente dito ou enviar uma mensagem para a janela do proprietário, direcionando-o para executar o comando.

Index