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