Probleme avec DirectDraw et plusieur form

Résolu
Lecimente Messages postés 2 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 25 juin 2007 - 22 juin 2007 à 14:05
Lecimente Messages postés 2 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 25 juin 2007 - 25 juin 2007 à 00:01
Bonjours à tous, je suis sur que je ne suis pas le premier a avoir eu ce probleme avec VB6. Je viens de m'initier à DirectDraw et DirectSound, et j'arrive très bien à faire afficher une image d'arriere plan ainsi que des sprites animés dans la page, les faire se déplacer etc.


Le problème est le suivant : Lorsque je veux fermer une form et en afficher une seconde, qui elle aussi utilise directdraw pour afficher en plein écran, il me sort une erreur : résolution non supporter (pourtant cest la meme que dans lautre form) et il me dit que mon objet background = nothing (alors que dans le form initialize je le set) et ca plante.


Donc ma question est, quel est la procédure a suivre pour pouvoir afficher une Form1 en plein écran puis lorsqu'on à atteind une condition (exemple : appuyer sur Enter) faire afficher une Form2 (jai tenter tant bien que mal et ca n'a rien donné, il doit y avoir un truc que je n'ai pas saisi)


merci à ceux qui tenterons de m'aider ^^




petit ajout : mon code pour initialiser directx est le suivant


Public Dx7 As New DirectX7
Public DDraw As DirectDraw7


Public Primary As DirectDrawSurface7
Public PrimaryDesc As DDSURFACEDESC2  
Public BackBuffer As DirectDrawSurface7
Public BackBufferDesc As DDSURFACEDESC2


Public Ds As DirectSound
Public DsBuffer(1 To 100)  As DirectSoundBuffer
Public DsDesc As DSBUFFERDESC
Public DsWave As WAVEFORMATEX


ici je déclare mon arriere plan


Dim BackScreen As DirectDrawSurface7 'Pour le fond d'ecran
Dim BackScreenDesc As DDSURFACEDESC2 'Sa Description


dans le form initalize :


InitDDraw
ReDessine


dans InitDDraw :


On Error Resume Next
Set DDraw = Dx7.DirectDrawCreate("")
If Err.Number <> 0 Then
        MsgBox "Impossible de cree l'objet principale de DDraw"
 Exit Function
End If


DDraw.SetCooperativeLevel Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE Or DDSCL_ALLOWMODEX


DDraw.SetDisplayMode 1024, 768, 32, 0, DDSDM_DEFAULT


If Err.Number <> 0 Then
 MsgBox "La resolution n'est pas supporter"
        Exit Function
End If


On Error GoTo 0


PrimaryDesc.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT 'J'ai pas tout saisi ici...
PrimaryDesc.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_COMPLEX Or DDSCAPS_FLIP
PrimaryDesc.lBackBufferCount = 1


Set Primary = DDraw.CreateSurface(PrimaryDesc)


Dim Caps As DDSCAPS2
       
Caps.lCaps = DDSCAPS_BACKBUFFER 'J'ai pas tout saisi...
       
Set BackBuffer = Primary.GetAttachedSurface(Caps)
      
BackBuffer.GetSurfaceDesc BackBufferDesc
       
Set BackScreen = DDraw.CreateSurfaceFromFile(App.Path & "\Background.Bmp", BackScreenDesc)
   


Dim SrcRect As RECT


Dim DestRect As RECT


 


SrcRect.Right = BackScreenDesc.lWidth
SrcRect.Bottom = BackScreenDesc.lHeight
 


DestRect.Right = Screen.Width / 15 'Divise par 15 pour mettre en pixel
DestRect.Bottom = Screen.Height / 15
 


BackBuffer.Blt DestRect, BackScreen, SrcRect, DDBLT_WAIT
'[[[C'est ici que ca plante dans le second form me disant que Backscreen = nothing]]]


If Me.WindowState <> vbMinimized Then Primary.Flip Nothing, DDFLIP_WAIT


dans la fonction DX_Decharger


    On Error Resume Next
    Set Ds = Nothing 'Pas essentiel de laisser ceux la (sauf Dx7) mais ca vide la mémoire de ses
    Set Primary = Nothing 'surface ce qui ne peut pas faire de tord
    Set BackBuffer = Nothing
    Set DDraw = Nothing
    Set Dx7 = Nothing


dans le form keydown


select case keycode


 Case vbKeyReturn
            DX_Decharger
            Form2.show
end select
 


alors mon code est identique dans la page Form2


Il doit y avoir quelque chose que j'utilise mal...

1 réponse

Lecimente Messages postés 2 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 25 juin 2007
25 juin 2007 à 00:01
Bon enfin! j'ai trouvér ma solution. Je vous la donne pour les intéresser


 


C'était vraiment presque trop évident pour que je la trouve immédiatement...


Donc voila, pour faire afficher le contenu d'une seconde Form avec directx en VB6, il suffit simplement de marquer [NomDuForm].Show dans le déclancheur voulu (un form keydown par exemple, ou hit point = 0 )

Ce qui entrainera un bug a l'affichage du dit Form car le Form1 est toujours actif, donc on ajout un Unload Form1 dans le form initialize du form 2 ou encore dans le meme déclancheur qui fait apparaitre votre form2.

Exemple ! :
Dans le Form1
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
   Select Case KeyCode
      Case vbKeyReturn 'Donc ici, la touche "Enter"

         Form2.Show

   End Select
End Sub


Dans le Form2
Private Sub Form_Initialize()
   Unload Form1
   InitDDraw
   Redessine
End Sub

Donc dans le InitDDraw du Form2
Function InitDDraw() 'Cette fonction a pour but d'initialiser DirectDraw
   Set BackScreenPage2 = DDraw.CreateSurfaceFromFile(App.Path & "\ResulattFrame.bmp", BackScreenPage2Desc)
   'On voit donc ici que comme DirectDraw est déja charger en mémoire, il suffit de libérer le form1 de la mémoire (donc l'ancien 'background, les sprites etc. pour que la Form2 s'affiche sans problème
End Function

Pour tout commentaire/suggestion n'hésité surtout pas
3
Rejoignez-nous