Een niet-modaal dialoogvenster maken

U maakt een niet-modaal dialoogvenster met behulp van de functie CreateDialog , geven de id of de naam van een resource dialoogvenster vak sjabloon en het adres van het dialoogvenster vak procedure. CreateDialog de sjabloon laadt, wordt gemaakt in het dialoogvenster, en optioneel weergegeven. Uw toepassing is verantwoordelijk voor het ophalen en verzenden gebruiker invoer berichten naar het dialoogvenster vak procedure.

In het volgende voorbeeld wordt de toepassing een niet-modaal dialoogvenster weergegeven — als het niet reeds wordt weergegeven — wanneer de gebruiker kiest een opdracht Ga naar een menu van toepassing. Het dialoogvenster bevat een edit-besturingselement, een selectievakje in, en de knoppen OK en annuleren. Het dialoogvenster vak sjabloon is een bron in het uitvoerbare bestand van de toepassing en de resource identifier DLG_GOTO heeft. De gebruiker een regelnummer ingevoerd in het besturingselement voor bewerking en controleert het selectievakje in als u wilt opgeven dat het nummer is ten opzichte van de huidige regel. Het besturingselement-id's zijn ID_LINE, ID_ABSREL, IDOK en IDCANCEL.

De verklaringen in het eerste deel van het voorbeeld maken de niet-modaal dialoogvenster. Deze verklaringen, maakt in het venster procedure voor hoofdvenster van de toepassing, het dialoogvenster wanneer het venster procedure ontvangt een WM_COMMAND -bericht dat met de IDM_GOTO opdracht-id, maar alleen als de globale variabele hwndGoto bevat geen al een geldig handvat. Het tweede deel van het voorbeeld is de hoofdberichtlus van de toepassing. De lus bevat de functie IsDialogMessage om ervoor te zorgen dat de gebruiker het dialoogvenster vak toetsenbord interface in dit niet-modaal dialoogvenster kunt gebruiken. Het derde deel van het voorbeeld is de dialoogvenster vak procedure. De procedure wordt de inhoud van het besturingselement selectievakje en opgehaald wanneer de gebruiker de knop OK kiest. De procedure vernietigt het dialoogvenster wanneer de gebruiker de knop Annuleren kiest.

HWND hwndGoto = NULL;  / / de vensteringang van het dialoogvenster. 
    . 
    . 
 
    geval WM_COMMAND: schakelen (LOWORD(wParam)) {IDM_GOTO geval: als (!IsWindow(hwndGoto)) {hwndGoto = CreateDialog (hinst, MAKEINTRESOURCE(DLG_GOTO), hwnd, (DLGPROC) GoToProc); 
                    ShowWindow (hwndGoto, SW_SHOW); 
                } 
                break; 
        } retourneren 0 L 
 

In de voorgaande verklaringen, heet CreateDialog alleen als hwndGoto doet niet een geldige vensteringang bevatten. Dit zorgt ervoor dat de toepassing niet twee dialoogvensters op hetzelfde moment weergegeven. Ter ondersteuning van deze methode van controle, moet het dialoogvenster procedure ingesteld hwndGoto op NULL wanneer het vernietigt het dialoogvenster.

De lus bericht voor een toepassing bestaat uit de volgende instructies:

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

De lus controleert de geldigheid van de vensteringang voor het dialoogvenster en alleen roept de functie IsDialogMessage als het handvat geldig is. Het bericht verwerkt IsDialogMessage alleen als het deel uitmaakt van het dialoogvenster. Anders is het resultaat ONWAAR en de lus verzendt het bericht naar het juiste venster.

De volgende instructies definiëren het dialoogvenster vak procedure:

int iLine;             / / ontvangt lijn nummer BOOL fRelative;        / / het selectievakje status ontvangt BOOL C&ALLBACK GoToProc (HWND hwndDlg, UINT bericht, WPARAM wParam, LPARAM lParam) {BOOL fError; 
 
    schakelaar (bericht) {WM_INITDIALOG geval: CheckDlgButton (hwndDlg, ID_ABSREL, fRelative); 
            return TRUE; 
 
        geval WM_COMMAND: schakelen (LOWORD(wParam)) {IDOK geval: fRelative = IsDlgButtonChecked (hwndDlg, ID_ABSREL); 
                    iLine = GetDlgItemInt (hwndDlg, ID_LINE, amp; fError, fRelative); 
                    Als (fError) {MessageBox (hwndDlg, SZINVALIDNUMBER, SZGOTOERR, MB_OK); 
                        SendDlgItemMessage (hwndDlg, ID_LINE, EM_SETSEL, 0,-1 L); 
                    } anders / / het venster van de eigenaar te voeren / / uit de opdracht. 
 
                    return TRUE; 
 
                Case IDCANCEL: DestroyWindow(hwndDlg); 
                    hwndGoto = NULL; 
                    return TRUE; 
            }} return FALSE; 
} 
 

In de voorgaande verklaringen verwerkt de procedure de WM_INITDIALOG en WM_COMMAND berichten. Tijdens WM_INITDIALOG verwerking, initialiseert de procedure het selectievakje door de huidige waarde van de globale variabele fRelative aan CheckDlgButton. De procedure geeft als resultaat TRUE om direct het systeem om de standaard input focus.

Tijdens WM_COMMAND processing, de procedure sluit het dialoogvenster alleen als de gebruiker de knop Annuleren — dat wil zeggen, de knop met de IDCANCEL-id. De procedure moet call DestroyWindow om een niet-modaal dialoogvenster te sluiten. Merk op dat de procedure wordt ook de variabele hwndGoto ingesteld op NULL om ervoor te zorgen dat andere verklaringen die afhankelijk zijn van deze variabele correct functioneren.

Als de gebruiker ervoor de OK knop kiest, de procedure worden opgehaald van de huidige status van het selectievakje en toegewezen aan de variabele fRelative . Vervolgens wordt de variabele voor het ophalen van het regelnummer van het besturingselement voor bewerking. GetDlgItemInt vertaalt de tekst in het besturingselement voor bewerking in een geheel getal. De waarde van fRelative bepaalt of de functie het getal als een waarde of zonder voorteken interpreteert. Als de tekst van het besturingselement bewerken geen geldig getal is, GetDlgItemInt de waarde van de variabele fError ingesteld op niet-nulzijnde. De procedure controleert deze waarde om te bepalen of een foutbericht weergegeven of de opdracht uitvoeren. In het geval van een fout stuurt het dialoogvenster vak procedure een bericht naar het besturingselement voor bewerking, regie te selecteert u de tekst in het besturingselement, zodat de gebruiker kan gemakkelijk vervangen. Als GetDlgItemInt een fout niet terugkrijgt, kan de procedure de gevraagde opdracht zelf uitvoeren of stuur een bericht naar het venster van de eigenaar, leiden de opdracht uit te voeren.

Index