Εσωτερική δομή

Εσωτερικά τα συστήματα γραφικής διεπαφής που βασίζονται σε παράθυρα λειτουργούν με βάση γεγονότα (events) τα οποία στέλνονται στις εφαρμογές. Το κάθε παράθυρο είναι μια (τυπικά ορθογώνια) περιοχή της οθόνης η οποία σχεδιάζεται αυτόνομα και λαμβάνει γεγονότα. Κάθε εφαρμογή μπορεί να απαρτίζεται από ένα ή περισσότερα παράθυρα. Γεγονότα μπορεί να είναι π.χ. η επιλογή μιας εντολής από το μενού, η αλλαγή του κειμένου που γράφει ο χρήστης, το πάτημα ενός πλήκτρου, η κίνηση του ποντικιού ή, η αλλαγή της ώρας. Τα γεγονότα μπορεί να δημιουργούνται άμεσα από το χρήστη ή να συνθέτονται από το σύστημα ως αποτέλεσμα εντολών του χρήστη, ή άλλων εξωτερικών διεπαφών. Το κάθε γεγονός στέλνεται σε μια ή περισσότερες εφαρμογές. Οι εφαρμογές με τη σειρά τους στέλνουν τα γεγονότα στα παράθυρα που μπορούν να τα επεξεργαστούν. Έτσι, αντί η εφαρμογή να ζητά στοιχεία από το χρήστη, τα στοιχεία από το χρήστη στέλνονται ως γεγονότα στην εφαρμογή. Στο περιβάλλον των Windows ορίζονται πάνω από 800 διαφορετικά γεγονότα.

Για την επιβολή συνέπειας στη διεπαφή με το χρήστη αλλά και τη διευκόλυνση υλοποίησης των εφαρμογών τα παραθυρικά περιβάλλοντα ορίζουν μια σειρά από όργανα (controls) (ή widgets) τα οποία ενσωματώνουν και διαθέτουν ένα σύνολο από λειτουργίες που είναι συχνά χρήσιμες. Παραδείγματα τέτοιων οργάνων είναι το πλαίσιο εισαγωγής κειμένου (edit box), το πιεζόμενο κουμπί (push button) και το πλαίσιο επιλογής αρχείου.

Η μεταφορά των γεγονότων από το σύστημα στις εφαρμογές και τα παράθυρά τους βασίζεται συχνά στην κληρονομικότητα. Έτσι, μια εφαρμογή μπορεί να δημιουργήσει υποκλάσεις για ένα όργανο που να δίνουν στο όργανο πιο εξειδικευμένη λειτουργικότητα. Αντίστοιχα, τα μηνύματα από το σύστημα κατεβαίνουν το δέντρο της κληρονομικότητας μιας εφαρμογής μέχρι και το τελευταίο στην ιεραρχία παράθυρο ή όργανο να δει το γεγονός και να έχει την ευκαιρία να το χειριστεί. Μια εφαρμογή πρέπει να παραλαμβάνει συνέχεια όλα τα μηνύματα που στέλνονται σε αυτή, να τα διαχωρίζει και να τα προωθεί στους αντίστοιχους παραλήπτες. Ο παρακάτω κώδικας αποτελεί τυπικό παράδειγμα του βρόχου που παραλαμβάνει και προωθεί μηνύματα σε εφαρμογές Windows:

        MSG             msg;

        while (GetMessage(&msg, NULL00)) {
                if (!IsDialogMessage(hWnd, &msg)) {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }
Αντίστοιχα ο παρακάτω κώδικας αποτελεί ένα απλό παράδειγμα για το πως μπορεί να γίνει απλοϊκά η επεξεργασία των μηνυμάτων:
long
WdInWndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
        static BOOL     fFirstPaint;
        static HWND     hWndList;
        static HWND     hWndEdit;
        HWND            focus;
        int i;

        switch (iMessage) {
        case WM_CREATE:
                fFirstPaint = TRUE;
                break;
        case WM_PAINT:
                if (fFirstPaint) {
                        fFirstPaint = FALSE;
                        /* Set focus to the input string box */
                        hWndEdit = GetDlgItem(hDlgWnd, ID_STRINGEDIT);
                        hWndList = GetDlgItem(hDlgWnd, ID_LISTBOX);
                        /* Blank all lines so that we start from the bottom */
                        for (i = 0; i < HLEN; i++)
                                (void)SendMessage(hWndList, LB_INSERTSTRING,
                                        (WPARAM)-1, (LPARAM)(LPCSTR)"");
                        SetFocus(hWndEdit);
                }
                return (DefWindowProc(hWnd, iMessage, wParam, lParam));
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        case WM_COMMAND:
                switch (wParam) {
                case IDOK:                      /* Enter key */
                        focus = GetFocus();
                        if (focus == hWndEdit)
                                newline(hWndEdit, hWndList);
                        else if (focus == hWndList)
                                histline(hWndList, hWndEdit);
                        else
                                goto aka_default;
                        break;
                case ID_LISTBOX:
                        if (HIWORD(lParam) == LBN_DBLCLK)
                                histline(hWndList, hWndEdit);
                        else
                                goto aka_default;
                        break;
                default:
                        goto aka_default;
                }
                break;
        default:
        aka_default:
                return (DefWindowProc(hWnd, iMessage, wParam, lParam));
        }
        return 0L;
}
Είναι φανερό πως το παραπάνω μοντέλο δε μπορεί να εφαρμοστεί αποτελεσματικά σε εφαρμογές με εκατοντάδες εντολές και αντίστοιχα μηνύματα.