#include<windows.h>
long FAR PASCAL WndProc(HWND, UINT, UINT, LONG);
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR
lpszCmdParam, int nCmdShow)
{
static
char
szAppName[]="HelloWin";
HWND
hwnd;
MSG
msg;
WNDCLASS wndclass;
if (!hPrevInstance)
{
wndclass.style
=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WndProc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hInstance
=hInstance;
wndclass.hIcon
=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor
=LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName =NULL;
wndclass.lpszClassName =szAppName;
RegisterClass( &wndclass);
}
hwnd=CreateWindow
(szAppName,
//window class name
"Program Win
minimal",
//window caption
WS_OVERLAPPEDWINDOW, //window style
CW_USEDEFAULT,
//initial x position
CW_USEDEFAULT,
//initial y position
CW_USEDEFAULT,
//initial x size
CW_USEDEFAULT,
//initial y size
NULL,
//parent window handle
NULL,
//window menu handle
hInstance,
//program instance handle
NULL);
//creation parameters
ShowWindow (hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage ( &msg, NULL, 0, 0))
{
TranslateMessage ( &msg);
DispatchMessage (hwnd);
}
return msg.wParam;
}
long FAR PASCAL WndProc (HWND hwnd, UINT message, UINT wParam, LONG IParam)
{
HDC
hdc;
PAINTSTRUCT ps;
RECT
rect;
switch( message)
{
case WM_PAINT:
hdc= BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rect);
DrawText( hdc, 'Hello Windows!', -1, &rect, DT_SINGLELINE | DT_CENTER |
DT_VCENTER);
EndPaint (hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
return DefWindowProc
(hwnd, message, WParam, IParam);
}
Comentarii:
Se poate observa in cadrul
programului anumiti termeni care au o
denumire mai speciala (ex. lpszCmdParam, hInstance, nCmdShow, ...). Aceasta
conventie de notare este denumita hungarian (a fost denumita astfel in
onoarea legendarului programator de la Microsoft, Charles Simonyi) si este
utilizata pentru a creea nme de variabile si functii; ea permite scrierea si
depanarea unui cod lizibil. Prefixul plasat in fata unui nume descrie tipul
de date la care se refera variabila: in acest context, prefixul lpsz
din lpszCmdParam inseamna "long pointer to a string terminated
by zero", prefixul "h" din hInstance reprezinta handle,
etc.
Programul incepe cu
#include
<windows.h>
pentru a include in program fisierul header ce contine declaratiile de
functii si structuri aferente sistemului Windows, tipuri de date, constante
numerice, etc. Apoi este declarata procedura WndProc, procedura
care va fi definita mai tarziu si care se va ocupa de tratarea evenimentelor
asociate ferestrei:
long FAR PASCAL WndProc(HWND, UINT,
UINT, LONG);
Apoi urmeaza descrierea functiei WinMain .
I. WinMain
Aceasta functie este echivalenta functiei
main dintr-un program C pentru DOS si contine instructiunile
programului propriu-zis (ea este absolut obligatorie intr-un program C pentru
windows). Antetul functiei si semnificatia parametrilor e
urmatoarea:
int PASCAL WinMain(HANDLE hInstance,
HANDLE hPrevInstance, LPSTR lpszCmdParam, int
nCmdShow)
Aceasta functie
utilizeaza secventa de apelare Pascal.
I.1 Window Class
Orice
fereastra este caracterizata de o clasa window. Aeasta clasa identifica
procedura window care prelucreaza mesajele sosite de la sistemul de operare
pentru o fereastra si precizeaza o serie de alti parametrii ce caracterizeaza
fereastra respectiva si care vor fi descrisi in cele ce urmeaza. Putem
creea mai multe ferestre pe baza aceleiasi clase window (de pilda putem creea
butoane). Inainte de a creea o fereastra pentru programul nostru va trebui sa
inregistram clasa fereastra cu ajutorul functiei RegisterClass.
Structura de date care descrie clasa fereastra ete WNDCLASS. Campurile acesteia sunt:
I.2 CreateWindow
Clasa window defineste carecteristicile generale ale unei
ferestre, fapt ce permite utilizarea aceleiasi clase la crearea mai multor
ferestre diferite. Cand cream o fereastra prin intermediul functiei
CreateWindow, specificam informatii mai detaliate despre fereastra. In
loc sa utilizeze o structura de date - asa cum procedeaza rutina
RegisterClass - functia CreateWindow cere ca toate informatiile sa
fie pasate ca parametrii ai functiei. Modul de apel al rutinei este urmatorul:
hwnd=CreateWindow
(szAppName, //window
class name
"Program Win
minimal",
//window caption
WS_OVERLAPPEDWINDOW, //window style
CW_USEDEFAULT,
//initial x position
CW_USEDEFAULT,
//initial y position
CW_USEDEFAULT,
//initial x size
CW_USEDEFAULT,
//initial y size
NULL, //parent
window handle
NULL,
//window menu handle
hInstance, //program
instance handle
NULL); //creation
parameters
Parametrul window class name este numele clasei
fereastra inregistrate. Fereastra creata a acestui program este o fereastra
de tip overlapped (peste care se pot suprapune alte
ferestre), ce poseda o bara de titlu, o caseta cu system menu
(plasata la stanga barei de titlu), butoanele minimize si
maximize (situate la dreapta barei de titlu) si un cadru
gros pentru redimensionarea ferestrei. Window caption reprezinta
textul afisat pe bara de titlu. Window style este WS_OVERLAPPEDWINDOW
si este stilul standard al unei ferestre. Parametrii initial x position
si initial y position specifica pozitia initiala a coltului din
stanga sus al ferestrei in raport cu coltul din stanga sus al ecranului.
Valoarea CW_USEDEFAULT pentru acesti parametrii semnaleaza sistemului Windows ca
dorim o pozitie implicita pentru fereastra noastra. In mod similar, parametrii
initial x size si initial y size specifica prin valoarea
CW_USEDEFAULT dimensiuni implicite pentru latimea si inaltimea ferestrei.
Parametrul marcat parent window handle este stabilit la valoarea NULL
deoarece fereastra programului nostru nu are o fereastra de tip parent
(adica un superior); daca exista o relatie de rudenie parent-child
intre doua ferestre, atunci fereastra child apare intotdeauna deasupra
ferestrei parent aferenta. Parametrul window menu handle este un
handle de meniu; noi il fixam la NULL pentru ca fereastra noastra nu poseda
meniu. Parametrul program instance handle va avea ca valoare
identificatorul instantei ce este pasat programului ca parametru al functiei
WinMain . In final, variabila pointer creation parameter este
stabilita la valoarea NULL. Valoarea de retur a functiei CreateWindow
este un handle de fereastra (o valoare de tipul HWND). Fiecare fereastra
(in sistemul Windows poseda un handle, iar programul nostru il utilizeaza
pentru a se referi la fereastra.