Una Semplice Finestra di Windows in Visual C/C++

Dopo aver introdotto il funzionamento base della programmazione in Windows con il Visual C/C++ affrontiamo oggi la costruzione di una semplice finestra con l’SDK ( Software Development Kit ) di Windows. Per prima cosa abbiamo detto che ogni applicazione Windows ha una funzione principale WinMain, questa si collega ad un’altra funzione che gestisce i messaggi, la Window Procedure, che si inserisce al momento della registrazione della classe di finestre. Vediamo il codice necessario alla costruzione di una semplice finestra:

LONG FAR PASCAL WindowProc(HWND, UINT, WPARAM, LPARAM);
char szProgName[] = "Applicazione Corso";

int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPreInst,
             LPSTR lpszCmdLine, int CmdShow)
{
   HWND hWnd;
   MSG msg;
   WNDCLASS wc;

   if (!hPreInst )
  {
      wc.lpszClassName = szProgName;
      wc.hInstance = hInst;
      wc.lpfnWndProc = WindowProc;
      wc.hCursor = LoadCursor(NULL, IDC_ARROW);
      wc.hIcon = NULL;
      wc.lpszMenuName = NULL;
      wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      wc.style = CS_HREDRAW|CS_VREDRAW;
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;

       if (!RegisterClass(&wc))
          return FALSE;
   }

   hWnd = CreateWindow(szProgName, "Prima Finestra del Corso",
             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,
             NULL, hInst, NULL);

   if (!hWnd)
       return FALSE; 

  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);

  while (GetMessage(&msg, 0, 0, 0))
  {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
  }

   return msg.wParam;
}

LONG FAR PASCAL WindowProc(HWND hWnd, UINT msg,
             WPARAM wParam, LPARAM lParam)
{
   switch (msg)
   {
   case WM_DESTROY:
       PostQuitMessage(0);
       break;
   default:
       return DefWindowProc(hWnd, msg, wParam, lParam);
  }

   return 0;
}

Questo è il codice necessario alla costruzione della finestra più semplice possibile, per la struttura delle varie funzioni vi rimando all’aiuto in linea dell’sdk. Vediamo i passi principali:

  • Definizione della funzione callback che funzionerà da gestione dei messaggi, noi l’abbiamo chiamata WindowProc e che va inserita nella definizione della nostra classe di finestre personalizzata. In questa classe abbiamo scelto uno sfondo bianco, tramite l’handle del brush creato con CreateStockObject ed un cursore standard a freccia.
  • Creazione della finestra nella funzione WinMain con il nome della classe di finestre registrata dalla nostra applicazione, il testo che va inserito nella caption e le dimensioni di default CW_USEDEFAULT, senza finestra padre e senza menu. Lo stile WS_OVERLAPPEDWINDOW è uno stile composto formato di tanti stili semplici uniti con OR bit a bit ( vedere la documentazione dell’sdk ) ed in sostanza crea una finestra con l’icona, i pulsanti di sistema ed il bordo dimensionabile.
  • Mostrare la finestra con ShowWindow e poi chiedere di farla aggiornare nel disegno con UpdateWindow.
  • Gestire i messaggi con GetMessage e poi inoltrandoli alla nostra Window Procedure, che gestisce per ora solo i messaggi di chiusura applicazione ed instradamento dei messaggi non trattati per la via standard.

Nella prossima lezione vedremo come inserire una nostra icona ed un nostro menu nella finestra e quindi parleremo delle risorse di un’applicazione e di come vengano gestite. Come sempre vi ricordo di ricorrere al forum per qualsiasi domanda.

<< Lezione Precedente – Inizio CorsoLezione Successiva >>

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in VC/C++. Contrassegna il permalink.