Opprette et ikke-sperrende dialogboksen

Du oppretter en ikke-sperrende dialogboks ved hjelp av funksjonen CreateDialog å angi identifikator eller navnet på en ressurs for dialogboksen boksen mal og adressen til dialogboksen boksen prosedyre. CreateDialog laster inn malen, oppretter dialogboksen og viser eventuelt det. Søknaden er ansvarlig for henting og utsending bruker inndatameldinger i dialogboksen boksen prosedyren.

I eksemplet nedenfor, viser programmet en ikke-sperrende dialogboks-hvis den ikke allerede vises, når brukeren velger en gå til-kommandoen fra en programmenyen. Dialogboksen inneholder en redigeringskontroll, en merket og knappene OK og Avbryt. Dialogboksen boksen malen er en ressurs i programmets kjørbare fil, og har ressursidentifikatoren DLG_GOTO. Brukeren inn et linjenummer i redigeringskontrollen og kontrollerer merket for å angi at linjenummeret er i forhold til gjeldende linje. Kontroll-identifikatorer er ID_LINE, ID_ABSREL, IDOK og IDCANCEL.

Setninger i den første delen av eksemplet lage ikke-sperrende dialogboksen. Disse utsagnene opprette i vinduet fremgangsmåten for programmets hovedvinduet, dialogboksen når vinduet fremgangsmåten, mottar en WM_COMMAND melding har kommandoidentifikator IDM_GOTO, men bare hvis den globale variabelen hwndGoto ikke inneholder en gyldig referanse. Den andre delen av eksemplet er programmets hovedmeldingsløkke. Løkken inkluderer IsDialogMessage -funksjon for å sikre at brukeren kan bruke dialogboksen boksen tastatur grensesnittet i denne ikke-sperrende dialogboksen. Den tredje delen av eksemplet er dialogboksen boksen prosedyre. Prosedyren henter innholdet i redigeringskontrollen og avmerkingsboksen når brukeren velger OK-knappen. Prosedyren ødelegger dialogboksen når brukeren velger Avbryt-knappen.

HWND hwndGoto = NULL;  / / vinduet håndtere i dialogboksen. 
    . 
    . 
 
    Case WM_COMMAND: bytte (LOWORD(wParam)) {case IDM_GOTO: Hvis (!IsWindow(hwndGoto)) {hwndGoto = CreateDialog (HINST-, MAKEINTRESOURCE(DLG_GOTO), hwnd, (DLGPROC) GoToProc); 
                    ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } returnere 0 L 

 

I de foregående setningene, kalles CreateDialog , bare hvis hwndGoto gjør ikke inneholder en gyldig vindusreferanse. Dette sikrer at programmet ikke viser to dialogbokser på samme tid. For å støtte denne metoden med å kontrollere, må dialogboksen prosedyren sette hwndGoto til NULL når det ødelegger dialogboksen.

Meldingsløkke for et program som består av følgende utsagn:

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

 

Løkken kontrollerer gyldigheten av vindusreferansen for dialogboksen og kaller funksjonen IsDialogMessage bare hvis referansen er gyldig. IsDialogMessage behandler bare meldingen om det hører til dialogboksen. Ellers returneres USANN og løkken sender meldingen til det aktuelle vinduet.

Følgende utsagn, definere dialogboksen boksen prosedyre:

int iLine;             / / mottar linje nummer BOOL fRelative;        / / mottar statusen for avmerkingsboksen BOOL TILB&AKERINGING GoToProc (HWND hwndDlg, UINT melding, WPARAM wParam, LPARAM lParam) {BOOL fError; 
 
    bryteren (meldingen) {case WM_INITDIALOG: CheckDlgButton (hwndDlg, ID_ABSREL, fRelative); 
            Returner verdien SANN; 
 
        Case WM_COMMAND: bytte (LOWORD(wParam)) {case IDOK: fRelative = IsDlgButtonChecked (hwndDlg, ID_ABSREL); 
                    iLine = GetDlgItemInt (hwndDlg, ID_LINE, amp; fError, fRelative); 
                    Hvis (fError) {MessageBox (hwndDlg, SZINVALIDNUMBER, SZGOTOERR, MB_OK); 
                        SendDlgItemMessage (hwndDlg, ID_LINE, EM_SETSEL, 0,-1 L); 
                    } else / / Notify eiervinduet å bære / / ut kommandoen. 
 
                    Returner verdien SANN; 
 
                Case IDCANCEL: DestroyWindow(hwndDlg); 
                    hwndGoto = NULL; 
                    Returner verdien SANN; 
            }} return FALSE; 
} 

 

I de foregående setningene, fremgangsmåten, behandler meldingene WM_INITDIALOG og WM_COMMAND . Under WM_INITDIALOG behandling, initialiserer boksen i prosedyren ved å sende den gjeldende verdien av den globale variabelen fRelative til CheckDlgButton. Prosedyren deretter returnerer SANN til direkte systemet til å angi standard inndata fokus.

Under behandling av WM_COMMAND, prosedyren lukker dialogboksen vises bare hvis brukeren velger Avbryt-knappen – det vil si knappen å ha IDCANCEL-identifikator. Prosedyren må kalle DestroyWindow å lukke en ikke-sperrende dialogboks. Legg merke til at prosedyren også setter variablen hwndGoto til NULL for å sikre at andre setninger som avhenger av denne variabelen opererer på riktig måte.

Hvis brukeren velger OK-knappen, henter gjeldende status for merket for prosedyren, og tilordner det til variabelen fRelative . Det bruker deretter variabelen til å hente linjenummeret fra redigeringskontrollen. GetDlgItemInt oversetter teksten i redigeringskontrollen til et heltall. Verdien for fRelative avgjør om funksjonen tolker tallet som en signert eller usignerte verdi. Hvis Rediger kontroll teksten ikke er et gyldig tall, angir GetDlgItemInt verdien for variabelen fError til ikke-null. Prosedyren kontrollerer denne verdien til å bestemme om du vil vise en feilmelding eller utføre kommandoen. Ved en feil sender en melding i dialogboksen boksen prosedyre til redigeringskontrollen, beordrer den til å merke teksten i kontrollen, slik at brukeren kan enkelt erstatte den. Hvis GetDlgItemInt ikke returnerer en feil, kan prosedyren enten utføre kommandoen forespurte seg selv eller sende en melding til eiervinduet, beordrer den til å utføre kommandoen.

Index