Lecimente
Messages postés2Date d'inscriptionmardi 17 avril 2007StatutMembreDernière intervention25 juin 2007
-
22 juin 2007 à 14:05
Lecimente
Messages postés2Date d'inscriptionmardi 17 avril 2007StatutMembreDernière intervention25 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
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)
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...
Lecimente
Messages postés2Date d'inscriptionmardi 17 avril 2007StatutMembreDernière intervention25 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