Semplice elaborazione testi con un controllo di modifica

Nell'esempio seguente implementa molte delle funzionalitą di un semplice elaboratore di testo riempiendo l'area client di una finestra con un controllo di modifica su pił righe. Il sistema esegue automaticamente operazioni di avvolgere parola per questo controllo di modifica e gestisce anche l'elaborazione per la barra di scorrimento verticale (creata specificando ES_AUTOVSCROLL nella chiamata alla funzione CreateWindow ). Il messaggio WM_COMMAND elabora le voci di menu; Essi permettono all'utente di annullare l'azione precedente, tagliare o copiare le selezioni negli appunti, incollare il testo dagli Appunti ed eliminare la selezione corrente.

LONG APIENTRY MainWndProc( 
HWND hwnd,                // window handle 
UINT message,             // type of message 
WPARAM wParam,            // additional information 
LPARAM lParam)            // additional information 
{ 
    static HWND hwndEdit; 
 
    CHAR lpszTrouble[] = "When in the Course of human Events " 
                         "it becomes necessary for one People " 
                         "to dissolve the Political Bands which " 
                         "have connected them with another, and " 
                         "to assume among the Powers of the " 
                         "Earth, the separate and equal Station " 
                         "to which the Laws of Nature and of " 
                         "Nature's God entitle them, a decent " 
                         "Respect to the Opinions of Mankind " 
                         "requires that they should declare the " 
                         "causes which impel them to the " 
                         "Separation. "; 
 
    switch (message) 
    { 
        case WM_CREATE: 
            hwndEdit = CreateWindow( 
                "EDIT",     // predefined class 
                NULL,       // no window title 
                WS_CHILD | WS_VISIBLE | WS_VSCROLL | 
                    ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 
                0, 0, 0, 0, // set size in WM_SIZE message 
                hwnd,       // parent window 
                (HMENU) ID_EDITCHILD, // edit control ID 
                (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
                NULL);                // pointer not needed 
 
             // Add text to the window. 
 
             SendMessage(hwndEdit, WM_SETTEXT, 0, 
                (LPARAM) lpszTrouble); 
 
            return 0; 
 
        case WM_COMMAND: 
            switch (wParam) 
            { 
                case IDM_EDUNDO: 

                    // Send WM_UNDO only if there is something 
                    // to be undone. 
 
                    if (SendMessage(hwndEdit, EM_CANUNDO, 0, 0)) 
                        SendMessage(hwndEdit, WM_UNDO, 0, 0); 
                    else 
                    {
                        MessageBox(hwndEdit, 
                            "Nothing to undo.", 
                            "Undo notification", MB_OK); 
                    }
                    break; 
 
                case IDM_EDCUT: 
                    SendMessage(hwndEdit, WM_CUT, 0, 0); 
                    break; 
 
                case IDM_EDCOPY: 
                    SendMessage(hwndEdit, WM_COPY, 0, 0); 
                    break; 
 
                case IDM_EDPASTE: 
                    SendMessage(hwndEdit, WM_PASTE, 0, 0); 
                    break; 
 
                case IDM_EDDEL: 
                    SendMessage(hwndEdit, WM_CLEAR, 0, 0); 
                    break; 
 
                case IDM_PASSWORD: 
                    DialogBox(hinst, // current instance 
                        "PassBox",   // resource to use 
                         hwnd,       // parent handle 
                         (DLGPROC) PassProc); 
                    break; 
 
                case IDM_WRAP: 
                    SendMessage(hwndEdit, 
                        EM_SETWORDBREAKPROC, 
                        (WPARAM) 0, 
                        (LPARAM) (EDITWORDBREAKPROC) WordBreakProc); 
                    SendMessage(hwndEdit, 
                        EM_FMTLINES, 
                        (WPARAM) TRUE, 
                        (LPARAM) 0); 
                    SendMessage(hwndEdit, 
                        EM_SETSEL, 
                        0, -1); // select all text 
                    SendMessage(hwndEdit, WM_CUT, 0, 0); 
                    SendMessage(hwndEdit, WM_PASTE, 0, 0); 
                    break; 
 
                case IDM_ABOUT: 
                    DialogBox(hinst, // current instance 
                        "AboutBox",  // resource to use 
                         hwnd,       // parent handle 
                         (DLGPROC) About); 
                    break; 
 
                default: 
                    return DefWindowProc(hwnd, message, wParam, lParam); 
            } 
            break; 
 
        case WM_SETFOCUS: 
            SetFocus(hwndEdit); 
            return 0; 
 
        case WM_SIZE: 
 
            // Make the edit control the size of the window's 
            // client area. 
 
            MoveWindow(hwndEdit, 
                0, 0,           // starting x- and y-coordinates 
                LOWORD(lParam), // width of client area 
                HIWORD(lParam), // height of client area 
                TRUE);          // repaint window 
            return 0; 
 
        case WM_DESTROY: 
            PostQuitMessage(0); 
            return 0; 
 
        default: 
            return DefWindowProc(hwnd, message, wParam, lParam); 
    } 
    return NULL; 
} 
 

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index