Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Al Pasar De Pantalla Completa A Ventana

Iniciado por [EX3], 18 de Enero de 2005, 10:37:28 PM

« anterior - próximo »

[EX3]

 Wennas. Una vez solucionado el tema del reseteo del device que tanta lata me estuvo dando implemente una funcion para poder cambiar de modo de visualizacion: de pantalla completa a ventana y viceversa. Pues bien, la funcion funciona correctamente al cambiar de modo ventana a pantalla completa pero al reves falla al resetear el device mostrandome un mensaje de error y cerrandome el programa y aun no logro saber de que se trata. Me he estado basando en los ejemplos del SDK que traen funciones para cambiar de un modo a otro al vuelo pero aun asi me da el error. El codigo de la funcion es el siguiente:

'Cambia el modo de pantalla:
Public Function DEVICE_SetDisplayMode(Height As Long, Width As Long, Bpp As Long, Windowed As Boolean, TripleBuffer As Boolean, VSync As Boolean) As Long
On Error GoTo ErrHandler

Dim Val As Long, lstyle As Long

'Profundidad de color de la pantalla (en bits):
Select Case Bpp
   Case 16: Val = D3DFMT_R5G6B5
   Case 32: Val = D3DFMT_X8R8G8B8
End Select
   
'Modo Ventana
If Windowed Then
   
   'Devolvemos cualquier estilo a la ventana:
   lstyle = GetWindowLong(dx_hWnd, GWL_STYLE)
   lstyle = lstyle And Not WS_MAXIMIZEBOX And Not WS_MINIMIZEBOX And Not WS_THICKFRAME And Not WS_CAPTION
   Call SetWindowLong(dx_hWnd, GWL_STYLE, lstyle)
   
   Call SetWindowPos(dx_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
   
   Call D3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DispMode)
       
   With D3DWindow
       
      If VSync Then
           .SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
       
       Else
           .SwapEffect = D3DSWAPEFFECT_COPY
       
       End If
       .BackBufferHeight = Height
       .BackBufferWidth = Width
       .BackBufferFormat = DispMode.Format
       .Windowed = 1
           
   End With
   
'Modo Pantalla Completa
ElseIf Not Windowed Then
   'Quitamos cualquier estilo a la ventana para conseguir una ventana rectangular:
   lstyle = GetWindowLong(dx_hWnd, GWL_STYLE)
   lstyle = lstyle And Not WS_MAXIMIZEBOX And Not WS_MINIMIZEBOX And Not WS_THICKFRAME And Not WS_CAPTION
   Call SetWindowLong(dx_hWnd, GWL_STYLE, lstyle)
   
   'Colocamos la ventana encima de todas las demas:
   Call SetWindowPos(dx_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
   
   DispMode.Format = Val
   DispMode.Width = Width
   DispMode.Height = Height
     
   If VSync Then
       D3DWindow.SwapEffect = D3DSWAPEFFECT_FLIP
   Else
       D3DWindow.SwapEffect = D3DSWAPEFFECT_DISCARD
       D3DWindow.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE
   End If
   
   D3DWindow.Windowed = 0
   D3DWindow.BackBufferCount = 2 + Abs(TripleBuffer)
   D3DWindow.BackBufferFormat = DispMode.Format
   D3DWindow.BackBufferHeight = Height
   D3DWindow.BackBufferWidth = Width
   D3DWindow.hDeviceWindow = dx_hWnd

End If

'Reseteamos el Device:
Call ResetDevice

'Guardamos los datos de la pantalla:
With Scr_Data
   .Bpp = Bpp
   .Height = Height
   .Width = Width
End With

DEVICE_SetDisplayMode = 1
Exit Function

ErrHandler:
End Function

El codigo de reseteo es la conversion del codigo que me mostro Helius en el otro post:
'Resetea el Device en caso de perderlo:
Private Sub ResetDevice()
Dim Result As Long

   Do While Result = D3DERR_DEVICENOTRESET
       'Cedemos el control al sistema para que "respire":
       DoEvents

       'Comprobamos si el Device esta preparado para ser reseteado:
       Result = Device.TestCooperativeLevel
   Loop
   
   'Eliminamos la fuente de texto y el objeto Sprite de la memoria:
   Call MainFont.OnLostDevice
   Call DxSprite.OnLostDevice

   'Reseteamos el device:
   Call Device.Reset(D3DWindow)

   'Restauramos la fuente de texto:
  Call MainFont.OnResetDevice
       
   'Volvemos a configurar la fuente de texto actual y el objeto Sprite:
   Set MainFontDesc = FontInfo
   Set MainFont = D3DX.CreateFont(Device, MainFontDesc.hFont)

   Call DxSprite.OnResetDevice
   Set DxSprite = D3DX.CreateSprite(Device)
                       
   'Volvemos a configurar los Render_States:
   Call SettingDevice
   
End Sub

El error, como en la otra ocasion, lo da Device.Reset().
Espero que alguien sepa decirme que es lo que falla.

Gracias ;)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

shephiroth

 Wenas.

Yo la verdad no te sabria decir, porque nos e mucho de VB, ni se de dx xDD.......pero vi algo que me resulto curioso. Cuando checkeas si es minimizado o maximizado, las 2 primeras lineas en ambos casos es:


lstyle = GetWindowLong(dx_hWnd, GWL_STYLE)
lstyle = lstyle And Not WS_MAXIMIZEBOX And Not WS_MINIMIZEBOX And Not WS_THICKFRAME And Not WS_CAPTION


Y yo me pregunte, cuando la ventana la quieres maximizar es normal q no quieras ni botones de maximizar/minimizar, ni el thickframe (barra de scroll?? xDD) ni el borde superior para el título........pero cuando detectas q se trata de una ventana.......no sería al reves??? Tienes q añadirselo no quitarselo....es decir seria "or" en vez de "and not".........

Aunque aun asi, esto te dejaria la ventana sin bordes pero te debería dejar seguir........no se, como ya te dije no sepo, ya te contestará alguien que sepa mas xDD

SALUDOS ^^ y suerte!!

[EX3]

 Cierto, sobran los Not en el modo ventana, ha sido un pekeño fallo al copiar/pegar el codigo en el proyecto. Gracias por la observacion ;)

Aun asi el fallo no viene provocado por ello.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.