Erstellen eines nicht modalen Dialogfelds

Sie erstellen ein nicht modales Dialogfeld mithilfe der Funktion "createDialog" angeben der Bezeichner oder einer Dialogfeldressource Vorlage Name und die Adresse des das Dialogfeld Feld Verfahren. CreateDialog lädt die Vorlage und erstellt das Dialogfeld optional zeigt es. Ihre Anwendung ist verantwortlich für das Abrufen und Benutzer Eingabemeldungen, die Dialogfeldprozedur Versand.

Im folgenden Beispiel, die Anwendung zeigt ein nicht modales Dialogfeld — wenn es nicht bereits angezeigt wird – wenn der Benutzer wählt einen Befehl Gehe zu Menü eine Anwendung. Das Dialogfeld enthält ein Edit-Steuerelement ein Kontrollkästchen und Schaltflächen OK und Abbrechen. Das Dialogfeld Feld Vorlage ist eine Ressource in der ausführbaren Datei der Anwendung und hat den Ressourcenbezeichner DLG_GOTO. Der Benutzer gibt eine Zeilennummer in das Edit-Steuerelement und überprüft das Kontrollkästchen, um anzugeben, dass die Nummer die Zeile relativ zur aktuellen Zeile. Die Steuerelement-IDs sind ID_LINE, ID_ABSREL, IDOK und IDCANCEL.

Die Anweisungen im ersten Teil des Beispiels erstellen Sie das nicht modale Dialogfeld. Diese Aussagen, erstellen Wenn die Fensterprozedur empfängt eine WM_COMMAND -Meldung mit dem Bezeichner IDM_GOTO Befehl, aber nur, wenn die globale Variable HwndGoto nicht bereits über ein gültiges Handle enthält in der Fensterprozedur der Anwendung im Hauptfenster das Dialogfeld. Der zweite Teil des Beispiels ist die Anwendung einer Hauptmeldungsschleife. Die Schleife enthält die Funktion IsDialogMessage um sicherzustellen, dass der Benutzer das Dialogfeld Feld Tastatur Schnittstellen in diesem nicht modalen Dialogfeld verwenden kann. Der dritte Teil des Beispiels ist die Dialogfeldprozedur. Die Prozedur ruft den Inhalt des Edit-Steuerelements und das Kontrollkästchen, wenn der Benutzer auf die Schaltfläche OK. Das Verfahren zerstört im Dialogfeld, wenn der Benutzer die Schaltfläche Abbrechen.

HWND HwndGoto = NULL;  / / Fenster-handle des Dialogfelds. 
    . 
    . 
 
    Fall WM_COMMAND: schalten (LOWORD(wParam)) {case IDM_GOTO: If (!IsWindow(hwndGoto)) {HwndGoto = CreateDialog (Hinst, MAKEINTRESOURCE(DLG_GOTO), Hwnd, (DLGPROC) GoToProc); 
                    ShowWindow (HwndGoto, SW_SHOW); 
                } 
                break; 
        } zurück, 0 L 

 

In den vorhergehenden Anweisungen CreateDialog wird nur aufgerufen, wenn HwndGoto ist kein gültiges Fensterhandle enthalten. Dadurch wird sichergestellt, dass die Anwendung nicht zur gleichen Zeit zwei Dialogfelder angezeigt wird. Um diese Methode der Prüfung zu unterstützen, muss die Dialogfeld-Prozedur HwndGoto auf NULL festlegen im Dialogfeld zerstört.

Die Meldungsschleife für eine Anwendung besteht aus den folgenden Aussagen:

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

 

Die Schleife prüft die Gültigkeit von den Fenster-Handle für das Dialogfeld, und nur die Funktion IsDialogMessage aufgerufen, wenn das Handle gültig ist. IsDialogMessage verarbeitet die Nachricht nur, wenn sie das Dialogfeld gehört. Andernfalls gibt es FALSE zurück und die Schleife sendet die Meldung an das entsprechende Fenster.

Die folgenden Anweisungen definieren die Dialogfeldprozedur:

int iLine;             / / erhält Zeile &Anzahl BOOL fRelative;        / / das Kontrollkästchen Status erhält BOOL CALLBACK GoToProc (HWND HwndDlg, UINT Message, WPARAM wParam, LPARAM lParam) {BOOL fError; 
 
    Switch (Message) {case WM_INITDIALOG: CheckDlgButton (HwndDlg, ID_ABSREL, fRelative); 
            TRUE zurück; 
 
        Fall WM_COMMAND: schalten (LOWORD(wParam)) {case IDOK: fRelative = IsDlgButtonChecked (HwndDlg, ID_ABSREL); 
                    iLine = GetDlgItemInt (HwndDlg, ID_LINE, Amp; fError, fRelative); 
                    Wenn (fError) {MessageBox (HwndDlg, SZINVALIDNUMBER, SZGOTOERR, MB_OK); 
                        SendDlgItemMessage (HwndDlg, ID_LINE, EM_SETSEL, 0,-1 L); 
                    } sonst / / Notify das Besitzerfenster tragen / / den Befehl aus. 
 
                    TRUE zurück; 
 
                Fall IDCANCEL: DestroyWindow(hwndDlg); 
                    HwndGoto = NULL; 
                    TRUE zurück; 
            {}} return FALSE; 
} 

 

In den vorhergehenden Anweisungen verarbeitet die Prozedur die WM_INITDIALOG und WM_COMMAND -Nachrichten. Während WM_INITDIALOG Verarbeitung initialisiert die Prozedur das Kontrollkästchen den aktuellen Wert der globalen Variable fRelative an CheckDlgButtonübergeben. Die Prozedur gibt dann TRUE, wenn das System den Eingabefokus Standard festlegen direkt.

Während der Verarbeitung WM_COMMAND, das Verfahren schließt das Dialogfeld, nur wenn der Benutzer die Schaltfläche Abbrechen — das heißt, die Schaltfläche mit dem Bezeichner IDCANCEL. Der Prozeduraufruf muss DestroyWindow um ein nicht modales Dialogfeld zu schließen. Beachten Sie, dass das Verfahren auch die HwndGoto -Variable auf NULL setzt um sicherzustellen, dass andere Anweisungen, die von dieser Variablen abhängen korrekt.

Wenn der Benutzer die OK-Taste, wird die Prozedur ruft den aktuellen Zustand des Kontrollkästchens und der fRelative -Variablen zugewiesen. Anschließend wird die Variable verwendet, um die Zeilennummer aus dem Bearbeitungssteuerelement abzurufen. GetDlgItemInt übersetzt den Text in das Edit-Steuerelement in eine ganze Zahl. Der Wert des fRelative bestimmt, ob die Funktion die Zahl als Wert mit oder ohne Vorzeichen interpretiert. Wenn der bearbeiten-Steuerelementtext keine gültige Zahl ist, legt GetDlgItemInt den Wert der Variablen fError auf ungleich NULL. Die Prozedur überprüft diesen Wert zu ermitteln, ob eine Fehlermeldung angezeigt oder führen den Befehl aus. Bei einem Fehler sendet die Dialogfeldprozedur eine Nachricht an das Edit-Steuerelement gesendet, um den Text im Steuerelement markieren, so dass der Benutzer es problemlos ersetzen kann. Wenn GetDlgItemInt keinen Fehler zurückgibt, kann das Verfahren entweder der angeforderte Befehl selbst durchzuführen oder eine Nachricht an das Besitzerfenster, gesendet, um den Befehl auszufuehren.

Index