Crearea o casetă de Dialog fără mod

Creați o casetă de dialog fără mod utilizând funcția CreateDialog , specificând identificator sau numele din caseta de dialog șablon resursă și adresa a procedurii de caseta de dialog. CreateDialog încarcă șablonul, creează caseta de dialog, și opțional displays it. Aplicația este responsabil pentru regăsirea și expediere mesaje utilizator intrare la procedura de caseta de dialog.

În exemplul următor, aplicarea afișează o casetă de dialog fără mod — dacă nu este deja afișat㠗 atunci când utilizatorul alege un du-te la comandă la un meniu de aplicare. Caseta de dialog conține un control de editare, o casetă de selectare, precum și butoanele OK și Cancel. Șablonul de caseta de dialog este o resursă în fișier executabil aplicației și are identificatorul de resursă DLG_GOTO. Utilizatorul introduce un număr de linie în comanda editare și verifică caseta de selectare pentru a specifica că numărul de linie este relativ la linia curentă. Identificatori de control sunt ID_LINE, ID_ABSREL, IDOK și IDCANCEL.

Declarațiile în prima parte a exemplu creează caseta de dialog fără mod. Aceste declarații, la procedura fereastra aplicației fereastra principală, crea caseta de dialog atunci când procedura fereastra primește un mesaj de WM_COMMAND având identificatorul de comandă IDM_GOTO, dar numai în cazul în care variabila globală hwndGoto nu conține deja un mâner valabil. A doua parte de exemplu este aplicației mesajul principal buclă. Bucla include funcția IsDialogMessage pentru a se asigura că utilizatorul poate utiliza caseta de dialog tastatură interfața în această casetă de dialog fără mod. A treia parte din exemplu este procedura de caseta de dialog. Procedura regăsește conținutul de editare de control și caseta de selectare atunci când utilizatorul alege butonul OK. Procedura distruge caseta de dialog atunci când utilizatorul alege butonul Revocare.

HWND hwndGoto = NULL;  / / fereastra mâner din caseta de dialog. 
    . 
    . 
 
    WM_COMMAND de caz: Comutați (LOWORD(wParam)) {caz IDM_GOTO: if (!IsWindow(hwndGoto)) {hwndGoto = CreateDialog (hinst, MAKEINTRESOURCE(DLG_GOTO), hwnd, GoToProc (DLGPROC)); 
                    ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } întoarce 0 L 

 

În declarațiile anterioare, CreateDialog este numit numai în cazul în care hwndGoto nu nu conțin un mâner fereastra valabil. Acest lucru asigură că cererea nu afișează două casete de dialog în același timp. Pentru a sprijini această metodă de verificare, procedura dialog trebuie să setați hwndGoto la NULL, când distruge caseta de dialog.

Bucla de mesaj pentru o cerere constă din următoarele afirmații:

în timp ce (GetMessage (amp; msg, NULL, NULL, NULL)) {dacă (!IsWindow(hwndGoto) | !IsDialogMessage (hwndGoto, & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

Bucla verifică valabilitatea ghidajul fereastra pentru caseta de dialog și necesită doar funcția de IsDialogMessage dacă Handle-ul este valabil. IsDialogMessage numai procesează mesajul dacă îi aparține caseta de dialog. În caz contrar, se întoarce FALSE și bucla expedieri mesajul în fereastra corespunzătoare.

Următoarele afirmații definirea procedurii de caseta de dialog:

int iLine;             / / primește linie numărul BOOL fRelative;        / / prime?te statutul caseta GoToProc de apel INVERS BOOL (HWND hwndDlg, mesaj UINT, WP&ARAM wParam, LPARAM lParam) {BOOL fError; 
 
    Switch (mesaj) {caz WM_INITDIALOG: CheckDlgButton (hwndDlg, ID_ABSREL, fRelative); 
            întoarce TRUE; 
 
        WM_COMMAND de caz: Comutați (LOWORD(wParam)) {caz IDOK: fRelative = IsDlgButtonChecked (hwndDlg, ID_ABSREL); 
                    iLine = GetDlgItemInt (hwndDlg, ID_LINE, amp; fError, fRelative); 
                    Dacă (fError) {MessageBox (hwndDlg, SZINVALIDNUMBER, SZGOTOERR, MB_OK); 
                        SendDlgItemMessage (hwndDlg, ID_LINE, EM_SETSEL, 0, L-1); 
                    } else / / notifice proprietarul fereastra pentru a transporta / / comanda. 
 
                    întoarce TRUE; 
 
                caz IDCANCEL: DestroyWindow(hwndDlg); 
                    hwndGoto = NULL; 
                    întoarce TRUE; 
            }} return FALSE; 
} 

 

În declarațiile precedente, procedura procesează mesajele WM_INITDIALOG și WM_COMMAND . În timpul WM_INITDIALOG de prelucrare, procedura inițializează caseta de selectare prin trecerea valoarea curentă a variabile globale fRelative la CheckDlgButton. Procedura apoi întoarce TRUE la directe sistemul pentru a seta focalizarea intrare implicită.

În timpul prelucrării WM_COMMAND, procedura se închide caseta de dialog, numai în cazul în care utilizatorul alege butonul Revocare — adică, butonul având identificatorul IDCANCEL. Procedura trebuie să apel DestroyWindow pentru a închide o casetă de dialog fără mod. Observați că procedura setează, de asemenea, variabila hwndGoto NULL pentru a se asigura că alte declarații care depind de această variabilă func?ionează corect.

În cazul în care utilizatorul alege butonul OK, procedura preia starea curentă a caseta de selectare și se asociază la variabila fRelative . Apoi utilizează variabila pentru a prelua numărul liniei din comanda editare. GetDlgItemInt traduce textul din control editare un întreg. Valoarea fRelative determină dacă funcția interpretează numărul ca o valoare semnate sau nesemnate. Dacă textul de control Editare nu este un număr valid, GetDlgItemInt setează valoarea variabilei fError interior/exterior nenul. Procedura verifică această valoare pentru a stabili dacă se afi?ează un mesaj de eroare sau de a efectua comanda. În caz de eroare, procedura de caseta de dialog a trimite un mesaj la control de editare, conducerea să selectați textul din control, astfel încât utilizatorul poate ușor înlocui. Dacă GetDlgItemInt nu returnează o eroare, procedura poate efectua comanda solicitată sine sau trimite un mesaj la fereastra de proprietar, conducerea să efectueze comanda.

Index