LECKÉK:              

Saját ablak

Directdraw1

Directdraw 2

Directdraw_3

Üdvözöllek!

Most,hogy van direcx felületünk,de még nem látszik, nekifoghatunk az osztály fejlesztéséhez.

mindenek előtt azonban kell egy struktúrát létrehozni, aminek 3 tagja lesz:

 LPDIRECTDRAWSURFACE7 tipusú mutató a betöltött kép memória címének,

egy int sor és egy int oszlop  változónak, hogy eltárolja a betöltött kép szélességét és magasságát.

Tehát a rajz.hpp-ben valahol a dekralációk felett írd be:

typedef struct
{
LPDIRECTDRAWSURFACE7 kep; //a memóriára mutató pointer
int sor; //betöltött kép magassága (pixelekben)
int oszlop; //szélesség pixelekben
}KEP,*LPKEP;

Azért előnyös a typedef, mert létrejön egy új típus a KEP és egy ilyen típusú pointer is.

Ezt a struktúrát később fogjuk használni. Most létrehozunk a védett tagváltozók között egy ilyen

KÉP tipusú tömböt:

 

KEP kepek[10]; //várhatóan ennyi képfelület elég lesz.

Azért kell ezzel kezdeni, mert a destruktorban törülni szeretnénk minden általunk létrehozott objektumot.(Szerintem amikor bezáródik az ablakunk,akkor a Win automatice felszabadítja a memóriákat de ha nem???    elfogynak az erőforrások)

Megírjuk a képek és a ddraw objektum törlését, pedig még nem is tudjuk mennyi kép lessz!

dekraláció:

void torles();

megvalósítás:

 //
void RAJZ::torles()
{
for(int i=0;i<10;i++) //elsőnek a képfelületeket törüljük
{
if(kepek[i].kep){ kepek[i].kep->Release();kepek[i].kep=NULL;}
}
obj->Release();obj=NULL;// és magát at ddraw objektumot
}

(Fontos! Ha egy mutató "mögötti" adatállományt törlünk,akkor az értékét is NULLázzuk ki,mert

legközelebb egy egyszerű vizsgálattal eldönthető, hogy van e mögötte érvényes objektum.

statikus mutatóknál a fordító "garantálja" a 0-val való feltöltést,de utána nekünk illik kézben tartani.)

Ezt a függvényt be kell írni a destruktorba: torles();Ha nem volt ennyi kép akkor sincs baj.

Nem beszéltem még a képernyő váltásáról,pedig ez fontos dolog lesz. csak egy függvényt kell

meghívni,mégpedig a flip() nevűt, dekraláljuk: void flip();

Megvalósítása:

//KÉPERNYŐVÁLTÁS
void RAJZ::flip()
{
BOOL inf=front->Flip(NULL,0);
}

Használni pedig a Main .cpp-ben a végtelen ciklusban kell:

while (fut)
{
uzenetkezelo();
rajz.flip();

}

Fordít futtat... Az eredmény egy villódzó képrenyő,pedig mi nem ezt akarjuk...                                Valójában pont ez kell nekünk,mert a megadott ütemben(képernyő frekvencia) váltogatva van a képernyő.Csakhogy az első szép szürke a hátsó pedig fekete.Gyorsan írunk is egy háttérszinező függvényt.

Vissza a Rajz.hpp hez.

 dekraláció:   void hatter (DWORD szin=0);//ha így dekralálod,akkor "üres meghívás esetén 0 lesz a bemenő adat

megvalósítás:

// HÁTTÉRSZIN
void RAJZ::hatter(DWORD szin)
{
DDBLTFX dfx;ZeroMemory(&dfx,sizeof(dfx));
dfx.dwSize=sizeof(dfx);dfx.dwFillColor=szin;
back->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&dfx);
front->Flip(NULL,0);back->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&dfx);

}

Tulajdonképpen a háttérfelülethez tartozó Blt(...) függvényét hívja meg, előtte kitölt egy struktúrát.

Használni az init függvény végén célszerű, de bárhol,bármikor meghívható.

szúrjad be az init() függvény végére:

 UpdateWindow(hwnd); //ablakfrissítés
hatter(0x00000080);
return true;//ha eddig elér a progi,akkor van dx felületünk.

A színfelállás a következő: 00 rr gg bb  azaz   piros  zöld kék tehát  a 0x00000080 közepes kéket jelent.

Ha csak a 16 bites színt sikerült volna inicializáni, akkor 5 bit piros  6bit zöld és 5 bit kék a szín. Fordít futtat. Most már igazán egyszínű középkék képernyőnek kell lennie. vibrálás nélkül.A program fejlesztése közben jó lenne ha kitudnánk írni számokat és szövegeket a képernyő felületére. Legyen a két függvény neve kiirszam  és kiirbetu.

Dekraláció:

void kiirbetu(LPCTSTR betu,int x,int y);//sztringre mutató pointer és pozíció
void kiirszam(int szam,int x, int y);//szám és pozíció

Megvalósítás:

void RAJZ::kiirbetu(LPCTSTR betu,int x,int y)
{

char buffer[64];HDC hdc;
back->GetDC(&hdc);sprintf(buffer,betu); //lekérdezzük a háttérfelület címét
SetTextColor(hdc,0x00ff40ff);//RGB(64,64,255)
//SetBkColor(hdc,0x000000ff); //00bbggrr háttérszin
SetBkMode(hdc,TRANSPARENT);//OPAQUE
TextOut(hdc,x,y,buffer,strlen(buffer)); //strlen függvény megállapítja a sztring hosszát
back->ReleaseDC(hdc);//ha már nem kell megszüntetjük
}
/**/
void RAJZ::kiirszam(int szam,int x,int y)
{
char bufer[20];

itoa(szam,bufer,10);
kiirbetu(bufer,x,y);

Azonban hogy a strlen() és az itoa() függvényeket használjuk, csatolni kell a stdio.h állományt.Fennt:

#include <stdio.h>

A két függvény használata legegyszerűbben a flip függvényben lehet:

void RAJZ::flip()
{
kiirbetu("első szövegem",100,100);
kiirszam(0x00ff00ff,100,120);

BOOL inf=front->Flip(NULL,0);

......

fordít futtat. Ha minden oké, akkor megjelenik a felirat és a szöveg.

Jó tudni! a flip() függvény meghívása addig várakoztatja a programot,amíg a monitor nem végez a

rajzolással,tehát 75Hz-nél 1/75 másodpercenként ez egy jól használható időzítő is lehet.Azonban később más időzítőket is használunk.

itt a kód:

vissza