Buenas. Como siempre, yo y mis errores raros.
Me encontré con un error muy extraño, que la verdad no tengo la menor idea de por qué se produce, así que recurro a los "gurú" del tema.
Acabo de descubrir que al ejecutar una aplicación en modo ventana (ya sea con la versión 220 o la experimental 221) se produce una dessincronización entre la posición del mouse y la posición de dibujo.
Como sé que a veces me cuesta explicarme con palabras, voy a poner el código con el cual estuve haciendo pruebas:
Antecedentes:- Plataforma. Windows7 64 bit home premiun
- Visual Studio 2010
- probé con las versiones 220 y 221
Imports dxlib32_221
Public Class Form1
Dim oGFX As dx_GFX_Class
Dim oInput As dx_Input_Class
Dim MainLoop As Boolean
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
oGFX = New dx_GFX_Class
oInput = New dx_Input_Class
MainLoop = True
oGFX.Init(Me.Handle.ToInt32, 1024, 768, , True)
oInput.Init(Me.Handle.ToInt32)
Do While MainLoop
oInput.Update()
If oInput.Key(dxlib32_221.Key_Const.Key_Escape) = True Then MainLoop = False
oGFX.DRAW_Box(oInput.Mouse.X, oInput.Mouse.Y, oInput.Mouse.X + 1, oInput.Mouse.Y + 1, 0, -16711936)
oGFX.Frame(0, 60)
Loop
oInput = Nothing
oGFX = Nothing
End
End Sub
End Class
Como ven, estoy haciendo algo muy, muy simple, estoy dibujando un cuadrado de 2 pixel de color verde, justo en la posición donde está parado el mouse.
CitaroGFX.DRAW_Box(oInput.Mouse.X, oInput.Mouse.Y, oInput.Mouse.X + 1, oInput.Mouse.Y + 1, 0, -16711936)
En la posición (0,0) no hay problema, ahí coinciden el input con el draw, pero a medida que me alejo de ese punto la diferencia se hace cada vez más grande (el error es proporcional). En la esquina inferior-derecha se ve que el punto de dibujo no concuerda con el punto del mouse por alrededor de unos 10 a 20 pixel, como si la dimensión de la ventana tuviera diferentes valores para el input y para el dibujo.
- El error solo ocurre en modo ventana, si corro la aplicación a pantalla completa, no hay ni un solo pixel de diferencia.
- Tengo la completa seguridad, que este error no pasaba antiguamente con windowsXP.
- Ya hice la prueba de programar con vb6 y compilar desde windowsXP, pero al correr la aplicación en windows7 pasa el mismo error.
Conclusión.Desconozco por que pasa esto, y a ver si ex3 me puede dar una mano.
Pero por experiencia personal tuve un error muy similar tiempo atrás, programando con vb6, cuando le agregaba una barra de menú al formulario, recuerdo que me pasaba exactamente lo mismo, de alguna extraña forma, los input usaban el área sin contar la barra de menú, pero el método draw si contaba la barra de menú, lo cual hacia que las dimensiones de la pantalla fueran diferentes entre los draw y los input.
¿Por qué pasa lo mismo en modo ventana bajo windows7? (sin ningún tipo de barra de menú o ningún control que modifique nada), es lo que quisiera saber para poder solucionar.
Cita de: Hechelion en 07 de Junio de 2012, 05:59:00 AM
Acabo de descubrir que al ejecutar una aplicación en modo ventana (ya sea con la versión 220 o la experimental 221)
Experimental 221? Ejem, todavía no se ha liberado tal versión :..
Sobre el error en si, debería mirarlo pero nunca he tenido este problema ni en Visual Basic 6.0 ni .NET en Windows 7. Si luego tengo un hueco intento hacer una prueba rapida, pero vamos, tanto el editor de niveles como el editor de tiles/sprites que hice para la ultima versión de mi motor, que corrían en modo ventana, no sufrían tal problema ???
Salu2...
Yo tampoco lo sufría antes y es lo más extraño, ni te digo todo el rompedero de cabeza que tuve para darme cuenta del error, ya que originalmente pensaba que tenía un error en el juego (que ya es un código bastante complejo).
Me di cuenta que el error estaba en la librería cuando lo corrí a pantalla completa y el error no se presentó.
La verdad no sé, si el error siempre se presenta y no lo habíamos notado o si yo tengo algún problema en hardware/software que genera el error.
Si tienes un tiempo para probar, el código de arriba es un proyecto completo, puedes pegar y copiar y hacer pruebas, a ver si me dices si me faltó algo o si estoy inicializando algo mal.
Este error me pasaba cuando dibujaba en VB6 sobre un PictureBox. Seguro que si desplazas el mouse hacia abajo, la diferencia es cada vez mayor.
Descubrí luego de renegar bastante con eso, que al iniciar el Gfx en modo ventana, lo setea y luego achica la ventana. No sé si se entiende, pero escribo un ejemplito que soluciona esto.
With frmMain.Render
Gfx.Init(.hWnd, 512, 512, 32, True, False, False)
.Width = 512
.Height = 512
End With
Probalo de esa manera.
Espero que se entienda claramente.
Saludos.
Acabo de probar el siguiente codigo y me ha funcionado correctamente. El cuadrado se ubica en las coordenadas correctas del raton.
Public Class Form1
Private gfx As New dx_lib32.dx_GFX_Class
Private input As New dx_lib32.dx_Input_Class
Private render As Boolean = True
Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
gfx.Terminate()
input.Terminate()
gfx = Nothing
input = Nothing
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.Show()
gfx.Init(Me.Handle, 800, 600, , True)
input.Init(Me.Handle)
Do While render
gfx.DRAW_Box(input.Mouse.X, input.Mouse.Y, input.Mouse.X + 32, input.Mouse.Y + 32, 0, &HFFFFFFFF)
gfx.Frame(, 60)
Loop
End Sub
End Class
Cita de: Hechelion en 07 de Junio de 2012, 05:59:00 AM
Conclusión.
Desconozco por que pasa esto, y a ver si ex3 me puede dar una mano.
Pero por experiencia personal tuve un error muy similar tiempo atrás, programando con vb6, cuando le agregaba una barra de menú al formulario, recuerdo que me pasaba exactamente lo mismo, de alguna extraña forma, los input usaban el área sin contar la barra de menú, pero el método draw si contaba la barra de menú, lo cual hacia que las dimensiones de la pantalla fueran diferentes entre los draw y los input.
¿Por qué pasa lo mismo en modo ventana bajo windows7? (sin ningún tipo de barra de menú o ningún control que modifique nada), es lo que quisiera saber para poder solucionar.
Lo de que haya diferencia de valores al tener menus o demas elementos en el formulario se debe que a que la funcion de la API de Windows que devuelve las coordenadas del raton, en modo ventana, trabaja con las coordenadas logicas del formulario (por defecto la funcion siempre devuelve la posicion en coordenadas de pantalla, que asi se aplica en los modos a pantalla completa, en modo ventana se convierten a coordenadas del area de cliente de la ventana). En ese caso obiamente habria siempre una diferencia equitativa de distancia entre el cursor y lo que se dibuja en el formulario.
En tu caso dices que no usas menus ni nada en la ventana, y despues de hacer mi prueba, no entiendo por que te sucede esa desincronizacion progresiva, pero si es escalable segun la distancia de la coordenada 0,0 tiene que ser un problema de conversion de coordenadas de algun tipo (como si la escala logica del render grafico fuera distinta a la del input).
¿La ventana seguro que no tiene ninguna configuracion concreta que afecte a su diseño? ???
Salu2...
Ex3. ¿tienes activado Aero?
Estuve haciendo varias pruebas y te las resumo (también probé con tu código, tal cual lo publicaste).
-Independiente de la resolución de la pantalla, el error máximo en el eje Y era siempre de 40 pixel.
-Probé el consejo de Thorrex y no me funcionó, sin embargo si incrementaba la dimensión de la pantalla en 40 pixel en el eje Y, entonces se sincronizaba.
O sea:
Gfx.Init(.hWnd, 800, 600, 32, True, False, False)
Me.Size = New System.Drawing.Size(816, 640)
Me puse a hacer pruebas cambiando el tema del escritorio, y cuando pasaba al modo "windows classic" (y sin necesidad de usar "me.Size") funcionaba bastante mejor, por lo cual creo que el problema está en el "aero", pero no estoy seguro.
Como te decía antes, sé que este problema no lo tenía en mi antiguo PC con XP, pero este windows 7, es vanilla, es cierto que le he instalado muchos programas y algunos juegos, pero nada que cambie o modifique los gestores gráficos de windows, todo eso lo suelo usar en modo "vanilla" ya que para personalizar o sacar el máximo provecho al equipo prefiero hacerlo desde linux.
No deberia afectar el tema y la configuracion de estilo de las ventanas de Windows, ni en XP ni en Vista/Se7en ya que esto no afecta al area de cliente de la ventana que es lo que se gestiona para el render y las coordenadas de input en modo ventana (de hecho fue una de las tareas más "coñazo" que me toco abordar en la transicion del proyecto entre Windows98 y Windows XP por lo de la incursion de los temas de XP).
Igualmente, las pruebas las he hecho con Aero activado.
Cita de: Hechelion en 11 de Junio de 2012, 08:30:50 AM
-Independiente de la resolución de la pantalla, el error máximo en el eje Y era siempre de 40 pixel.
Vale, pensaba que la desincronizacion es progresiva. Por lo que comentas es fija, no? No me queda claro eso de error máximo.
Salu2...
Cita de: [EX3] en 11 de Junio de 2012, 08:05:53 PM
No deberia afectar el tema y la configuracion de estilo de las ventanas de Windows, ni en XP ni en Vista/Se7en ya que esto no afecta al area de cliente de la ventana que es lo que se gestiona para el render y las coordenadas de input en modo ventana (de hecho fue una de las tareas más "coñazo" que me toco abordar en la transicion del proyecto entre Windows98 y Windows XP por lo de la incursion de los temas de XP).
Igualmente, las pruebas las he hecho con Aero activado.
Cita de: Hechelion en 11 de Junio de 2012, 08:30:50 AM
-Independiente de la resolución de la pantalla, el error máximo en el eje Y era siempre de 40 pixel.
Vale, pensaba que la desincronizacion es progresiva. Por lo que comentas es fija, no? No me queda claro eso de error máximo.
Salu2...
Es progresiva, pero en la parte inferior (donde tiene el valor máximo en el eje Y (no probé el eje X)) al parecer siempre es de 40 pixel independiente de la resolución, o sea.
mouse.Y = 0 entonces error = 0
Mouse.y = screen.height entonces error = 40
Gfx.Init(.hWnd, 800, 600, 32, True, False, False)
Me.Size = New System.Drawing.Size(816, 640) <-- Con esta corrección me funciona
Gfx.Init(.hWnd, 1280, 720, 32, True, False, False)
Me.Size = New System.Drawing.Size(1296, 760) <-- Con esta corrección me funciona
Sobre el estilo de ventana, se supone que no debería afectar, pero en las pruebas que he hecho, me arroja diferentes desfases según sea el estilo y no sé si sea coincidencia o no, pero el estilo "windows classic" me arroja el menor error de desfase (casi no se nota) y es precisamente el que tiene menor margen en el decorado de la ventana.
Cita de: Hechelion en 11 de Junio de 2012, 08:53:42 PM
Sobre el estilo de ventana, se supone que no debería afectar, pero en las pruebas que he hecho, me arroja diferentes desfases según sea el estilo y no sé si sea coincidencia o no, pero el estilo "windows classic" me arroja el menor error de desfase (casi no se nota) y es precisamente el que tiene menor margen en el decorado de la ventana.
Pues algo raro hay de por medio por que en el estilo clasico de ventanas es donde justamente no deberia fallar. Vamos, ni idea por que estos errores las veces que los he visto en mi caso y en el de otros ha sido por meter elementos como menus y demas controles que ocupan espacio del area de cliente. De hecho, si quieres hacer pruebas más profundas, las funciones de la API de Windows que usa dx_lib32 son GetCursorPos para obtener la posicion del raton, que devuelve en coordenadas de pantalla, y ScreenToClient para transformarlas en las coordenadas de cliente, sea un formulario o cualquier contenedor con identificador Hwnd comos los PictureBox de VB6:
Public Structure POINTAPI
Public X As Integer
Public Y As Integer
End Structure
Public Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Integer, ByRef lpPoint As POINTAPI) As Integer
Public Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Integer
Y aqui el ejemplo anterior modificado para que lo pruebes:
Public Class Form1
Private gfx As New dx_lib32.dx_GFX_Class
Private input As New dx_lib32.dx_Input_Class
Public Structure POINTAPI
Public X As Integer
Public Y As Integer
End Structure
Public Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Integer, ByRef lpPoint As POINTAPI) As Integer
Public Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Integer
Private render As Boolean = True
Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
gfx.Terminate()
gfx = Nothing
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.Show()
gfx.Init(Me.Handle, 800, 600, , True)
input.Init(Me.Handle)
Dim mouse As POINTAPI
Do While render
GetCursorPos(mouse)
ScreenToClient(Me.Handle, mouse)
'gfx.DRAW_Box(input.Mouse.X, input.Mouse.Y, input.Mouse.X + 32, input.Mouse.Y + 32, 0, &HFFFFFFFF)
gfx.DRAW_Box(mouse.X, mouse.Y, mouse.X + 32, mouse.Y + 32, 0, &HFFFFFFFF)
gfx.Frame(, 60)
Loop
End Sub
End Class
Como en el caso anterior, me ha funciona correctamente. Dime si te falla también :-/
Salu2...
Pues tal como esperaba, falla.
El punto 800,600 está por afuera del área de trabajo del formulario, específicamente, ese punto está en la sombra del formulario que genera el aero.
Es como si mi formulario, contando con los margenes del windows+aero, fuera de 800,600 y el área interna fuere de menor tamaño.
(http://thumbnails67.imagebam.com/19568/2c69ba195679133.jpg) (http://www.imagebam.com/image/2c69ba195679133)
Opino igual que EX3, el problema está en que la API de windows devuelve las coordenadas reales del ratón, y no las del area de cliene (raro, yo también pensaba que en modo ventana trabajaba en area cliente)
Además, ten en cuenta que al crear una ventana, la API crea la ventana con el tamaño que le ha dicho, así que si tu pides una de 800x600 efectivamente te la da de 800x600, con marco y todo (el marco en realidad es un dibujito monisimo encima de la ventana). Asi que si quieres que tu area de cliente sea de 800x600, deberías tener en cuenta las dimensiones de dicho marco. Por eso en pantalla completa funciona perfecamente (no hay marco)
Sobre que no nos hayamos dado cuena antes, en mi caso siempre trabajo sobre .NET,asi que uso la captura de eventos para estas cosas.
Sobre EX3 y su TLSA.Engine, no estaba programado en .NET? O usas dx_Input_class?
Además, todo sería más facil si pudieramos ver la implementaión de dx_Input_class >:D
Pues lo que dices no es del todo cierto, si le pido una ventana de 800x600 usando la librería me la crea de 806x628, esos pixel de más deberían ser el área asignada al contorno, y el área activa debería ser de 800x600.
Respecto a no darse cuenta, es por que esto no pasa en todos los computadores ni OS, a mi, en XP NO me pasaba y a ex3 no le da error con su windows 7, por consiguiente no estamos ante un error de implementación, que si no, el error se presentaría siempre.
Acá hay un problema con un driver o configuración que está dando la coña, el problema es determinar cuál y por qué.
De casualidad te pasa eso con modo ventana y despues de redimenciona la ventana haciendo que no cuadre la pos del mouse con el dibujo de puntero en Dxlib32?????
por que ami me pasa lo mismo solo haciendo eso
Cita de: Manu343726 en 12 de Junio de 2012, 08:35:19 AM
Además, todo sería más facil si pudieramos ver la implementaión de dx_Input_class >:D
Paciencia :P Salvo más detalles sobre eventos de teclado y gamepad, el codigo que os he puesto arriba es lo que hace dx_lib32 para devolver la lectura del raton en modo ventana. Vamos, no tiene más, obtener las coordenadas del raton y pasarlas a escala del cliente.
La pregunta es, a alguien más le falla lo que comenta Hechelion o el ejemplo que he puesto arriba? ???
Cita de: Manu343726 en 12 de Junio de 2012, 08:25:45 AM
Opino igual que EX3, el problema está en que la API de windows devuelve las coordenadas reales del ratón, y no las del area de cliene (raro, yo también pensaba que en modo ventana trabajaba en area cliente)
No exactamente, lo que yo comento es que la funcion que devuelve las coordenadas del raton siempre las devuelve en coordenadas de pantalla (con origen 0,0 del escritorio) y para obtenerlas con el area de cliente de la ventana se usa la otra funcion que he mostrado arriba que toma el controlador de la ventana que se le indique. Lo que hace dx_lib32 es lo que hace el ultimo ejemplo de arriba.
Cita de: Manu343726 en 12 de Junio de 2012, 08:25:45 AM
Además, ten en cuenta que al crear una ventana, la API crea la ventana con el tamaño que le ha dicho, así que si tu pides una de 800x600 efectivamente te la da de 800x600, con marco y todo (el marco en realidad es un dibujito monisimo encima de la ventana). Asi que si quieres que tu area de cliente sea de 800x600, deberías tener en cuenta las dimensiones de dicho marco. Por eso en pantalla completa funciona perfecamente (no hay marco)
dx_lib32 crea la ventana con el área de cliente acorde a la resolución de vídeo que le indicais. Si tuvierais que andar indicando los pixeles extra os volveriais locos ya que segun configuracion del usuario y versión de Windows el estilo de las ventanas es totalmente distinto, los tamaños cambian. Esto lo gestiona dx_lib32 interna mediante varias llamadas a la API de Windows para estudiar la base de la ventana y el estilo aplicado por el sistema operativo (tamaños de los bordes, barra de titulo, etc...). Eso si, esta preparado para trabajar correctamente con ventanas de borde fijo y sin añadidos como menús o controles contenedores.
Cita de: Manu343726 en 12 de Junio de 2012, 08:25:45 AMSobre EX3 y su TLSA.Engine, no estaba programado en .NET? O usas dx_Input_class?
Salvo la version que llevo programando en C# con XNA desde hace año y medio las anteriores versiones de mi motor estan en Visual Basic 6.0 con dx_lib32 (incluso un experimento en su día entre VB.NET+C# y dx_lib32 hace unos años).
Cita de: Hechelion en 12 de Junio de 2012, 09:42:08 AM
Respecto a no darse cuenta, es por que esto no pasa en todos los computadores ni OS, a mi, en XP NO me pasaba y a ex3 no le da error con su windows 7, por consiguiente no estamos ante un error de implementación, que si no, el error se presentaría siempre.
Acá hay un problema con un driver o configuración que está dando la coña, el problema es determinar cuál y por qué.
Hechelion, una pregunta, que no me ha quedado claro. ¿Estas trabajando con Windows nativamente o desde una maquina virtual? Lo digo por que algo me suena que comentastes que trabajabas desde Linux. Si es el caso puede ser la clave de donde esta el problema. Cuando me compre hace unos años mi Macbook decidi trabajar con XP desde Mac OS con VMware y tuve problemas tanto con funciones gráficas como en otras áreas (de hecho perdí tiempo intentando arreglar bugs que no eran tal).
Salu2...
windows 7 nativo y es el OS que venía con el PC.
Sobre linux, lo tengo con arranque dual en una partición distinta, por lo cual ambos OS son completamente independientes.
Lo que uso como máquina virtual es XP, pero no tiene nada que ver acá, por que el problema se me presenta programando con NET directo en windows 7.
Citar
Esto lo gestiona dx_lib32 interna mediante varias llamadas a la API de Windows para estudiar la base de la ventana y el estilo aplicado por el sistema operativo (tamaños de los bordes, barra de titulo, etc...).
El problema podría estar en este lado entonces, ya que al parecer el problema es que el área activa real es menor que el área activa pedida, o sea, si inicio la librería en 800x600, el área activa en realidad estaría siendo de 780x590 (aprox).
Cita de: avalontm
De casualidad te pasa eso con modo ventana y despues de redimenciona la ventana haciendo que no cuadre la pos del mouse con el dibujo de puntero en Dxlib32?Huh??
por que ami me pasa lo mismo solo haciendo eso
Es exactamente el mismo problema, con la salvedad que no estoy haciendo ningún redimencionado de ventana (ni por código ni de forma manual).
Cita de: Hechelion en 12 de Junio de 2012, 09:59:31 PM
windows 7 nativo y es el OS que venía con el PC.
Sobre linux, lo tengo con arranque dual en una partición distinta, por lo cual ambos OS son completamente independientes.
Lo que uso como máquina virtual es XP, pero no tiene nada que ver acá, por que el problema se me presenta programando con NET directo en windows 7.
Entonces descarto lo de la maquina virtual como causa.
Cita de: Hechelion en 12 de Junio de 2012, 09:59:31 PM
Citar
Esto lo gestiona dx_lib32 interna mediante varias llamadas a la API de Windows para estudiar la base de la ventana y el estilo aplicado por el sistema operativo (tamaños de los bordes, barra de titulo, etc...).
El problema podría estar en este lado entonces, ya que al parecer el problema es que el área activa real es menor que el área activa pedida, o sea, si inicio la librería en 800x600, el área activa en realidad estaría siendo de 780x590 (aprox).
No tiene nada que ver. Si el problema viniera de ahi no habria desincronizacion de coordenadas, simplemente que en vez de un buffer de 800x600 tendrias uno de 780x590. ScreenToClient() deberia funcionar ahi sin problemas y en cualquier situacion ya que internamente se encarga de averiguar las dimensiones del area de cliente de la ventana para realizar la conversion de coordenadas.
Cita de: Hechelion en 12 de Junio de 2012, 09:59:31 PM
Cita de: avalontm
De casualidad te pasa eso con modo ventana y despues de redimenciona la ventana haciendo que no cuadre la pos del mouse con el dibujo de puntero en Dxlib32?Huh??
por que ami me pasa lo mismo solo haciendo eso
Es exactamente el mismo problema, con la salvedad que no estoy haciendo ningún redimencionado de ventana (ni por código ni de forma manual).
Lo de que se en el caso de redimensionar la ventana tiene explicación, ya que al redimensionar la ventana estáis escalando el buffer del render gráfico de DirectX (aunque si al reescalar la ventana modificais también el modo de video esto se soluciona con DEVICE_SetDisplayMode, claro).
La verdad, me sigue resultando raro que te falle ScreenToClient() siendo una función base del sistema operativo, ya que es el único punto que encuentro donde falle la conversión correcta de coordenadas :-/
Salu2...
Me han surgido un par de dudas.
Si yo inicio la librería en modo ventana en 800x600:
gfx.Init(Me.Handle, 800, 600, , True)
¿De cuanto debería ser el área activa real?
Pregunto, por que la función de ScreenToClient no está haciendo escalado, lo único que hace es modificar el punto de referencia, colocando el punto (0,0) en la parte superior/izquierda del área activa de mi formulario.
Edit:
Lo digo, por yo estoy pidiendo un área de 800x600, y el área activa real que me devuelve la librería en modo ventana es de 780x590 (aprox).
Al posible error que apunto, es que la librería genere un buffer de 800x600, pero que algún motivo está generando la ventana con dimensiones menores a las que realmente deberían ser y por eso la diferencia entre el input y el draw, ya que entiendo que el ScreenToClient no hace escalado.
Cita de: Hechelion en 13 de Junio de 2012, 02:10:33 AM
Si yo inicio la librería en modo ventana en 800x600:
gfx.Init(Me.Handle, 800, 600, , True)
¿De cuanto debería ser el área activa real?
El area de cliente deberia ser 800x600, la ventana luego tendra el tamaño extra segun la configuracion de estilo de ventanas de Windows.
Cita de: Hechelion en 13 de Junio de 2012, 02:10:33 AM
Pregunto, por que la función de ScreenToClient no está haciendo escalado, lo único que hace es modificar el punto de referencia, colocando el punto (0,0) en la parte superior/izquierda del área activa de mi formulario.
Por lo que he visto en tu captura, es como la funcion que tiene que modificar la ventana al tamaño correcto para su area de cliente no tuviera en cuenta tanto el borde derecho como el inferior por que el punto 800, 600 del area cliente coincide con la esquina de la ventana. No entiendo el por que ya el valor de grosor de los bordes es una unica variable del sistema y si la toma en cuenta para un borde lo toma para todos.
Aqui esta el codigo de la libreria que se encarga de modificar la ventana al tamaño correcto segun el modo de video que se aplique. Ahi veras que se obtienen los valores de los elementos base de la ventana para calcular el tamaño correcto:
'Aplica un tamaño a la ventana:
Public Sub Set_SizeWindow(hWnd As Long, Height As Long, Width As Long, Windowed As Boolean)
'Variables de valores metricos de la ventana:
Dim BorderX As Long
Dim BorderY As Long
Dim EdgeX As Long
Dim EdgeY As Long
Dim CaptionY As Long
Dim MenuY As Long
'Dimensiones del area de la ventana:
Dim WinRect As RECT
Dim Top As Long
BorderX = GetSystemMetrics(SM_CXBORDER)
BorderY = GetSystemMetrics(SM_CYBORDER)
EdgeX = GetSystemMetrics(SM_CXEDGE)
EdgeY = GetSystemMetrics(SM_CYEDGE)
CaptionY = GetSystemMetrics(SM_CYCAPTION)
'Obtenemos el nuevo tamaño para la ventana y la centramos en pantalla:
With WinRect
.Right = Width + (BorderX * 2) + (EdgeX * 2)
.bottom = Height + (BorderY * 2) + (EdgeY * 2) + CaptionY + MenuY
.Left = GetSystemMetrics(SM_CXSCREEN) / 2 - (.Right / 2)
.Top = GetSystemMetrics(SM_CYSCREEN) / 2 - (.bottom / 2)
If Windowed Then
Call SetWindowRgn(hWnd, GetWindowRgn(hWnd, 0), False)
Top = HWND_NOTOPMOST
' Recuperar barra de tareas:
'...
Else
Call SetWindowRgn(hWnd, CreateRectRgn(0, 0, Width, Height), True)
Top = HWND_TOPMOST
' Ocultar barra de tareas:
'...
End If
Call MoveWindow(hWnd, .Left, .Top, .Right, .bottom, True)
'Call RedrawWindow(hwnd, ByVal 0&, ByVal 0&, RDW_UPDATENOW Or RDW_NOERASE)
Call SetWindowPos(hWnd, Top, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)
End With
End Sub
Una cosa que me mato en su día es no encontrar una función de la API de Windows para modificar el tamaño de una ventana indicando su area de cliente, solo su tamaño completo. De hecho en .NET los formularios tienen una función para tal fin, SetClientSizeCore().
Salu2...
No logro encontrarle lógica al error, pero acabo de probar tu última solución junto a la idea de thorrex de redimencionar la ventana luego de inicializar el GFX y funciona de maravilla (Dhu nun lo estoy programando en NET)
gfx.Init(Me.Handle, 800, 600, , modoVentana)
If modoVentana Then SetClientSizeCore(800, 600)
Bueno, bien por lo de haber podido solucionar el problema con dicha función, mejor eso que nada :) pero sigo con la mosca en la oreja por el bug en si y que solo te ocurra a ti y encima siendo una sola función la posible culpable :-/
Salu2...