inicializálás directdraw

Ez a könyv azzal kezdődik, az a tény, hogy milyen más könyveket általában véget ért. Megbeszéljük az alapokat a DirectDraw, de csak általánosságban. Reader - egy tapasztalt programozó, de nem ismerik a DirectDraw - képes lesz, hogy menjen fel a sebességet. Aztán lépni más téma érdekes, mint hasznos.

E könyv - tanítani, dolgozni DirectDraw, ahelyett, hogy valamilyen „strukturális keretet” vagy nem szabványos API, amely elvégzi a munkát. Demo programok C ++ nyelven íródott, és használja MFC, de nem azért, hogy elrejtse az összes technikai részleteket. C ++ és az MFC - kiváló eszközöket, mert ezek segítségével bármely alkalmazás írhat számos különböző módon. Példák erre a könyvet írta, hogy ugyanabban az időben strukturált és könnyen olvasható projektek, amelyek azt bizonyítják, hogy és miért történik a programban.

Ezen kívül DirectDraw, sok esetben alkalmazott DirectInput könyvtárban. Szigorúan véve, programozás során a grafikus Windows, meg tudod csinálni anélkül, hogy a DirectInput, de ez még mindig érdemes kihasználni. Úgy működik, mint a hagyományos eszközök gyorsabb a Windows I. és is szerepel a DirectX, így dolgozni nem igényel semmilyen további SDK.

Könyv: Graphics for Windows-eszközök DirectDrawot

inicializálása DirectDraw

Szakaszok ezen az oldalon:

A tényleges létrehozása ablak (hívás CreateEx () függvény) miatt a Windows, hogy küldjön egy üzenetet, hogy a kérelem WM_CREATE. Class DirectDrawWin elcsípi ezt az üzenetet kezelő OnCreate (). által létrehozott ClassWizard (lásd. Listing 3.1).

Listing 3.1. Funkció DirectDrawWin :: OnCreate ()

int DirectDrawWin :: OnCreate (LPCREATESTRUCT) DirectDrawEnumerate (DriverAvailable, e);
if (totaldrivers == 0) AfxMessageBox ( "Nem DirectDraw vezetők észlelt");
vissza -1;
>
int driverindex = SelectDriver ();
if (driverindex<0) TRACE("No DirectDraw driver selectedn");
vissza -1;
> Else if (driverindex> totaldrivers-1) AfxMessageBox ( "Érvénytelen DirectDraw selectedn");
vissza -1;
>
LPDIRECTDRAW ddraw1;
DirectDrawCreate (illesztőprogram [driverindex] .guid, ddraw1, 0);
HRESULT R;
r = ddraw1-> QueryInterface (IID_IDirectDraw2, (void **) ddraw2);
ha (r = S_OK!) AfxMessageBox ( "DirectDraw2 interfész nem támogatott");
vissza -1;
>
ddraw1-> Release (), ddraw1 = 0;
ddraw2-> SetCooperativeLevel (GetSafeHwnd (), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX);
ddraw2-> EnumDisplayModes (0, 0, ez az, DisplayModeAvailable);
qsort (displaymode, totaldisplaymodes, sizeof (DisplayModeInfo), CompareModes);
int initmode = SelectInitialDisplayMode ();
ha (ActivateDisplayMode (initmode) == FALSE) visszatérési -1;
vissza 0;
>

Minden inicializálása DirectDraw fut a OnCreate () függvény (a támogatást a számos kiegészítő funkciók). Az inicializálási folyamat áll hét szakaszból áll:

• Kap egy listát az összes DirectDraw járművezetők.

• Választható DirectDraw járművezetők.

• Előkészítés DirectDraw a kiválasztott illesztőprogram.

• Készítsen egy alkalmazás felületén.

Mindezek a lépések tárgyalja a következő részekben.

Első DirectDraw illesztőprogramok listája

DirectDrawEnumerate () függvény két paramétert: a mutató közvetett hívja a (callback) függvény, és egy mutatót az adatokat, alkalmazásával meghatározott, melyek végül ezt a funkciót, hogy hívják. Esetünkben az érvek hallgatólagosan hívott függvény DriverAvailable () és egy mutatót DirectDrawWin osztály (this). DriverAvailable () függvény meghatározása a következő:

BOOL WinAPI DirectDrawWin :: DriverAvailable (LPGUID guid, LPSTR desc, LPSTR nevét, LPVOID p) DirectDrawWin * win = (DirectDrawWin *) p;
ha (win-> totaldrivers> = MAXDRIVERS) vissza DDENUMRET_CANCEL;
DriverInfo info = win-> vezető [win-> totaldrivers];
ha (GUID) info.guid = (GUID *) új byte [sizeof (GUID)];
memcpy (info.guid, GUID, sizeof (GUID));
> Else info.guid = 0;
info.desc = StrDup (desc);
info.name = StrDup (név);
win-> totaldrivers ++;
visszatérés DDENUMRET_OK;
>

Először is, egy mutatót a feltárt adatok alkalmazás (p), átalakítható egy mutatót az osztály DirectDrawWin (win). Mivel a függvény DriverAvailable () nyilvánították statikus (közvetve az úgynevezett funkciókra van szükség, hogy statikus), akkor ellentétben a szokásos osztály funkciók nem vonatkoznak azok a szabályok automatikus hozzáférést; illetve hozzáférést változók és függvények végrehajtásához szükséges az osztály nyer egy mutatót.

DirectDraw jelentése DriverAvailable () függvény egyszer minden egyes detektált vezető. Minden alkalommal, amikor egy hívást a három információs objektum: GUID, leírása és neve. GUID (globálisan egyedi azonosító) egyedileg azonosítja a járművezetőt. Leírás és neve a húrok informális azonosítása a vezető. DriverAvailable () függvény információt tárol minden járművezető a tömb nevével vezető és figyeli a járművezetők számát a változó totaldrivers. Végül DriverAvailable () függvény DDNUMRET_OK. jelezve, hogy az átruházás a járművezetők folytatni kell. Kézhezvételét követően a visszatérési kód DDENUMRET_CANCEL DirectDraw leállítja az átvitelt.

Az illesztőprogram

Miután az összes DirectDraw fog szerepelni, OnCreate () függvény kiválasztja az egyiket. Kiválasztása, az alapértelmezett meghajtó felülírható származtatott osztályokban keresztül virtuális SelectDriver () függvényt. Visszatérve Listing 3.1, azt látjuk, hogy a visszaadott érték SelectDriver (). Ezt használják a vezető az indexelt tömb (kezdve a nulla és az index értéke). Az index azt mutatja, egy GUID (és így, a vezető) kell használni inicializálni DirectDraw. Version SelectDriver () osztályába DirectDrawWin néz ki:

virtuális int SelectDriver () visszatérő 0;
>

int bounceWin :: SelectDriver () int numdrivers = GetNumDrivers ();
ha (numdrivers == 1) return 0;
CArray járművezetők
A (int i = 0; i GetDriverInfo (i, 0 desc, név);
drivers.Add (desc);
>
DriverDialog dialógus
dialog.SetContents (vezetők);
ha (dialog.DoModal () = IDOK!) visszatérési -1;
vissza dialog.GetSelection ();
>

Ez a funkció először meghatározza száma észlelt illesztőprogramok GetNumDrivers () függvény. amely egyszerűen visszaadja az értékét a saját változó totaldrivers. Ha a rendszer már csak egy driver, nincs szükség a menü megjelenítéséhez, így a függvény 0-t kell használni az elsődleges meghajtó.

Osztályba tartozó származó DirectDrawWin. képes felismerni SelectDriver () függvény más módon. Itt jelen a megvalósítás egyszerű és rugalmas, de érdemes elindítani meghajtó és ellenőrizze az adott lehetőségeket. Egyes alkalmazások SelectDriver () függvény is használható, hogy kiválassza a vezetők, legjobban megfelel a megadott feltételeknek.

inicializálása DirectDraw

A harmadik feladat, funkció végrehajtásához OnCreate (), - inicializálás DirectDraw. Megint idézem részlet listában 3.1:

LPDIRECTDRAW ddraw1;
DirectDrawCreate (illesztőprogram [driverindex] .guid, ddraw1, 0);
HRESULT R;
r = ddraw1-> QueryInterface (IID_IDirectDraw2, (void **) ddraw2);
ha (r = S_OK!) AfxMessageBox ( "DirectDraw2 interfész nem támogatott");
vissza -1;
>
ddraw1-> Release (), ddraw1 = 0;
ddraw2-> SetCooperativeLevel (GetSafeHwnd (), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX);

inicializálás directdraw

Ábra. 3.9. A párbeszédablak a meghajtó kiválasztásával

Miután a DirectDraw interfész inicializálása, akkor lehet használni ahhoz, hogy egy mutatót DirectDraw2 felület. Ehhez hívja meg a függvényt QueryInterface (), és adja át GUID DirectDraw2 felület. egyes megnevezett IID_IDirectDraw2. Ha a hívás QueryInterface () nem működik, a program megjelenít egy párbeszédpanelt, majd kilép. Sőt, mi jelenlétét igényli DirectX könyvtár 2 vagy magasabb verziója (mert DirectDraw2 felület először a DirectX 2). Ha a hívás QueryInterface () sikeres, ddraw1 mutató felszabadul. Felváltva hívja funkciók és interfészek DirectDrawot DirectDraw2 nem ajánlott, ezért a kiadás a mutatót a DirectDraw felület biztosítja, hogy a többi kódot csak DirectDraw2 felület kerül alkalmazásra.

HRESULT WinAPI DirectDrawWin :: DisplayModeAvailable (LPDDSURFACEDESC desc, LPVOID p) DirectDrawWin * win = (DirectDrawWin *) p;
int count = win-> totaldisplaymodes;
if (számítanak == MAXDISPLAYMODES) visszatér DDENUMRET_CANCEL;
win-> displaymode [count] .width = desc-> dwWidth;
win-> displaymode [count] .height = desc-> dwHeight;
win-> displaymode [count] .depth = desc-> ddpfPixelFormat.dwRGBBitCount;
számolni ++;
visszatérés DDENUMRET_OK;
>

virtuális int SelectInitialDisplayMode () = 0;

int BounceWin :: SelectInitialDisplayMode () int i, nummodes = GetNumDisplayModes ();
DWORD W, H, d;
for (i = 0; i ha (w == desiredwidth h == desiredheight d == desireddepth) visszatérési i;
>
for (i = 0; i> nummodes; i ++) GetDisplayModeDimensions (i, W, H, d);
ha (d == desireddepth) visszatérési i;
>
vissza 0;
>

Az utolsó előtti szakaszon aktiválja a kiválasztott üzemmódot. Erre a célra ActivateDisplayMode () függvényt. ami valójában végzi az utolsó szakaszban (létrehozása az alkalmazás felületét). A kódex ezt a funkciót lista mutatja a 3.2.

Listing 3.2. ActivateDisplayMode () funkció