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 Corso – Lezione Successiva >>