MODE FENÊTRE - CLIPPING

Dans cet article, nous couvrirons les bases de l'initialisation d'un écran DirectDraw [celui de l'utilisateur] en mode fenêtré et l'affichage d'images sur cette dernière via la technique du Clipping.

Vous pouvez télécharger le projet exemple de cet article: Code Source Du Projet : ddClipping.zip

Notion de Clippers

Quand vous travaillez en mode fenêtré, vous devez associer un clipper à la fenêtre avec laquelle vous travaillez. Puis vous associez ce clipper à la surface primaire. Il ne vous restera plus qu'à blitter le backbuffer vers la surface primaire pour voir apparaître l'image/texte sur l'écran.

Nous devons d'abord déclarer un Clipper [Après avoir bien sûr déclarer les objets DirectX et DirectDraw].

Public Clipper As DirectDrawClipper

On doit ensuite configurer DirectDraw pour un mode fenêtré.

Configurations

On met le mode DirectDraw à normal (mode fenêtré).

DD.SetCooperativeLevel Form1.hwnd, DDSCL_NORMAL

En mode fenêtré, il faut que les dimensions du backbuffer soient identiques aux dimensions de la fenêtre (enfin, la zone hors de la barre de menu) afin que nos dessins soient visibles par le joueur. Pour cela il faut agir sur son ddsd.

  'Dimensions de la fenêtre
  Dim rRect As RECT
  'Prend les dimensions de la fenêtre et les met dans
  'rRect
  DX.GetWindowRect Form1.hwnd, rRect
  'On spécifie ces dimensions dans la description ddsd
  ddsd.lHeight = rRect.Bottom - rRect.Top
  ddsd.lWidth = rRect.Right - rRect.Left

  'On crée la surface Backbuffer
  Set Backbuffer = DD.CreateSurface(ddsd)

On peut maintenant attacher le Clipper à la surface Primaire.

Attachement du Clipper à la surface Primaire

On crée le Clipper et on l'attache.

  'On crée le Clipper
  Set Clipper = DD.CreateClipper(0)
  'On l'associe au handle de Form1
  Clipper.SetHWnd Form1.hwnd
  'On lie le Clipper à la surface Primaire
  Primary.SetClipper Clipper

Il faut maintenant afficher le résultat sur l'écran.

Affichage sur l'écran

En mode fenêtré, on n'a pas besoin d'attacher le backbuffer avec la surface primaire, puisqu'on ne mélange pas Clipping et Flipping.
On n'utilisera donc pas la méthode Flip de la surface Primaire mais on va plutôt blitter le backbuffer sur elle.

On Error Resume Next
Do
'On remplit le Backbuffer avec du noir
  Backbuffer.BltColorFill ddRect(0, 0, 0, 0), QBColor(0)
  'on y met la surface Surface
  Backbuffer.BltFast 0, 0, Surface, ddRect(0, 0, 0, 0), DDBLTFAST_WAIT
 
  'On blit le backbuffer vers la surface primaire
  GetClientRect Form1.hwnd, rRect
  ClientToScreen Form1.hwnd, rRect.Left
  ClientToScreen Form1.hwnd, rRect.Right
 
  Primary.Blt rRect, Backbuffer, ddRect(0, 0, 0, 0), DDBLT_WAIT
  'Si malheuresement elle est perdue, on la
  'restaure

  If Err.Number = DDERR_SURFACELOST Then
    Primary.restore
  End If
  'On donne la possibilité au joueur de presser
  'des boutons
  DoEvents
  'On recommence jusqu'à ce que bRunning = False
Loop Until bRunning = False

Vous avez sûrement remarqué qu'il y a deux nouvelles fonctions et une nouvelle variable dans ce bout de code. Il faut donc les déclarer plus haut.

'Apis
Public Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Public Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As Any) As Long ' lpPoint As POINTAPI

'RECT de la fenêtre
Dim ClientRect As RECT

Maintenant pensez à mettre ceci à Form_Unload de la feuille.

'Dans la feuille
Private Sub Form_Unload (Cancle As Integar)

UnloadDD
End Sub

Voilà! C'est tout!

Conclusion

Bien vous venez de découvrir comment débuter un programme en mode fenêtré et comment y afficher une image.
Bien que le mode plein écran est le plus utilisé par les jeux, vous pouvez combiner ces deux modes dans un même jeu afin d'offrir plus d'options au joueur.
Il vous suffira de faire par exemple que lorsqu'on agrandit la fenêtre, l'application passe en mode plein écran.

Téléchargement

Vous pouvez télécharger le projet exemple de cet article:

Ce projet affiche une image sur l'écran en mode fenêtré.

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]