Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    216

    [C++ Win32] problema visualizzazione finestra

    Salve, ho scritto un programma (un semplice editor di testo) ma non appare
    la finestra.
    Questo č il codice cpp:
    codice:
    #include <windows.h>
    #include "resource.h"
    
    #define ID_EDIT 1
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    TCHAR szAppName[] = TEXT("PopupEditor");
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR 
    lpCmdLine, int nCmdShow)
     {
      HACCEL hAccel;
      HWND hwnd;
      MSG msg;
      WNDCLASS wndclass;
    
      wndclass.style = CS_HREDRAW | CS_VREDRAW;
      wndclass.lpfnWndProc = WndProc;
      wndclass.cbClsExtra = 0;
      wndclass.cbWndExtra = 0;
      wndclass.hInstance = hInstance;
      wndclass.hIcon = LoadIcon(hInstance, szAppName);
      wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
      wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      wndclass.lpszMenuName = szAppName;
      wndclass.lpszClassName = szAppName;
    
      RegisterClass(&wndclass); //registrazione della classe
    
      hwnd = CreateWindow(szAppName, //nome della classe window
           szAppName, //titolo della finestra(barra del titolo)
           WS_OVERLAPPEDWINDOW, //stile window
           GetSystemMetrics(SM_CXSCREEN / 4), //posizione x iniziale
           GetSystemMetrics(SM_CYSCREEN / 4), //posizione y iniziale
           GetSystemMetrics(SM_CXSCREEN / 2), //dimensione x iniziale(larghezza)
           GetSystemMetrics(SM_CXSCREEN / 2), //dimensione y iniziale(altezza)
           NULL, //handle alla finestra genitore
           NULL, //handle al menų della finestra
           hInstance, //handle all'istanza del programma
           NULL);
    
      ShowWindow(hwnd, nCmdShow); //disegna la finestra sullo schermo, con le 
    impostazioni iniziali date dall'utente
    
      UpdateWindow(hwnd); //disegna l'area client della finestra
    
      hAccel = LoadAccelerators(hInstance, szAppName);
    
      //ciclo dei messaggi
      while (GetMessage(&msg, NULL,  0, 0)) //recupera un messaggio dalla coda 
    (restituisce FALSE (0) solo per WM_QUIT)
       {
        if (!TranslateAccelerator(hwnd, hAccel, &msg))
         {
          TranslateMessage(&msg); //opera alcune modifiche al messaggio a 
    seconda della tastiera
          DispatchMessage(&msg); //invia il messaggio alla window procedure 
    appropriata
         }
       }
     return  msg.wParam ;
     }
    
    
     LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM 
    lParam)
      {
       static HWND hwndEdit;
       int iSeleziona, iAbilita;
    
       switch(message)
        {
         case WM_CREATE:
          hwndEdit = CreateWindow(TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | 
    WS_HSCROLL | WS_VSCROLL | WS_BORDER |
                ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
                0, 0, 0, 0, hwnd, (HMENU)ID_EDIT, ((LPCREATESTRUCT) 
    lParam)->hInstance, NULL);
    
          return 0;
    
         case WM_SETFOCUS:
          SetFocus(hwndEdit);
          return 0;
    
         case WM_SIZE:
          //le dimensione dell'edit control sono settate alle dimensioni della 
    finestra principale
          MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
          return 0;
    
         case WM_INITMENUPOPUP:
          if (lParam == 1)
           {
            //SendMessage restituisce non-zero se l'edit control puā eseguire 
    un'azione "annulla" e quindi l'opzione č abilitata;
            //altrimenti l'opzione č grigia(disabilitata)
            EnableMenuItem((HMENU) wParam, IDM_ANNULLA1, SendMessage(hwndEdit, 
    EM_CANUNDO, 0, 0)  ? MF_ENABLED : MF_GRAYED);
    
            //IsClipboardFormatAvailable con CF_TEXT determina se l'area client 
    contiene correntemente testo
            EnableMenuItem((HMENU) wParam, IDM_INCOLLA1, 
    IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED);
    
            //abilita le opzioni Taglia, Copia e Elimina solo se il testo 
    nell'edit control č stato selezionato
            iSeleziona = SendMessage(hwndEdit, EM_GETSEL, 0, 0);
    
            //LOWORD(iSeleziona) č la posizione del primo carattere selezionato, 
    HIWORD(iSeleziona) č la posizione del carattere seguente la selezione
            //se sono uguali nessun testo č stato selezionato
            if (HIWORD(iSeleziona) == LOWORD(iSeleziona))
             iAbilita = MF_GRAYED;
            else
             iAbilita = MF_ENABLED;
    
            EnableMenuItem((HMENU) wParam, IDM_TAGLIA1, iAbilita);
            EnableMenuItem((HMENU) wParam, IDM_COPIA1, iAbilita);
            EnableMenuItem((HMENU) wParam, IDM_ELIMINA1, iAbilita);
    
            return 0;
           }
          break;
    
         case WM_COMMAND:
          if (lParam)
           {
            //se l'edit control č fuori dallo spazio di inserimento visualizza 
    una finestra di messaggio di errore
            if (LOWORD(lParam) == ID_EDIT && (HIWORD(wParam) == EN_ERRSPACE || 
    HIWORD(wParam) == EN_MAXTEXT))
             MessageBox(hwnd, TEXT("Edit Control fuori dallo spazio!"), 
    szAppName, MB_OK | MB_ICONSTOP);
            return 0;
           }
          else switch(LOWORD(wParam))
           {
            case IDM_NUOVO1:
            case IDM_APRI1:
            case IDM_SALVA1:
            case IDM_SALVA_CON_NOME___1:
            case IDM_STAMPA1:
             MessageBeep(0);
             return 0;
    
            case IDM_ESCI1:
             SendMessage(hwnd, WM_CLOSE, 0, 0);
             return 0;
    
            case IDM_ANNULLA1:
             SendMessage(hwnd, WM_UNDO, 0, 0);
             return 0;
    
            case IDM_TAGLIA1:
             SendMessage(hwnd, WM_CUT, 0, 0);
             return 0;
    
            case IDM_COPIA1:
             SendMessage(hwnd, WM_COPY, 0, 0);
             return 0;
    
            case IDM_INCOLLA1:
             SendMessage(hwnd, WM_PASTE, 0, 0);
             return 0;
    
            case IDM_ELIMINA1:
             SendMessage(hwnd, WM_CLEAR, 0, 0);
             return 0;
    
            case IDM_SELEZIONA_TUTTO1:
             SendMessage(hwnd, EM_SETSEL, 0, -1);
             return 0;
    
            case IDM_AIUTO1:
             MessageBox(hwnd, TEXT("Aiuto non ancora implementato!"), szAppName, 
    MB_OK | MB_ICONEXCLAMATION);
             return 0;
    
            case IDM_INFORMAZIONI_SU___1:
             MessageBox(hwnd, TEXT("PopupEditor (c) Minnozzi Corrado, 2009"), 
    szAppName, MB_OK | MB_ICONINFORMATION);
             return 0;
           }
          break;
    
         //questi 2 messaggi sono i soli che bisogna processare per chiedere 
    conferma all'utente prima di chiudere un programma
         case WM_CLOSE:
           MessageBox(hwnd, TEXT("Sei sicuro di uscire da PopupEditor?"), 
    szAppName, MB_YESNO | MB_ICONQUESTION);
           DestroyWindow(hwnd);
          return 0;
    
         case WM_QUERYENDSESSION:
           MessageBox(hwnd, TEXT("Sei sicuro di uscire da PopupEditor?"), 
    szAppName, MB_YESNO | MB_ICONQUESTION);
           return 0;
    
         case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
        }
       return DefWindowProc(hwnd, message, wParam, lParam);
      }
    Questo č il file resorce.h:
    codice:
    #ifndef IDC_STATIC
    #define IDC_STATIC (-1)
    #endif
    
    #define IDR_MENU1                               100
    #define IDM_NUOVO1                              40000
    #define IDM_APRI1                               40001
    #define IDM_SALVA1                              40002
    #define IDM_SALVA_CON_NOME___1                  40003
    #define IDM_STAMPA1                             40004
    #define IDM_ESCI1                               40005
    #define IDM_ANNULLA1                            40006
    #define IDM_TAGLIA1                             40007
    #define IDM_COPIA1                              40008
    #define IDM_INCOLLA1                            40009
    #define IDM_SELEZIONA_TUTTO1                    40010
    #define IDM_ELIMINA1                            40011
    #define IDM_AIUTO1                              40012
    #define IDM_INFORMAZIONI_SU___1                 40013
    E questo č il file di risorse:
    codice:
    #include <windows.h>
    #include <commctrl.h>
    #include <richedit.h>
    #include "resource.h"
    
    //
    // Menu resources
    //
    LANGUAGE 16, SUBLANG_DEFAULT
    IDR_MENU1 MENU
    {
        POPUP "File"
        {
            MENUITEM "Nuovo", IDM_NUOVO1
            MENUITEM "Apri", IDM_APRI1
            MENUITEM "Salva", IDM_SALVA1
            MENUITEM "Salva con nome...", IDM_SALVA_CON_NOME___1
            MENUITEM "Stampa", IDM_STAMPA1
            MENUITEM "Esci", IDM_ESCI1
        }
        POPUP "Modifica"
        {
            MENUITEM "Annulla", IDM_ANNULLA1
            MENUITEM "Taglia", IDM_TAGLIA1
            MENUITEM "Copia", IDM_COPIA1
            MENUITEM "Incolla", IDM_INCOLLA1
            MENUITEM "Seleziona tutto", IDM_SELEZIONA_TUTTO1
            MENUITEM "Elimina", IDM_ELIMINA1
        }
        POPUP "?"
        {
            MENUITEM "Aiuto", IDM_AIUTO1
            MENUITEM "Informazioni su...", IDM_INFORMAZIONI_SU___1
        }
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472

    Re: [C++ Win32] problema visualizzazione finestra

    Gli errori in rosso ...

    codice:
      hwnd = CreateWindow(szAppName, //nome della classe window
           szAppName, //titolo della finestra(barra del titolo)
           WS_OVERLAPPEDWINDOW, //stile window
           GetSystemMetrics(SM_CXSCREEN) / 4, //posizione x iniziale
           GetSystemMetrics(SM_CYSCREEN) / 4, //posizione y iniziale
           GetSystemMetrics(SM_CXSCREEN) / 2, //dimensione x iniziale(larghezza)
           GetSystemMetrics(SM_CXSCREEN) / 2, //dimensione y iniziale(altezza)
           NULL, //handle alla finestra genitore
           NULL, //handle al menų della finestra
           hInstance, //handle all'istanza del programma
           NULL);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    216
    Grazie ora la finestra appare

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da Bruce5000
    Grazie ora la finestra appare
    E spero tu abbia anche capito il perchč ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.