L'inizializzazione di una finestra di dialogo

Durante l'elaborazione del messaggio WM_INITDIALOG si inizializzare il dialogo e il relativo contenuto. Il compito più comune è per inizializzare i controlli in modo da riflettere le impostazioni correnti della finestra di dialogo. Un altro compito comune è al centro di una finestra di dialogo sullo schermo o all'interno della sua finestra proprietaria. Un'attività utile per alcune finestre di dialogo consiste nell'impostare lo stato attivo per l'input su un determinato controllo piuttosto che accettare il focus di input predefinito.

Nell'esempio seguente, la procedura di casella di dialogo centri nella finestra di dialogo e imposta lo stato attivo per l'input durante l'elaborazione del messaggio WM_INITDIALOG. Per centrare la finestra di dialogo, la procedura recupera i rettangoli di finestra per il dialogo e la finestra proprietaria e calcola una nuova posizione per la finestra di dialogo. Per impostare lo stato attivo per l'input, la procedura controlla il parametro wParam per determinare l'identificatore del focus di input predefinito:

HWND hwndOwner; 
RECT rc, rcDlg, rcOwner; 
 
    caso WM_INITDIALOG: / / Get il proprietario rettangoli casella di dialogo e finestre. 
 
        Se ((hwndOwner = GetParent(hwndDlg)) = = NULL) {
            hwndOwner = GetDesktopWindow(); 
        }

GetWindowRect (hwndOwner, amp; rcOwner); 
        GetWindowRect (hwndDlg & rcDlg); 
        CopyRect (rc &, rcOwner); 
 
         / / Offset il proprietario e rettangoli casella di dialogo affinché / / destra e in basso i valori rappresentano la larghezza e / / altezza e poi offset il proprietario nuovamente per scartare / / spazio ripreso da una finestra di dialogo. 
 
        OffsetRect (& rcDlg,-rcDlg.left, - rcDlg.top); 
        OffsetRect (& rc,-rc.left, - rc.top); 
        OffsetRect (& rc,-rcDlg.right, - rcDlg.bottom); 
 
         / / La nuova posizione è la somma di mezzo i restanti / / lo spazio e il proprietario originale di posizione. 
 
        SetWindowPos (hwndDlg, HWND_TOP, rcOwner.left + (rc.right/2), rcOwner.top + (rc.bottom / 2), 0, 0, / / ignora gli argomenti di dimensioni SWP_NOSIZE); 
 
        Se (wParam GetDlgCtrlID((HWND))! = ID_ITEMNAME) {SetFocus (GetDlgItem (hwndDlg, ID_ITEMNAME)); 
            return FALSE; 
        } restituiscono TRUE 
 

Nelle istruzioni precedenti, la procedura utilizza la funzione GetParent per recuperare l'handle di finestra proprietario per una finestra di dialogo. La funzione restituisce il proprietario handle della finestra di dialogo e l'handle della finestra padre per finestre figlio. Perché un'applicazione può creare una finestra di dialogo che non ha alcun proprietario, la procedura di verifica l'handle restituito e utilizza la funzione GetDesktopWindow per recuperare l'handle di finestra desktop, se necessario. Dopo aver calcolato la nuova posizione, la procedura utilizza la funzione SetWindowPos per spostare la finestra di dialogo specifica il valore HWND_TOP per garantire che la finestra di dialogo rimane sulla parte superiore della finestra proprietario.

Prima di impostare lo stato attivo per l'input, la procedura di verifica l'identificatore del controllo del focus di input predefinito. Il sistema passa l'handle della finestra del focus di input predefinito nel parametro wParam . La funzione GetDlgCtrlID restituisce l'identificatore del controllo identificato dall'handle di finestra. Se l'identificatore non corrisponde l'identificatore corretta, la procedura utilizza la funzione SetFocus per impostare lo stato attivo per l'input. Per recuperare l'handle della finestra del controllo desiderato è necessaria la funzione GetDlgItem.

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

Index