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...
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!!
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.