LECK�K:              

Saj�t ablak

Directdraw1

Directdraw 2

Directdraw_3

�dv�z�llek!

Az els� lecke a saj�t k�perny� volt. Most megpr�b�lunk a windows-t�l kikunyer�lni egy teljes k�perny�s ablakot.

Ehhez l�trhozunk egy �j f�jl-t, egy �j oszt�llyal. A l�nyeg a j�t�kokban,hogy a b�buk mindig

mozognak a k�perny�n,�s ehhez mindig �jra kell rajzolni �ket.Ebb�l k�vetkezik,hogy mik�zben a vidik�rtya b�szen rajzolja a monitorra a k�pet,k�zben a mi progink meg a saj�t b�buj�t a vidik�rty�ra, h�t ebb�l lesz a k�p villodz�sa,feldarabol�d�sa....

Ennek leker�l�s�re kell egy directx fel�letet l�trehozni, �s mindj�rt k�t k�perny�nek kell helyet foglalni. az els� amit l�tunk, �s egy h�ts� amire rajzolunk... ha minden rajzol�ssal k�szen vagyunk,akkor egy v�lt�s, �s m�ris rajzolhatunk a m�sik k�perny�re. ezzel ki van l�ve a k�perny� villog�sa, feldarabol�d�sa.A projecthez adj�l egy �j f�ljt, m�ghozz� a Header mapp�ba. a neve legyenRajz.hpp . A hpp kiterjeszt�s el�nye hogy nem kell k�l�n .h �s .cpp f�jl.

( DEVC++ n�l:                                              msvc6.0

                                                          

Az �j f�jl-ban hozzuk l�tre az oszt�lyunkat....

//RAJZ OSZT�LY
//
#ifndef _RAJZ_ //ujabb defin�ci� �s ford�t�si hiba elker�l�s�re
#define _RAJZ_

#include <ddraw.h>

//dekral�ci�k:
class RAJZ //oszt�ly neve
{
public: //public sz� alatti f�ggv�nyek- v�ltoz�k k�v�lr�l l�that�ak
RAJZ(); //konstruktor dekral�l�sa
~RAJZ(); //destruktor
protected: //protected alattiakat csak az oszt�ly l�thatja �s m�g az ut�d oszt�lyok
LPDIRECTDRAW7 obj; //objektum mutat�
LPDIRECTDRAWSURFACE7 front; //els�k�perny�re mutat� pointer
LPDIRECTDRAWSURFACE7 back; //h�ts�k�perny�re mutat� pointer
LPDIRECTDRAWCLIPPER cl; //klipper objektum

};

#endif

Nos akinek idegen egy oszt�ly, annak idegen a konstruktor �s destruktor fogalma is. A l�nyege: ha az oszt�lyt statikusan hozzuk l�tre,akkor az exe bet�lt�d�sekor, ha dinamikusan,akkor a mem�ria foglal�sakor megh�v�dik a konstruktor..... felfoghat� az oszt�ly inicializ�l� f�ggv�ny�nek,azaz megh�vhat m�s f�ggv�nyeket,lefoglalhat �jabb dinamikus v�ltoz�kat, mindent,amit csak akarunk, vagy �ppen semmit sem. A destruktor akkor aktiviz�l�dik,amikor megsz�nik az oszt�lyunk, de ott nek�nk kell gondoskodni a dinamikus helyfoglal�s felszabad�t�s�r�l....

 A dekral�ci�ban tulajdonk�ppen helyet foglalunk a directdraw7 t�pus� mutat�knak,Amelyek sorra megkapj�k az �rt�k�ket a k�l�nb�z� f�ggv�ny h�v�sok ut�n:Kell egy directdraw objektum,amin kereszt�l l�trehozhatjuk az els� �s h�ts� k�perny� fel�leteket,valamint egy klipper objektumot, ez ut�bbi arra kell, hogyha egy k�pet szeretn�nk �trajzolni a h�tt�rre, akkor ha csak egy pixellel is kil�g, akkor m�r nem rajzolja ki a Blt(...) f�ggv�ny. A v�g�objektum n�lk�l.

Nos a directx fel�lethez kell az ablakunk hwnd t�pus� v�ltoz�ja,de ez ugye egy m�sik f�jl-ban a main.cpp -ben van. Ha m�r egyszer dekral�ltuk, akkor itt is egyszer�en haszn�lhatjuk,csak

mondjuk meg a ford�t�nak,hogy ez egy k�ls� v�ltoz� (majd megkeresi a hely�t) teh�t valahova a

#define _RAJZ_  al� kell be�rni:

extern HWND hwnd;

 

Csapjunk bele!

hozzunk l�tre egy init() f�ggv�nyt a rajz oszt�lyban:

dekral�ci�khoz: bool init();

Az  #endif  utas�t�s el�tt �p�tj�k ki a megval�s�t�s�t a f�ggv�nyeinknek:

//MEGVAL�S�T�SOK:

Els�nek a konstruktor, destruktor,majd az init f�ggv�ny:

//Megval�s�t�sok:
RAJZ::RAJZ() //A konstruktor neve maga az oszt�lyn�v nem adhat vissza �rt�ket,
{ //teh�t tipusa sem lehet itt csak egy �res konstruktor van egyenl�re
}
//
RAJZ::~RAJZ() //destruktor egyenl�re ez is �res.
{
}
//
bool RAJZ::init()    // a RAJZ:: -tal jel�lj�k hogy az oszt�ly f�ggv�nye �s nem glob�lis
{
HRESULT hr; //egy visszajelz�s,hogy siker�lt-e a f�ggv�nyt v�grehajtani
hr = DirectDrawCreateEx( NULL, (VOID**)&obj,IID_IDirectDraw7, NULL );//�tadjuk a mutat�t
//a directdraw objektum l�trehoz�s�hoz
if(hr!=DD_OK) return false;
hr = obj->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN );//egy�ttm�k�d�si szint
//teljes k�perny� kell
if(hr!=DD_OK) return false;
hr=obj->SetDisplayMode( 800, 600, 32,75,0);//k�perny� felbont�s,sz�nm�lys�g,frekvencia.
if(hr!=DD_OK) return false;
DDSURFACEDESC2 ddsd;//strukt�ra helyfoglala�sa
ZeroMemory( &ddsd, sizeof( ddsd ) );//adatok kit�lt�se
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |DDSCAPS_COMPLEX ;
ddsd.dwBackBufferCount = 1;//1 db h�tt�rfel�let kell
hr = obj->CreateSurface( &ddsd, &front,NULL );//l�trehozzuk a fel�letet
if(hr!=DD_OK) return false;
DDSCAPS2 ddscaps;
ZeroMemory( &ddscaps, sizeof( ddscaps ) );
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
hr = front->GetAttachedSurface( &ddscaps,&back );//lek�rdezz�k a h�ts�k�perny� c�m�t
if(hr!=DD_OK) return false;
hr = obj->CreateClipper( 0, &cl, NULL );//klipper objektum l�trehoz�sa
cl->SetHWnd( 0, hwnd );
hr = back->SetClipper(cl);//�s hozz�rendel�se a h�tt�rhez.
UpdateWindow(hwnd); //ablakfriss�t�s

return true;//ha eddig el�r a progi,akkor van dx fel�let�nk.

}

Nos az�rt �rtam hogy ha eddig el�r a progi mert ezzel a f�ggv�nnyel szokott probl�ma lenni:SetDisplayMode( 800, 600, 32,75,0)Vagy a videok�rtya vagy a monitor nem b�rja,akkor �ll�tgatni kell.felbont�s pl  640x 480 sz�nm�lys�g 16 , 8  frekvencia 50 60 75 100 Hertz vagy NULL ekkor a monitor alapfrekvenci�ja lesz a m�rvad�.

Menj�l a Main.cpp-be, �s add hozz� a Rajz.hpp-t a f�jl-hoz:

#include <Rajz.hpp>

ford�t�s....

Hiba�zenet elh�r�t�sa:

DEVC++                                                                                                msvc

Marad a ddraw.h �s a ddraw.lib hozz�ad�sa:

DEVC++:                                                                                MSVC:

Ha siker�ltek a be�ll�t�sok,akkor a main cpp-ben

hozzuk l�tre az �j  statikus oszt�lyt:

RAJZ rajz;

Haszn�lni pedig az egyes tagf�ggv�nyeket a . oper�torral lehet:

Irjad be a ShowWindow(hwnd,nFunsterStil); ut�n hogy:

if(rajz.init())MessageBox(NULL,"directdraw nem ok�","",0);;

ford�t futtat.

Ha lett egy teljesk�perny�s sz�rke k�ped,akkor minden ok�.

Azonban nem friss�l,de ezt a k�vetkez�ben...

itt a kod:

Ha nem lenne meg a ddraw.h �s ddraw.lib itt let�lthetitek.

Vissza