Creazione di una finestra di dialogo non modali

Creare una finestra di dialogo non modali utilizzando la funzione CreateDialog , specificando l'identificatore o il nome di una risorsa modello di finestra di dialogo casella e l'indirizzo della procedura di dialogo casella. CreateDialog carica il modello, crea la finestra di dialogo e facoltativamente lo visualizza. L'applicazione è responsabile per il recupero e l'invio dei messaggi di input utente alla procedura di dialogo casella.

Nell'esempio seguente, l'applicazione visualizza una finestra di dialogo non modali — se non è già visualizzata — quando l'utente sceglie un comando Vai A dal menu applicazione. Nella finestra di dialogo contiene un controllo di modifica, una casella di controllo e pulsanti OK e Annulla. Il modello di finestra di dialogo è una risorsa in un file eseguibile dell'applicazione e l'identificatore di risorsa DLG_GOTO. L'utente immette un numero di riga nel controllo di modifica e verifica la casella di controllo per specificare che il numero di riga è relativo alla riga corrente. Gli identificatori di controllo sono ID_LINE, ID_ABSREL, IDOK e IDCANCEL.

Le istruzioni nella prima parte dell'esempio di creano nella finestra di dialogo non modali. Queste dichiarazioni, nella routine di finestra per la finestra principale dell'applicazione, creano nella finestra di dialogo quando la routine della finestra riceve un messaggio WM_COMMAND , avendo l'identificatore del comando IDM_GOTO, ma solo se la variabile globale hwndGoto non contiene già un handle valido. La seconda parte dell'esempio è il ciclo di messaggi principale dell'applicazione. Il ciclo include la funzione IsDialogMessage per assicurare che l'utente può utilizzare l'interfaccia di tastiera box di dialogo in questa finestra di dialogo non modali. La terza parte dell'esempio è la procedura di casella di dialogo. La procedura recupera il contenuto della casella di controllo e controllo di modifica quando l'utente sceglie il pulsante OK. La procedura distrugge la finestra di dialogo quando l'utente sceglie il pulsante Annulla.

HWND hwndGoto = NULL;  / / handle di finestra di dialogo. 
    . 
    . 
 
    caso WM_COMMAND: passare (LOWORD(wParam)) {caso IDM_GOTO: if (!IsWindow(hwndGoto)) {hwndGoto = CreateDialog (hinst, MAKEINTRESOURCE(DLG_GOTO), hwnd, GoToProc (DLGPROC)); 
                    ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } return 0 L 
 

Nelle istruzioni precedenti, CreateDialog viene chiamato solo se hwndGoto fa non contengono un handle di finestra valido. Questo assicura che l'applicazione non visualizza contemporaneamente due finestre di dialogo. Per supportare questo metodo di verifica, la procedura di dialogo necessario impostare hwndGoto su NULL quando distrugge la finestra di dialogo.

Il ciclo di messaggi per un'applicazione si compone delle seguenti affermazioni:

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

Il ciclo che controlla la validità di handle della finestra per il dialogo e solo chiama la funzione di IsDialogMessage se l'handle è valido. IsDialogMessage solo elabora il messaggio se appartiene a una finestra di dialogo. In caso contrario, restituisce FALSE e il loop invia il messaggio alla finestra appropriata.

Le istruzioni seguenti definiscono la procedura di casella di dialogo:

int iLine;             / / riceve la linea numero BOOL fRelative;        / / riceve lo stato della casella di controllo GoToProc BOOL C&ALLBACK (HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) {BOOL fError; 
 
    interruttore (messaggio) {caso WM_INITDIALOG: CheckDlgButton (hwndDlg, ID_ABSREL, fRelative); 
            return TRUE; 
 
        caso WM_COMMAND: passare (LOWORD(wParam)) {caso 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, L-1); 
                    } else / / notificare la finestra proprietaria per trasportare / / il comando. 
 
                    return TRUE; 
 
                caso IDCANCEL: DestroyWindow(hwndDlg); 
                    hwndGoto = NULL; 
                    return TRUE; 
            }} return FALSE; 
} 
 

Nelle istruzioni precedenti, la procedura elabora i messaggi WM_INITDIALOG e WM_COMMAND . Durante il WM_INITDIALOG elaborazione, la procedura Inizializza la casella di controllo passando il valore corrente della variabile globale fRelative al CheckDlgButton. La procedura quindi restituisce TRUE per dirigere il sistema per impostare lo stato attivo input predefinito.

Durante l'elaborazione di WM_COMMAND, la procedura si chiude la finestra di dialogo solo se l'utente sceglie il pulsante Annulla — cioè, il pulsante avendo l'identificatore IDCANCEL. La procedura deve chiamare DestroyWindow per chiudere una finestra di dialogo non modali. Si noti che la procedura anche imposta la variabile hwndGoto NULL per garantire che le altre istruzioni che dipendono da questa variabile di operano correttamente.

Se l'utente sceglie il pulsante OK, la procedura recupera lo stato corrente della casella di controllo e lo assegna alla variabile fRelative . Esso utilizza quindi la variabile per recuperare il numero di riga dal controllo di modifica. GetDlgItemInt si traduce il testo nel controllo di modifica in un valore integer. Il valore fRelative determina se la funzione interpreta il numero come valore con o senza segno. Se il testo del controllo di modifica non è un numero valido, GetDlgItemInt imposta il valore della variabile fError diverso da zero. La procedura controlla questo valore per determinare se visualizzare un messaggio di errore o di eseguire il comando. In caso di errore, la procedura di finestra di dialogo Invia un messaggio al controllo di modifica, dirigendola per selezionare il testo nel controllo, in modo che l'utente può sostituire facilmente. Se GetDlgItemInt non restituisce un errore, la procedura può eseguire il comando richiesto se stessa o inviare un messaggio alla finestra proprietario, dirigendola per eseguire il comando.

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index