Registrazione della Classe di Finestre in Windows

Ogni finestra creata da un’applicazione Windows deve basarsi su una classe che riguarda stili, font, colori, posizioni ed altro. Quando un’applicazione registra una nuova classe di finestre, questa diventa utilizzabile da tutti i programmi in esecuzione e quindi è importante non creare conflitti e dare nomi di classi il più possibile univoci. Vediamo ora la struttura che determina una classe:

typedef STRUCT tagWNDCLASS {
   WORD style;
   long (FAR PASCAL* lpfnWndProc) ();
   int cbClsExtra;
   int cbWndExtra;
   HANDLE hInstance;
   HICON hIcon;
   HCURSOR hCursor;
   HBRUSH hbrBackground;
   LPSTR lpszMenuName;
   LPSTR lpszClassName;
} WNDCLASS;

Windows fornisce già alcune classi di finestre predefinite, ma molte applicazioni devono definirne di personalizzate. Vediamo i singoli elementi della struttura ed il loro significato:

style – Definisce lo stile della finestra, questi valori possono essere combinati tramite l’operatore OR bit a bit ( | ):

  • CS_BYTEALIGNCLIENT – Allinea l’area cliente sui limiti di un byte
  • CS_BYTEALIGNWINDOW – Allinea una finestra sui limiti di un byte
  • CS_CLASSDC – Fornisce un contesto di visualizzazione alla classe di finestre
  • CS_DBLCLKS – Invia un messaggio di doppio clic alla finestra
  • CS_GLOBALCLASS – Stabilisce che la classe di finestre è una classe globale dell’applicazione
  • CS_HREDRAW – Ridisegna la finestra quando ne vengono modificate le dimensioni orizzontali
  • CS_NOCLOSE – Disattiva l’opzione di chiusura nel menu di sistema
  • CS_OWNDC – Ogni finestra riceve un’istanza del proprio contesto di visualizzazione
  • CS_PARENTDC – Invia alla classe di finestre il contesto di visualizzazione della finestra da cui dipende
  • CS_SAVEBITS – Salva la parte dello schermo che viene coperta da un’altra finestra
  • CS_VREDRAW – Ridisegna la finestra quando ne vengono modificate le dimensioni vericali

lpfnWndProc – Riceve un puntatore alla funzione di gestione delle finestre che si occuperà di tutte le operazioni su di essa.
cbClsExtra – Fornisce il numero di byte che devono essere allocati dopo la struttura della classe della finestra, può avere valore nullo.
cbWndExtra – Fornisce il numero di byte che devono essere allocati dopo l’istanza della finestra, può avere valore nullo.
hInstance – Definisce l’istanza dell’applicazione registrando la classe di finestre, non può avere valore nullo.
hIcon – Handle dell’icona utilizzata nella finestra, può avere valore nullo, nel qual caso viene visualizzata l’icona predefinita di Windows.
hCursor – Handle del cursore quando questi si trova sulla client area della finestra, può avere valore nullo, nel qual caso verrà visualizzato il cursore predefinito di Windows.
hbrBackground – Può trattarsi di un colore di sistema di Windows:

  • COLOR_ACTIVEBORDER
  • COLOR_ACTIVECAPTION
  • COLOR_APPWORKSPACE
  • COLOR_BACKGROUND
  • COLOR_BTNFACE
  • COLOR_BTNSHADOW
  • COLOR_BTNTEXT
  • COLOR_CAPTIONTEXT
  • COLOR_GRAYTEXT
  • COLOR_HIGHLIGHT
  • COLOR_HIGHLIGHTTEXT
  • COLOR_INACTIVEBORDER
  • COLOR_INACTIVECAPTION
  • COLOR_MENU
  • COLOR_MENUTEXT
  • COLOR_SCROLLBAR
  • COLOR_WINDOW
  • COLOR_WINDOWFRAME
  • COLOR_WINDOWTEXT

oppure di un colore RGB. Ovviamente questi colori di sistema sono quelli predefiniti il cui valore si trova nel registro di sistema e dipente dal tema corrente di Windows. Se questo valore è nullo, la finestra verrà colorata secondo un colore standard.
lpszMenuName – Stringa contenente il nome di un menu nelle risorse, può essere nullo.
lpszClassName – Stringa contenente il nome della classe da registrare.

Una volta riempita la struttura con tutti i valori è possibile registrarla con la funzione RegisterClass.
Nel prossimo appuntamento parleremo del ciclo dei messaggi.

<< 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.