Cambiar resolución de pantalla en VFP

¿Alguien sabe como cambiar la resolución de pantalla en visual foxpro? Encontré un ejemplo en el cual me cambia la resolución de 1024x768 a 800x600, pero al intentar restaurar mi resolución inicial no lo hace. El ejemplo es el "00000008.zip", no se si alguien ya lo vio y pudo detectarle el error. Si tienen otra manera de realizar dicho cambio de resolución.

1 respuesta

Respuesta
1
Te paso un código que encontré hace tiempo. Lamentablemente no recuerdo el autor.
*!* sintaxis changeres(tnwidth, tnheight)
do case
case sysmetric(1)=640 and sysmetric(2)=480
  lancho=sysmetric(1)
  lalto =sysmetric(2)
 case sysmetric(1)=800 and sysmetric(2)=600
  lancho=sysmetric(1)
  lalto =sysmetric(2)
 case sysmetric(1)=1024 and sysmetric(2)=768
  lancho=sysmetric(1)
  lalto =sysmetric(2)
 case sysmetric(1)=1280 and sysmetric(2)=1024
  lancho=sysmetric(1)
  lalto =sysmetric(2)
otherwise
  messagebox([la resolucion del monitor es desconocida])
Endcase
changeres(800,600)
messagebox([la resolucion fue cambiada a 800 * 600 pixeles])
changeres(lancho,lalto)
 messagebox([la resolucion fue retornada a su modo original ]+alltrim(str(lancho))+[ * ]+alltrim(str(lalto))+[ pixeles])
*!* valor devuelto: llretval
*!* argumentos: tnwidth, tnheight
*!* tnwidth especifica la nueva anchura de la pantalla en pixels
*!* tnheight especifica la nueva altura de la pantalla en pixels
function changeres
    lparameters tnwidth, tnheight
    local lnwidth, lnheight, lnmodenum, lcdevmode
    *!* valores
    lnmodenum  = 0
    lcdevmode  = replicate(chr(0), 156)
    lnwidth    = iif(empty(tnwidth), 800, tnwidth)
    lnheight   = iif(empty(tnheight), 600, tnheight)
    *!* instrucciones declare dll para cambiar resolución
    declare integer enumdisplaysettings   in win32api string lpszdevicename, integer imodenum, string @lpdevmode
    declare integer changedisplaysettings in win32api string @lpdevmode , integer dwflags
    *!* bucle para obtener todos los modos disponibles
    do while enumdisplaysettings(null, lnmodenum, @lcdevmode) <> 0
        lnmodenum = lnmodenum +1
    enddo
    *!* configurar la structura devmode
    lcdevmode = stuff(lcdevmode,  41, 4, longtostr(1572864))
    lcdevmode = stuff(lcdevmode, 109, 4, longtostr(tnwidth))  && ancho
    lcdevmode = stuff(lcdevmode, 113, 4, longtostr(tnheight))  && alto
    *!* cambiar resolucion
    changedisplaysettings(@lcdevmode, 1)
endfunc
*!* convierte un long integer a un 4-byte character string
*!* sintaxis: longtostr(lnlongval)
*!* valor devuelto: lcretstr
*!* argumentos: lnlongval
*!* lnlongval especifica el long integer a convertir
function longtostr
    lparameters lnlongval
    local lncnt, lcretstr
    lcretstr = ''
    for lncnt = 24 to 0 step -8
        lcretstr = chr(int(lnlongval/(2^lncnt))) + lcretstr
        lnlongval = mod(lnlongval, (2^lncnt))
    next
    return lcretstr
Endfunc

No sé que estabas usando vos, pero a mí esto me anduvo perfectamente.
Bueno Maxisis
Antes que nada quiero agradecer tu buena predisposición.
Te comento que lo que no tengo son las DLL. No se si podes facilitármelas.
Muchas gracias
Eduardo
Disculpas. En el código que te pasé hay un error. La DLL no es win32api, cambiala por user32.
Suerte.
Maxisis
Quiero comentarte que intente con la DLL que me comentaste y no tuve suerte.
Disculpa mi tardanza en responderte pero me surgió un inconveniente.
Muchas gracias.
Esto que te pasé lo estoy probando ahora mismo y funciona perfectamente. Es más, la probé definiendo la DLL como win32api y como user32 y funciona de ambas formas. Hay que ver que falla te está dando y en qué punto del código.
¿Podes darme más información del error que se genera? ¿O no se genera error?
Otra causa (no la comprobé) puede llegar a ser falta de permisos administrativos o versión de sistema operativo. Pásame toda la información adicional que puedas.
Maxisis
Quiero comentarte que intente con ambas DLL y tampoco tuve suerte.
Me abocaron a una nueva tarea que me esta demandando mucho tiempo por eso tome la decisión de finalizar mi pregunta para no tenerte esperando con mi respuesta. Me gustaría decirte que una vez más tranquilo con mi trabajo, quisiera retomar el tema con más tiempo si no te resulta molesto.
Desde ya quiero que sepas que agradezco mucho tu colaboración.
Eduardo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas