játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5448
FZoli:    4892
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2520

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2188
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1625
syam:    1491
(VB) DX7 DirectDraw - 2. Ablakos mód 2006.05.26 12:21


DirectDraw: Ablakos mód



Az ablakos mód a teljesképernyős mód alternatívája. Akkor igazán hasznos ha normál Windows programot írunk, játékoknál kevesebb szerepe van. De ha pl. egy CAD programban vagy rajzolóprogramban szeretnéd használni a DDraw-ot, érdemes az ablakos módot választanod.

Amíg a teljesképernyős módban a teljes képernyőt kapjuk meg, itt csak egy kis részét; Visual Basicben egy PictureBox (kép) vezérlőn keresztül. Ez annyit jelent, hogy rendes Windows kezelőfelületet szerkeszthetsz a központi "kép" köré - itt a DirectDraw válik a kezelőfelület részévé, nem mint a teljesképernyős módban ahol általában DirectDraw-ból kell a kezelőfelületet megrajzolnod.

Három fő dologban különbség/előny van az ablakos mód használatában:
  • Az ablakos mód nem használ háttérpuffert, minden közvetlenül az elsődleges felületre rajzolódik. Az elsődleges felületet itt a PictureBox vezérlő jelképezi amin keresztül a DDraw-ot használjuk.
  • Nem kell állandó Blittelés és végtelen ciklus. Amíg teljesképernyő módban folyamatosan frissítened kell a képernyőt, itt csak akkor amikor szükséged van rá (pl. valami változott). Ez kevesebb erőforrással jár és teljesen másképp építheted fel a programkódot.
  • Klipperek. Teljesképernyős módban a te alkalmazásod minden másik fölé rajzolódik. Ablakos módban viszont eltakarhatják: ekkor lép működésbe a klipper, megakadályozza hogy az alkalmazásod egy másik tetejére rajzoljon.
Szerencsére ablakos módot sokkal könnyebb programozni mind teljesképernyőset, a kód szerkezete sokkal egyszerűbb:

Option Explicit

'Fő változók
Dim DX As New DirectX7
Dim DD As DirectDraw7

'Az első puffer a bitképet tárolja. A második "elsődleges" puffer azt ami a képernyőn jelenik meg.
Dim picBuffer As DirectDrawSurface7
Dim Primary As DirectDrawSurface7

'Az első leíró a képernyőt írja le, a második a felületet amibe a bitkép kerül
Dim ddsd1 As DDSURFACEDESC2
Dim ddsd2 As DDSURFACEDESC2

'A klipper kezeli a letakart felületeket és nem engedi az alkalmazásunkat más ablak tetejére rajzolni.
Dim ddClipper As DirectDrawClipper

'Inicializációs változó.
Dim bInit As Boolean


Private Sub Form_Load()
'Kezdjük...
init
End Sub


Sub init()
On Error GoTo ErrHandler:

'Inicializáló eljárás
'Az üres string paraméter azt jelenti hogy az alapértelmezett meghajtóprogramot használjuk
Set DD = DX.DirectDrawCreate("")

'Jelezzük hogy ez a program ablakos módban fut, nem teljesképernyősben.
'Ugyanakkora színmélységben mint a jelenlegi. Ez korlátozhat minket:
'A felhasználónak 16 színtől 16 millióig akármilyen színmélység beállítása lehet.
'Hogy tudd mi az aktuális beállítás, használd ezt:
'dim DeskTopBpp as long
'DesktopBpp = DX.SystemBpp

Call DD.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)

'Jelezzük hogy a ddsCaps adattag helyes most
ddsd1.lFlags = DDSD_CAPS
'Ez a felület az elsődleges (felhasználó számára látható)
ddsd1.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE
'Létrehozzuk a felületet az előbb beállított leíróval
Set Primary = DD.CreateSurface(ddsd1)

'Most jön a második felület leírója
ddsd2.lFlags = DDSD_CAPS
'Ez egy képernyőn kívüli felület lesz (csak a bitképet tartalmazza)
ddsd2.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
'Létrehozzuk a felületet az előre elkészített képből
Set picBuffer = DD.CreateSurfaceFromFile(App.Path & "background.bmp", ddsd2)

'Létrehozzuk a klippert, csatoljuk a képdobozhoz és az
'elsődleges felülethez. Csak ennyit kell tenni: a klipper maga kezel minden mást

Set ddClipper = DD.CreateClipper(0)
ddClipper.SetHWnd picBox.hWnd
Primary.SetClipper ddClipper

'Vége az inicializálásnak, készen állunk a blittelésre
bInit = True

'Ha készen állunk a blitteléshez, hívjuk meg a "blt" eljárást.
'Ez a fő előnye az ablakos módnak: nem kell ciklus, csak meg kell
'hívni a blt-t ha frissíteni akarod a képet.

blt

Exit Sub
ErrHandler:
MsgBox "A DirectDraw inicializálása nem sikerült: Program bezárása", vbInformation, "error"
End
End Sub


Private Sub Form_Resize()
'Ez az eljárás a Me.Show eseménnyel hívódik meg
'vagy bármikor ha futásidőben átméreteződik a form.
'Mivel a DX pixelt, a VB meg twip-et használ mértékegységként
'szinkronizálni kell a két skálát.
'A form ScaleMode tulajdonságát át kell állítani
'pixelre. A form szélessége és magassága (Width, Height) ettől még
'twip-ben marad, de a ScaleWidth és ScaleHeight pixelben lesz és használhatjuk.

picBox.Width = Me.ScaleWidth
picBox.Height = Me.ScaleHeight

'Képernyő frissítése:
blt
End Sub


Sub blt()
On Error GoTo ErrHand:

'Inicializálódott a DDraw? Ha nem lépjünk ki az eljárásból!
If bInit = False Then Exit Sub

'Helyi változók
Dim ddrval As Long
Dim r1 As RECT 'A képernyő mérete
Dim r2 As RECT 'A bitkép mérete

'Lekérjük az képdoboz által megadott téglalapot
Call DX.GetWindowRect(picBox.hWnd, r1)
r2.Bottom = ddsd2.lHeight
r2.Right = ddsd2.lWidth

'Blt használata Bltfast helyett elengedhetetlen - ne próbáld meg a bltfast-et használni.
'A blt előnye hogy átméretezi a képet hogy akkora legyen mint a képdoboz;
'tehát nyugodtan átméretezhetjük az ablakot, a kép beleillik majd az új méretbe
'még ha rondán szét is lesz nyújtva.

ddrval = Primary.blt(r1, picBuffer, r2, DDBLT_WAIT)

Exit Sub
ErrHand:
MsgBox "Hiba történt képfrissítés közben", vbCritical, "error"
End Sub


Private Sub picBox_Paint()
'Ez futásidőben hívódik meg ha a form elmozdul vagy átméreteződik
DD.RestoreAllSurfaces
init
blt
End Sub


Ilyen egyszerű. Most már rendelkezel egy ablakos DirectDraw alkalmazás vázával. A teljesképernyős mód sok metódusa alkalmazható ablakos módra, például képek másolása, geometriai alakzatok és szöveg kirajzolása.

Természetesen letöltheted a forráskódot a lap aljáról.

Kapcsolódó linkek:
A DirectX4VB oldal
Az eredeti cikk a DirectX4VB oldalon. (Jack Hoxley: DirectDraw: Windowed Mode)
Fájl : (VB) DX7 DirectDraw - 2. Ablakos mód
Méret: Mb - Letöltve : 714

Értékelés: 0

Új hozzászólás
Nincs megjegyzés