Documente Academic
Documente Profesional
Documente Cultură
Grafica Direct X USM
Grafica Direct X USM
DirectX (de la engl. direct — direct, nemijlocit) — este un set de API, elaborat pentru rezolvarea
problemelor legate de programare sub Microsoft Windows. Cel mai larg se foloseşte pentru
scrierea jocurilor pe calculator. Pachetul instrumental DirectX pentru Microsoft Windows este
disponibil gratis pe siteul companiei Microsoft. De obicei cu versiunile reînoite DirectX sunt
dotate aplicaţii noi de joc.
4.05.00.0155
DirectX 4.0 Accesibil ca beta pentru Windows NT 4.0 16 iulie 1997
(RC55)
4.05.01.1721 /
DirectX 5.0 Windows 98 5 mai 1998
1998
4.06.02.0436
DirectX 6.1 Windows 95/98/98SE 3 febr 1999
(RC0)
4.07.00.0700
DirectX 7.0 Windows 2000 şi Windows ME 22 septemb 1999
(RC1)
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
4.07.00.0716
DirectX 7.0a Windows 95/98/98SE/2000 1999
(RC1)
4.08.00.0400
DirectX 8.0 Windows 95/98/98SE/ME/2000 30 septemb 2000
(RC10)
4.08.01.0810
DirectX 8.1 4.08.01.0881 Windows XP 8 noiemb 2001
(RC7)
4.08.02.0134
DirectX 8.2 ???,2002
(4.09.0000.0134)
4.09.0000.0902
DirectX 9.0b 13 августа2003
(RC2)
DirectX 10 (inclus în
Prima versiunea Windows Vista. Informaţii
componenţa Windows 6.0.6000.16386 10 noiemb 2006
despre Direct3D10
Vista)
DirectX 12 (inclus în
componenţa Windows Windows 10 29 iulie 2015
10)
2
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
Pentru crearea aplicaţiilor mediul de programare Visual C++ .NET conţine mijloace incorporate.
Deschidem mediul de programere Visual С++ .NET şi creăm un proiect. Perntru aceasta
efectuăm următoarele acţiuni:
2. În caseta Project Types selectăm Visual C++ Projects, iar în caseta Templates — Win 32
Project;
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 bifăm opţiunea Empty project. În regiunea
Application type selectăm Windows application, după ce apăsăm butonul Finish.
Astfel am creat o aplicaţie vidă obişnuită, care nu are nici o linie de cod. Mai departe dezvoltăm
aplicaţia. Din partea stânga a ferestrei Visual C++. NET se află panelul cu trei pagini: Solution
Explorer, Resourse View şi Class View. După selectarea paginii Solution Explorer, apare
arborele proiectului Project1. După apăsarea butonului "+" pe lângă numele proiectului se
desfăşoară ramura cu mape: Source File (fişiere cu cod, de regulă au extensia c şi/sau cpp) şi
Header File (cu fişiere antet, de regulă au extensia h).
3
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
Inserăm un fişier gol în mapa Source File. În el vom scrie codul programului. Pentru a insera un
fişier gol efectuăm următorii paşi:
1. Executăm clic drept pe iconiţa Source File, din meniul context selectăm opţiunea Add.
Apoi după săgeată din meniul derulant alegem opţiunea Add New Item. Pe ecran apare
caseta de dialog Add New Item - Project1 (fig. 1.2);
4
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
Numărul de mesaje pot fi destul de mare. Pentru a sistematiza mesajele curente, există aşa
numită coadă de evenimente. Ea este realizată în formă de buclă obişnuită. Fiecare din mesajele
apărute aşteaptă rândul său de prelucrare, după ce se extrage de către SO Windows.. Pentru a
prelucra toate mesajele Windows dispune de un prelucrător de mesaje pentru toate aplicaţiile.
Modelul de interacţiune aplicaţiilor cu mesaje este prezentat schematic în fig. 1.3.
Aplicaţia Aplicaţia
fereastră 1 fereastră 2
Coadă
Coadă Coadă
evenimen.
mesaje ap.1 mesaje ap.2
Windows
Reieşind din acest model de evenimente, pentru a crea o aplicaţie este necesar să creăm o
fereastră şi să pornim un prelucrător de mesaje. Punctul de pornire a oricărei aplicaţiei în
Windows este funcţia WinMain(), în care se creează fereastra şi se tratează evenimentele. De
aceea, de la bun început, vom crea funcţia WinMain(), în care vom descrie clasa
windowsclass, în care vom indica dimensiunea, stilul, culoarea, fundalul ferestrei viitoare.
Apoi vom crea fereastra cu funcţia CreateWindowEx(). Apoi vom înregistra fereastra şi vom
crea un prelucrător de evenimente, în care vor fi transmise diferite mesaje.
În primul rând conectăm fişierul antet windows.h. El conţine declaraţiile claselor care sunt
necesare pentru a programa în mediul Windows:
#include <windows.h>
#include <tchar.h>
Apoi urmează funcţia principală a tuturor aplicaţiilor Windows: WinMain(). Antetul acestei
funcţii este următorul:
int WINAPI WinMain(
HINSTANCE hinstance,
HINSTANCE hprevinstance,
5
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
LPSTR lpCmdLine,
int nCmdShow)
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. Informaţii suplimentare despre flagurile date pot fi găsite în
documentaţia pentru Win32 API.
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;
windowsclass.cbSize=sizeof(WNDCLASSEX);
style — conţine combinaţia flagurilor ce descriu stilul dorit al ferestrei. Combinarea se face
cu ajutorul operatorului sau pe biţi "|". Completăm câmpul style:
windowsclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
Descriem flagurile utilizate (informaţiile suplimentare pot fi luate din documentaţia pentru Win
32):
CS_VREDRAW — în cazul când se schimbă înălţimea ferestrei sau fereastra a fost deplasată,
este necesară redesenarea ferestrei în întregime;
CS_HREDRAW — în cazul când se schimbă lăţimea ferestrei sau fereastra a fost deplasată,
este necesară redesenarea ferestrei în întregime;
hCursor — câmpul acesta răspunde de utilizarea cursorului. După utilizare câmpul acesta
este asemănător cu cel precedent hIcon. Se diferă numele funcţiei care încarcă cursorul.
Vom scrie:
windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);
Putem să încercăm să colorăm fundalul cu o altă culoare, totuşi pentru DirectX aceasta nu are
nici o însemnătate, fiindcă pentru asta sunt definite mijloacele proprii. Totuşi mai descriem
câteva pensule de diferite culori:
hIconSm — descriptorul pictogramei mici, care se afişează pe bara de taskuri sau în antetul
ferestrei aplicaţiei. Vom folosi pictograma standard. Pentru asta vom scrie:
windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
8
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);
Creăm fereastra.
După ce am înregistrat clasa, putem să creăm fereastra. Aceasta se face cu funcţia
CreateWindowEx(), care are următorul 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);
X, Y — poziţia iniţială a colţului stânga sus în pixeli. Se poate de indicat coordonatele prin
utilizarea flagului CW_USEDEFAULT, lăsând astfel valorile implicite. Vom folosi pentru X
valoarea 300, iar pentru Y – valoare 150, setând astfel coordonatele colţului stânga sus în
pixeli;
hMenu — descriptorul meniului, adică dacă aplicaţia are un meniu, poate fi indicat
descriptorul acestui meniu şi meniul va fi conectat la fereastra aplicaţiei. dacă meniul
lipseşte, atunci valoarea parametrului se pune pe NULL;
Acum toate valorile ale parametrilor funcţiei sunt cunoscute. Pentru a crea fereastra, declarăm
descriptorul ferestrei şi apelăm funcţia CreateWindowEx():
HWND hwnd; // descriptorul ferestrei
if(!(hwnd=CreateWindowEx(
NULL, // stilul ferestrei
_T("WINDOWSCLASS"), // numele clasei
_T("Fereastră de bază pentru DirectX"), // antetul ferestrei
10
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
WS_OVERLAPPEDWINDOW|WS_VISIBLE, //
0, 0, // colţul stânga sus
// CW_USEDEFAULT, 0, // colţul stânga sus
500, 400, // lîţimea şi înălţimea ferestrei
// CW_USEDEFAULT, 0, // lîţimea şi înălţimea ferestrei
NULL, // descriptoruil ferestrei pîrinte
NULL, // descriptorul meniului
hinstance, // descriptorul aplicaşiei
NULL))) // pointerul la datele ferestrei
return 0;
După ce fereastra a fost creată, ea trebuie să fie afişată explicit pe ecran şi reînnoită. Lucrul
acesta se face prin două funcţii:
ShowWindow(hwnd, SW_SHOWDEFAULT); // afişăm fereastra
UpdateWindow(hwnd); // reînnoim fereastra
hwnd — descriptorul ferestrei. Se foloseşte pentru a afla de la care fereastră a venit mesajul în
cazul când sunt deschise simultan mai multe ferestre ale uneia şi aceeaşi clasă;
WM_PAINT — mesagul acesta se trimite atunci când se cere redesenare ferestrei în întregime
(de exepmplu, fereastra a fost deplasată, fereastra a fost mărită, etc.);
11
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
WM_DESTROY — mesajul acesta se trimite de către SO Windows atunci când fereastra trebuie
să fie închisă. Mesajul acesta comunică că trebuie de eliberat toate resursele ocupate de către
aplicaţia;
12
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
UINT wMsgFiltrenMax)
Bucla while se execută atâta timp cât funcţia GetMessage() întoarce valoarea diferită de zero.
Corpul buclei este simplu: la apariţia mesajului din coada mesajelor, mesajul se prelucrează cu
funcţia TranslateMessage() şi se transmite funcţiei DispatchMessage(), care pentru
prelucrarea apelează funcţia MainWinProc(), trnsmiţind ultimei toate informaţiile necesare.
Pentru compilarea codului iniţial, aflându-ne în caseta de dialog cu proiectul deschis Project1,
selectăm sau simplu deschidem WindowsBazis.cpp. Apoi apăsăm tasta <Ctrl> şi reţinând-o,
apăsăm tasta <F7>. se va compila codul iniţial din fişierul WindowsBazis.cpp. Apoi apăsăm
tasta <F7> — se va executa editare legăturilor. Pentru a vedea rezultatul folosim combinaţia de
taste <Ctrl>+<F5>. Fereastra creată de programul este prezentată în fig. 1.4.
Astfel am creat o aplicaţie simplă tip fereastră, în care mai departe vom integra codul propriu,
utilizând funcţiile bibliotecii DirectX 9. Cum a fost arătat, aplicaţia poate fi creată cu setarea
13
Grafica 3D (Suport de curs în baza Direct3D), S.Pereteatcu, A.Pereteatcu
14