Sunteți pe pagina 1din 17

MINISTERUL DE EDUCAIE DIN REPUBLICA MOLDOVA

UNIVERSITATEA DE STAT DIN MOLDOVA


Departamentul de Informatic

Conf. doct. S. Pereteatcu


Mag. n inf. A. Pereteatcu

Grafica 3D pe calculator
(Suport de curs n baza Direct 3D)

Chiinu - 2014

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

INTRODUCERE ...............................................................................................................................................4
1.

Bazele programrii sub Windows..........................................................................................................6


Noiune de aplicaie tip fereastr .........................................................................................................6
Crearea aplicaieiei n Visual C++ .NET ..................................................................................................6
Modelul general de mesaje n Windows ...............................................................................................8
Funcia principal WinMain() ................................................................................................................8
Tratarea evenimentelor n Windows ..................................................................................................14
Prelucrtorul principal de evenimente ...............................................................................................15

2.

DirectX 9 ................................................................................................. Error! Bookmark not defined.


Destinaia DirectX 9 ................................................................................ Error! Bookmark not defined.
Componente DirectX 9 ........................................................................... Error! Bookmark not defined.
HAL ......................................................................................................... Error! Bookmark not defined.
........................................................................................................ Error! Bookmark not defined.
Interfaa IUnknown ................................................................................ Error! Bookmark not defined.
Direct3D 9............................................................................................... Error! Bookmark not defined.
Crearea scenei n Direct3D ..................................................................... Error! Bookmark not defined.
Interfee Direct3D 9 ............................................................................... Error! Bookmark not defined.
Crearea pointerului spre interfa ......................................................... Error! Bookmark not defined.
Setarea DirectX 9 SDK ............................................................................ Error! Bookmark not defined.

3.

Iniializarea Direct3D .............................................................................. Error! Bookmark not defined.


Noiune de iniializare ............................................................................ Error! Bookmark not defined.
Crearea funciei de iniializare Direct3D ................................................ Error! Bookmark not defined.
Prelucrarea erorilor n DirectX ............................................................... Error! Bookmark not defined.
Rendering, sau desenarea n cadrul ferestrei a aplicaiei ...................... Error! Bookmark not defined.
Eliberarea resurselor, ocupate de Direct3D ........................................... Error! Bookmark not defined.

4.

Desenarea de obiecte 2D ....................................................................... Error! Bookmark not defined.


2

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

Etape ...................................................................................................... Error! Bookmark not defined.


Setarea formatului vertexurilor ............................................................. Error! Bookmark not defined.
Crearea bufferuluii vertexurilor ............................................................. Error! Bookmark not defined.
Renderingul obiectului ........................................................................... Error! Bookmark not defined.
Desenarea ptratului.............................................................................. Error! Bookmark not defined.
5.

Matrice n Direct3D ................................................................................ Error! Bookmark not defined.


Utilizarea matricelor............................................................................... Error! Bookmark not defined.
Matricea global..................................................................................... Error! Bookmark not defined.
Matricea de vizualizare (view matrix) .................................................... Error! Bookmark not defined.
Matricea de proiecie ............................................................................. Error! Bookmark not defined.

6.

Afiarea pe ecran a obiectului 3D .......................................................... Error! Bookmark not defined.


Crearea vertexurilor ............................................................................... Error! Bookmark not defined.
Matrice de transformri ......................................................................... Error! Bookmark not defined.
Desenarea cubului .................................................................................. Error! Bookmark not defined.
Indexarea vertexurilor ............................................................................ Error! Bookmark not defined.

7.

Bufferul de adncime (Z-buffer)............................................................. Error! Bookmark not defined.


Crearea bufferului de adncime ............................................................ Error! Bookmark not defined.
Legarea prilor ...................................................................................... Error! Bookmark not defined.

8.

Lumini i materiale ................................................................................. Error! Bookmark not defined.


Noiune de material ............................................................................... Error! Bookmark not defined.
Lumin .................................................................................................... Error! Bookmark not defined.
Normal .................................................................................................. Error! Bookmark not defined.
Iniializarea luminii i materialului ......................................................... Error! Bookmark not defined.

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

INTRODUCERE
Tehnologia DirectX de la corporaia Microsoft practic reprezint un standard de instrumente
pentru programarea graficii, mai ales jocurilor, pentru platforma Windows. Mai mult de 90%
jocuri computerizate se scriu n limbajul C++ cu utilizarea bibliotecii DirectX. mpreun cu
apariia primului sistem de operare grafic puternic Windows 95, corporaia Microsoft elaboreaz
paralel bibliotecile multimedia, cu ajutorul crora pot fi elaborate diferite aplicaii grafice.
Primul pachet instrumental se numea Game SDK. El a aprut aproximativ n acel timp, cnd
Windows 95 cucerea piaa mondial. Pachetul Game SDK a fost bazat pe grafic de rastru, n
acel moment nc nu existau video plci grafice 3D puternice. Pachetul susinea i sunetul i
uniti de intrare. Un an dup asta apar una dup alta versiunile DirectX 2 i DirectX 3, in
componena lor prezint i biblioteca Direct3D. Dup apariia sistemului Windows 98 biblioteca
DirectX a fost completat cu versiunile 5 i 6. n anul 1999 apare DirectX 7, care a semnalat
epoca noua de jocuri computerizate 3D. Peste un an se lanseaz DirectX 8, dup ce devine
evident n baz crui instrumentar trebuie de elaborat aplicaii grafice sub SO Windows. La
mijlocul anului 2003 a fost lansat versiunea noua la momentul respectiv DirectX 9.
n capitolul 1 se descriu bazele programrii sub SO Windows, se creeaz aplicaia de tip
fereastr. Aplicaia creat permanent va fi dezvoltat pe parcursul studierii a materialului.
Capitolul 2 reprezint o introducere n biblioteca DirectX. Aici sunt enumerate componentele
acestei bibliotecii, sunt descrise pe scurt tehnologiile utilizate la crearea DirectX. Sunt prezentate
informaii despre , Direct3D, conceptul de creare a scenelor n Direct3D. n sfrit, este
descris instalarea DirectX 9 SDK pe calculator.
n capitolul 3 sunt expuse informaii cheie despre etapa iniial de utilizare a Direct3D
iniializarea Direct3D, crearea dispozitivului Direct3D i reglarea dispozitivelor.
n capitolul 4 ce creeaz i se afieaz pe ecran una din cele mai simple figuri un triunghi
simplu. Se folosete bufferul vertexurilor i conveierul de randare. Astfel se obin informaii
principale despre geometria scenei n Direct3D.
Capitolul 5 este consacrat matricelor. Matricele joac un rol foarte important n Direct3D.
n capitolul 6 este examinat afiarea pe ecran unui obiect tridimensional adevrat. Este expus
conceptul de indexare a vertexurilor.
n capitolul 7 este descris bufferul de adncime. Sortarea pixelilor dup distana pn la
observator iat pentru ce este necesar bufferul de adncime, se mai numete i Z-buffer.
Capitolul 8 conine informaii despre materiale i lumini. Sunt descrise modele de iluminare,
informaii despre surse de lumin, principiile de interaciune a materialului cu iluminarea
obiectului. Anume n baza acestor principii se construiete percepia culorilor de ctre
observator. Tot n capitolul acesta sunt cercetai i vectori normali, care se folosesc la calcularea
iluminrii.
n capitolul 9 sunt descrise bazele ale texturrii. Se examineaz metoda standard de suprapunerea
texturilor pe obiect.
Capitolul 10 continu tema capitolului precedent prin expunerea materialului despre
multitexturare.
4

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

n capitolul 11 se descrie afiare de texte. Afiarea textului pe ecran este foarte important pentru
diferite aplicaii (de exemplu, jocuri). la sfritul capitolului se discut modul de trecere de la
aplicaia tip fereastr la aplicaia tip ecranul plin (fullscreen).

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

1. Bazele programrii sub Windows


Noiune de aplicaie tip fereastr
nainte de a ncepe programarea graficii cu DirectX 9, trebuie s elaborm carcasul programului,
care va crea suprafaa de lucru pentru aplicaia grafic 3D. Windows este un SO multitasking i
ceea ce vedem pe ecran al monitorului este aplicaia obinuit - tip fereastr. Dup ce vom crea
carcasul, putem s trecem la programarea graficii, desennd orice obiecte n cadrul aplicaiei
create. Deci scopul principal este scrierea codului ferestrei n baza cruia vor fi create toate
modificrile ulterioare. Conteaz i dimensiunea ferestrei a aplicaiei. Sunt dou moduri:
fullscreen i fereastr. n modul fereastr putem seta dimensiunile ferestrei, stilul i poziia pe
ecran. n modul fullscreen se indic rezoluia i frecvena de redesenare a ecranului. De la
nceput vom folosi numai modul fereastr. n capitolul 11 se examineaz trecerea la modul
fullscreen, care de fapt nu este complicat.

Crearea aplicaieiei n Visual C++ .NET


Pentru crearea aplicaiilor mediul de programare Visual C++ .NET conine mijloace incorporate.
Deschidem mediul de programere Visual ++ .NET i crem un proiect. Perntru aceasta
efectum urmtoarele aciuni:
1. File / New / Project. Apare caseta de dialog New Project;
2.

n caseta Project Types selectm Visual C++ Projects, iar n caseta Templates Win 32
Project;

3. n caseta Name scriem numele proiectului, de exemplu, Project1. n caseta Location


indicm mapa, n carea se va pstra proiectul creat;
4. OK.
Apre caseta de dialog Win 32 Application Wizard Project1 (fig. 1.1), n care trecem la pagina
Application Settigs i n reginea Additional options bifm opiunea Empty project. n regiunea
Application type selectm Windows application, dup ce apsm butonul Finish.
Astfel am creat o aplicaie vid obinuit, care nu are nici o linie de cod. Mai departe dezvoltm
aplicaia. Din partea stnga a ferestrei Visual C++. NET se afl panelul cu trei pagini: Solution
Explorer, Resourse View Class View. Dup selectarea paginii Solution Explorer, apare
arborele proiectului Project1. Dup apsarea butonului "+" pe lng numele proiectului se
desfoar ramura cu mape: Source File (fiiere cu cod, de regul au extensia c i/sau cpp) i
Header File (cu fiiere antet, de regul au extensia h).

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

Fig. 1.1. Caseta de dialog Win32 Application Wizard Project1


Inserm un fiier gol n mapa Source File. n el vom scrie codul programului. Pentru a insera un
fiier gol efectum urmtorii pai:
1. Executm clic drept pe iconia Source File, din meniul context selectm opiunea Add.
Apoi dup sgeat din meniul derulant alegem opiunea Add New Item. Pe ecran apare
caseta de dialog Add New Item - Project1 (fig. 1.2);

Fig. 1.2. Caseta de dialog Add New Item Project1


2. n caseta Templates selectm C++ File (.cpp);

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

3. n caseta Name scriem denumirea fiierului de creare, de exemplu, WindowsBazis.


Apsm butonul Add. Dup asta pa pagina Solution Explorer - Project1 n mapa Sourse
File va aprea fiierul gol WindowsBazis.cpp.

Modelul general de mesaje n Windows


Comunicarea Windows-ului cu aplicaiile se bazeaz pe modelul de evenimente. Orice aplicaie
tip windows n timpul vieii interacioneaz cu SO prin intermediul de mesaje.
Numrul de mesaje pot fi destul de mare. Pentru a sistematiza mesajele curente, exist aa
numit coad de evenimente. Ea este realizat n form de bucl obinuit. Fiecare din mesajele
aprute ateapt rndul su de prelucrare, dup ce se extrage de ctre SO Windows.. Pentru a
prelucra toate mesajele Windows dispune de un prelucrtor de mesaje pentru toate aplicaiile.
Modelul de interaciune aplicaiilor cu mesaje este prezentat schematic n fig. 1.3.

Aplicaia
fereastr 1

Coad
mesaje ap.1

Aplicaia
fereastr 2

Coad
evenimen.
Windows

Coad
mesaje ap.2

Fig. 1.3. Modelul de evenimente Windows


Reieind din acest model de evenimente, pentru a crea o aplicaie este necesar s crem o
fereastr i s pornim un prelucrtor de mesaje. Punctul de pornire a oricrei aplicaiei n
Windows este funcia WinMain(), n care se creeaz fereastra i se trateaz evenimentele. De
aceea, de la bun nceput, vom crea funcia WinMain(), n care vom descrie clasa
windowsclass, n care vom indica dimensiunea, stilul, culoarea, fundalul ferestrei viitoare.
Apoi vom crea fereastra cu funcia CreateWindowEx(). Apoi vom nregistra fereastra i vom
crea un prelucrtor de evenimente, n care vor fi transmise diferite mesaje.

Funcia principal WinMain()


n primul rnd conectm fiierul antet windows.h. El conine declaraiile claselor care sunt
necesare pentru a programa n mediul Windows:
#include <windows.h>
#include <tchar.h>

Fiierul antet tchar.h se folosete pentru utilizarea codului Unicod.


Apoi urmeaz funcia principal a tuturor aplicaiilor Windows: WinMain(). Antetul acestei
funcii este urmtorul:
int WINAPI WinMain(
HINSTANCE hinstance,
HINSTANCE hprevinstance,
8

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

LPSTR lpCmdLine,
int nCmdShow)

Funcia WinMain() are urmtorii parametri:


hinstance este descriptorul aplicaiei de creare, aa numitul handle. Descriptorul se
genereaz de ctre SO Windows pentru urmrirea ulterioar a aplicaiei. Altfel spus,
hinstance este un fel de etichet a aplicaiei i a ferestrei care se creeaz;
hprevinstance acest parametru deja nu se folosete. El provine de la SO Windows 3.1,
i a fost lsat pentru compatibilitate. Valoarea permanent a acestui parametru este 0;
lpCmdLine pointer la irul de comand, care urmeaz imediat dup numele comenzii care
se lanseaz;
nCmdShow indic aspectul ferestrei care se creeaz pe ecranul monitorului. Exist un ir
mare de flaguri, care descriu aspectul dorit al ferestrei, i care pot fi combinate pentru a crea
valoarea acestui parametru. Informaii suplimentare despre flagurile date pot fi gsite n
documentaia pentru Win32 API.
Cercetm clasa windowsclass.
Trebuie s descriem clasa ferestrei windowsclass. Clas este ceea ce ne permite s
difereniem aspectul i destinaia ferestrei. Diferite ferestre se difereniaz una de alta prin clas.
SO Windows are un set mare de astfel de clase predefinite. Ne rmne s pstrm n structura
windclassex informaii despre clasa windowsclass care se creeaz. Deci, crem clasa
windowsclass, care va rspunde de obinerea scopul formulat:
WNDCLASSEX windowsclass; // clasa ferestrei de creare

Declararea tipului structurat WINDCLASSEX, care este necesar pentru descrierea clasei, arat
astfel:
typedef struct _WNDCLASSEX
{
UINT cbSize;
UINT style;
WINDPOC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackgroung;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;

Cmpurile structurii au urmtoarea destinaie:


cbSize dimensiunea structurii care se creeaz. Paralel cu descrierea cmpurilor le vom
completa. Indicm dimensiunea structurei noastre:
9

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

windowsclass.cbSize=sizeof(WNDCLASSEX);

style conine combinaia flagurilor ce descriu stilul dorit al ferestrei. Combinarea se face
cu ajutorul operatorului sau pe bii "|". Completm cmpul style:
windowsclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;

Descriem flagurile utilizate (informaiile suplimentare pot fi luate din documentaia pentru Win
32):

CS_VREDRAW n cazul cnd se schimb nlimea ferestrei sau fereastra a fost deplasat,

este necesar redesenarea ferestrei n ntregime;

CS_HREDRAW n cazul cnd se schimb limea ferestrei sau fereastra a fost deplasat,

este necesar redesenarea ferestrei n ntregime;

CS_OWNDC pentru fiecare fereastr a clasei date se repartizeaz un context dispozitiv

propriu;

CS_DBLCLKS n cazul unui click dublu n cadrul ferestrei, ferestrei se transmit

informaii despre click dublu;


lpfnWndProc pointer la funcia principal de tratare a evenimentelor cu ordinea invers a
parametrilor (call back). Orice aplicaie n Windows conine bucla de prelucrare a
evenimentelor. n bucla respectiv se apeleaz funcia MainwinProc(), de aceea scriem:
windowsclass.lpfnWndProc=MainWinProc;

cmpurile cbClsExtra i cbWndExtra, sunt destinate pentru pstrare informaiilor


suplimentare. Cmpurile acestea se folosesc rar, mai ales la programare cu DirectX. De aceea
scriem:
windowsclass.cbClsExtra=0, windowsclass.cbWndExtra=0;

hInstance cmpul acesta rspunde de exemplarul aplicaiei care se creeaz i se


transmite funciei WinMain():
windowsclass.hInstance=hinstance;

hIcon definete pictograma aplicaiei. Cu ajutorul funciei LoadIcon() putem ncrca o


pictogram proprie, sau o pictogram de sistem. Antetul funciei LoadIcon() este
urmtorul:
HICON LoadIcon(HINSTANCE hInstance, LPCTSTR LpIconName)

Descriem parametrii acestei funcii:

hInstance exemplarul aplicaiei. Pentru a ncrca o pictogram standard, se folosete


valoarea NULL;

LpIconName identificatorul resursei de tip pictogram care se ncarc. Vom folosi


pictograma standard IDI_APPLICATION pictograma care se folosete implicit pentru

aplicaii. Exist o sumedenie de identificatori pentru ncrcarea diferitelor pictograme.


Exist posibilitatea crerii unei pictograme proprii pentru a nlocui pictograma de sistem.
Avnd antetul funciei LoadIcon(), vom scrie:
windowsclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
10

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

hCursor cmpul acesta rspunde de utilizarea cursorului. Dup utilizare cmpul acesta
este asemntor cu cel precedent hIcon. Se difer numele funciei care ncarc cursorul.
Vom scrie:
windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);

Cursorul standard are form de sgeat mic i identificatorul IDC_ARROW. Asemenea


pictogramelor, exist un set de identificatori de cursoare (programatorul poate s elaboreze
cursoare proprii);
hbrBackgroung culoarea de fundal al ferestrei. Pentru a colora fundalul cu o culoare
ptandard predefinit se folosete funcia GetStockObject(). Funcia are un singur
parametru flagul care seteaz culoarea pensulei de umplere. Pentru umplerea fundalului cu
culoare sur scriem:
windowsclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);

Putem s ncercm s colorm fundalul cu o alt culoare, totui pentru DirectX aceasta nu are
nici o nsemntate, fiindc pentru asta sunt definite mijloacele proprii. Totui mai descriem
cteva pensule de diferite culori:

GRAY_BRUSH umplerea cu pensula de culoare sur;

BLACK_BRUSH pensula neagr;

WHITE_BRUSH pensula alb;

LTGRAY_BRUSH pensula de culoare sur deschis;

DKGRAY_BRUSH pensula de culoare sur nchis;

HOLLOW_BRUSH pensula transparent (fr umplere);

lpszMenuName cmpul destinat pentru conectarea unui meniu la fereastra aplicaiei.


Valoarea NULL indic c aplicaia nu va avea meniul:
windowsclass.lpszMenuName=NULL;

lpszClassName indic numele clasei de descriere a ferestrei aplicaiei de creare. Pot


exista simultan (de obicei aa i este) cteva aplicaii, la crearea crora s-a folosit una i
aceeai clasa windowsclass, iar sistemul de operare trebuie cumva s le deosebeasc.
Anume pentru asta se folosete cmpul acesta. Aici putem indica o denumire arbitrar,
principalul s inem cont de ea (s nu ne ncurcm n ele dac vom avea mai multe denumiri):
windowsclass.lpszClassName=_T("WINDOWSCLASS");

hIconSm descriptorul pictogramei mici, care se afieaz pe bara de taskuri sau n antetul
ferestrei aplicaiei. Vom folosi pictograma standard. Pentru asta vom scrie:
windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);

Astfel, completarea tuturor cmpurilor structurii va arta aa:


WNDCLASSEX windowsclass; //
windowsclass.cbSize=sizeof(WNDCLASSEX);
windowsclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
windowsclass.lpfnWndProc=MainWinProc;
11

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

windowsclass.cbClsExtra=0;
windowsclass.cbWndExtra=0;
windowsclass.hInstance=hinstance;
windowsclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
windowsclass.lpszMenuName=NULL;
windowsclass.lpszClassName=_T("WINDOWSCLASS");
windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);

Dup ce am completat i am salvat n structura windowsclass toate valorile, clasa


windowsclass trebuie s fie nregistrat. Aceasta se face cu funcia RegisterclassEx().
Parametrul funciei reprezint adresa structurii cu descrierea clasei. Pentru orice aplicaie care se
creeaz, clasa poate fi nregistrat doar o singur dat:
if(!RegisterClassEx(&windowsclass)) // nregistrm clasa creat
return 0;

Crem fereastra.
Dup ce am nregistrat clasa, putem s crem fereastra. Aceasta se face cu funcia
CreateWindowEx(), care are urmtorul antet:
HWND CreateWindowEx(
DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int X,
int Y,
int nWidth,
int nHeight,
HWND hWindParent,
HWND hMenu,
HINSTANCE hInstance,
LPVOID lpParam);

Parametrii funciei CreateWindowEx() sunt:


dwExStyle flagul stilurilor ferestrei. Se folosete rar. n majoritatea de cazuri se folosete
valoarea WS_EX_TOPMOST, ceea ce indic c fereastra aplicaiei va aprea deasupra celorlalte
ferestre. Valoarea NULL ignoreaz acest parametru;
lpClassName denumirea clasei ferestrei care se creeaz. n cazul nostru este
WINDOWSCLASS;
lpWindowName antetul ferestrei. De obicei textul antetului corespunde sensului aplicaiei,
de exemplu, "Fereastra de baz pentru DirectX";
dwStyle combinaia flagurilor ce descriu stilul i comportarea ferestrei ce se creeaz.
Exist un set de astfel de flaguri. Iat careva din ele:

WS_OVERLAPPED fereastra cu o linie de antet i o margine;


12

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

WS_VISIBLE fereastra va fi vizibil din start;

WS_CAPTION fereastra cu o linie de antet (include n sine stilul WS_BORDER);

WS_BORDER fereastra cu o margine subire;

WS_ICONIC fereastra va fi minimizat din start;

WS_OVERLAPPEDWINDOW fereastra cu suprapunere (include n sine urmtoarele 6


stiluri:
WS_OVERLAPPED,
WS_CAPTION,
WS_SYSMENU,
WS_THICKFRAME,
WS_MINIMIZEBOX i WS_MAXIMIZEBOX) este un flag destul de funcional. Anume

acest flag vom folosi pentru fereastra aplicaiei noastre;

WS_MINIMIZE fereastra va fi minimizat din start;

WS_MAXIMIZE fereastra va fi maximizat din start;

WS_MAXIMIZEBOX fereastra cu butonul Maximize (se folosete numai cu stilul


WS_SYSMENU);

WS_MINIMIZEBOX fereastra cu butonul Minimize (se folosete numai cu stilul


WS_SYSMENU);

X, Y poziia iniial a colului stnga sus n pixeli. Se poate de indicat coordonatele prin
utilizarea flagului CW_USEDEFAULT, lsnd astfel valorile implicite. Vom folosi pentru X
valoarea 300, iar pentru Y valoare 150, setnd astfel coordonatele colului stnga sus n
pixeli;
nWidth i nHeight limea i respectiv nlimea ferestrei n pixeli. Se poate de folosit
valorile implicite cu ajutorul flagului CW_USEDEFAULT, sau de indicat valorile concrete, de
exemplu, 500400 pixeli;
hWindParent descriptorul ferestrei printe. Dac fereastra printe nu este, se folosete
valoarea NULL;
hMenu descriptorul meniului, adic dac aplicaia are un meniu, poate fi indicat
descriptorul acestui meniu i meniul va fi conectat la fereastra aplicaiei. dac meniul
lipsete, atunci valoarea parametrului se pune pe NULL;
hInstance exemplarul aplicaiei. Folosete valoarea hinstance pasat funciei
WinMain();
lpParam pointerul la datele ferestrei, de obicei are valoarea NULL.
Acum toate valorile ale parametrilor funciei sunt cunoscute. Pentru a crea fereastra, declarm
descriptorul ferestrei i apelm funcia CreateWindowEx():
HWND hwnd; // descriptorul ferestrei
if(!(hwnd=CreateWindowEx(
NULL, // stilul ferestrei
_T("WINDOWSCLASS"), // numele clasei
_T("Fereastr de baz pentru DirectX"), // antetul ferestrei
13

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

//
//

WS_OVERLAPPEDWINDOW|WS_VISIBLE, //
0, 0, // colul stnga sus
CW_USEDEFAULT, 0, // colul stnga sus
500, 400, // limea i nlimea ferestrei
CW_USEDEFAULT, 0, // limea i nlimea ferestrei
NULL, // descriptoruil ferestrei printe
NULL, // descriptorul meniului
hinstance, // descriptorul aplicaiei
NULL))) // pointerul la datele ferestrei
return 0;

Cu ajutorul instruciunii if se prelucreaz erorile.


Dup ce fereastra a fost creat, ea trebuie s fie afiat explicit pe ecran i rennoit. Lucrul
acesta se face prin dou funcii:
ShowWindow(hwnd, SW_SHOWDEFAULT); // afim fereastra
UpdateWindow(hwnd); // rennoim fereastra

Tratarea evenimentelor n Windows


n SO Windows evenimentele legate de aplicaia trebuie prelucrate cu prelucrtorul de
evenimente al acestei aplicaiei. Pentru fiecare clas poate fi definit unul sau mai muli
prelucrtori proprii de evenimente. Astfel se mbuntete funcionalitatea programului. n timp
ce lucreaz orice aplicaie se genereaz o sumedenie de diferite mesaje. Ele se pun la coad.
Evenimentele legate de fereastra aplicaiei noastre, nimeresc n seciunea coii care se refer
anume la fereastra noastr. Dup aceasta prelucrtorul de evenimente principal extrage mesajul
de rnd si l transmite funciei MainWinProc() pentru prelucrarea ulterioar. Cu evenimentele
pentru care nu este asignat prelucrtorul, se ocup nsui SO Windows.
Cercetm antetul funciei MainWinProc():
LRESULT CALLBACK MainWinProc(
HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)

Funcia MainWinProc() are urmtorii parametri:


hwnd descriptorul ferestrei. Se folosete pentru a afla de la care fereastr a venit mesajul n
cazul cnd sunt deschise simultan mai multe ferestre ale uneia i aceeai clas;
msg identificatorul evenimentului, care este transmis funciei MainWinProc() pentru
prelucrare;
wparam i lparam parametrii suplimentari la evenimentul dat. La elaborarea
prelucrtorului de evenimente, de obicei, se folosete construcia switch(msg). Dup
analiza identificatorului msg, pot fi utilizate informaiile suplimentare transmise prin
parametrii wparam i lparam.
WM_PAINT mesagul acesta se trimite atunci cnd se cere redesenare ferestrei n ntregime
(de exepmplu, fereastra a fost deplasat, fereastra a fost mrit, etc.);
14

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

WM_DESTROY mesajul acesta se trimite de ctre SO Windows atunci cnd fereastra trebuie
s fie nchis. Mesajul acesta comunic c trebuie de eliberat toate resursele ocupate de ctre
aplicaia;
WM_QUIT dup eliberarea resurselor se genereaz mesajul acesta care va aduce la
nchiderea aplicaiei.
Ca rezultat obinem funcia MainWinProc():
LRESULT CALLBACK MainWinProc(HWND hwnd, // descriptorul ferestrei
UINT msg, // identificat. evenimentului
WPARAM wparam, // informaii suplimentare
LPARAM lparam) // informaii suplimentare
{
switch(msg)
{
//
case WM_PAINT:
ValidateRect(hwnd, NULL);
break;
//
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}

Apelul PostQuitMessage(0) pune la coad mesajul WM_QUIT, care va nchide aplicaia


noastr. WM_QUIT se aplic nemijlocit n prelucrtorul de evenimente principal. Funcia
DefWindowProc() prelucreaz implicit acele mesaje pe care nu le prelucreaz aplicaia
noastr.

Prelucrtorul principal de evenimente


Cercetm prelucrtorul principa de evenimente, care deocamdat va arta astfel:
MSG msg; // indicatorul de mesaj
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); // transferul introducerii de la tastat.
DispatchMessage(&msg); // prelucrarea i pasarea mesajelor
// funciei MainWinProc()
}
return msg.wParam;

Antetul funciei GetMessage() arat astfel:


BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFiltrenMin,
15

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

UINT wMsgFiltrenMax)

Parametrii funciei GetMessage() sunt:


lpMsg poiner la structura care este responsabil de mesaje;
hWnd descriptorul ferestrei care se creaz;
wMsgFiltrenMin primul mesaj ajuns la prelucrarea;
wMsgFiltrenMax ultimul mesaj de prelucrare.
Bucla while se execut atta timp ct funcia GetMessage() ntoarce valoarea diferit de zero.
Corpul buclei este simplu: la apariia mesajului din coada mesajelor, mesajul se prelucreaz cu
funcia TranslateMessage() i se transmite funciei DispatchMessage(), care pentru
prelucrarea apeleaz funcia MainWinProc(), trnsmiind ultimei toate informaiile necesare.
Pentru compilarea codului iniial, aflndu-ne n caseta de dialog cu proiectul deschis Project1,
selectm sau simplu deschidem WindowsBazis.cpp. Apoi apsm tasta <Ctrl> i reinnd-o,
apsm tasta <F7>. se va compila codul iniial din fiierul WindowsBazis.cpp. Apoi apsm
tasta <F7> se va executa editare legturilor. Pentru a vedea rezultatul folosim combinaia de
taste <Ctrl>+<F5>. Fereastra creat de programul este prezentat n fig. 1.4.

Fig. 1.4. Fereastra de baz pentru DirectX


Astfel am creat o aplicaie simpl tip fereastr, n care mai departe vom integra codul propriu,
utiliznd funciile bibliotecii DirectX 9. Cum a fost artat, aplicaia poate fi creat cu setarea
16

Grafica 3D (Suport de curs n baza Direct3D), S.Pereteatcu, A.Pereteatcu

proprietilor necesare. Mai departe va fi descris conceptul de creare a scenei n DirectSD, va fi


abordat tehnologia , pe platforma creia se bazeaz toat biblioteca DirectX.

17

S-ar putea să vă placă și