Página 1 de 1

Pregunta para José Lalin

Publicado: Vie Jul 28, 2006 6:58 pm
por Bingen Ugaldebere
Tu que pareces con todo respeto "el mostruo del C" sabrí­as de alguna
función para cambiar al usuario la resolución de pantalla, he visto
algunas en C por Internet pero cada vez que intento un Inline C para chino.
Antes usaba esto por si puede ser más facil cambiar las DLL32 del final
y vale, muchas gracias.
//
// ChangeRes(nX,nY)
// Función ......: Set screen resolution to nX,nY pixel
// Returns .....: .T. If changed
// Author .......: César E. Lozada 16/03/01 cesarlozada@hotmail.com
//
Function ChangeRes(nX,nY)
Local CCDEVICENAME := 32
Local CCFORMNAME := 32
Local EWX_LOGOFF := 0
Local EWX_SHUTDOWN := 1
Local EWX_REBOOT := 2
Local EWX_FORCE := 4
Local DM_BITSPERPEL := nHex("40000") // &H40000 // 4*16^4 // 262144
Local DM_PELSWIDTH := nHex("80000") // &H80000 // 8*16^4 // 524288
Local DM_PELSHEIGHT := nHex("100000") // &H100000 // 1*16^5 //1048576
Local CDS_UPDATE := 1 //&H1
Local CDS_TEST := 4 //&H4
Local DISP_SUCCESS := 0
Local DISP_RESTART := 1
Local oDevMode
Local uRet
Local cBuffer
Local lDone:=.F.
DEFAULT nX := WndWidth(GetDesktopWnd()),;
nY := WndHeight(GetDesktopWnd()) //Por defecto, la
resolución actual
STRUCT oDevMode // Los miembros pueden tener máximo 9 caracteres(???)
// Tuve que recortarlos ( :-( )
MEMBER cDevName AS STRING LEN CCDEVICENAME
MEMBER nSpecVer AS _INT
MEMBER nDrvVer AS _INT
MEMBER nSize AS _INT
MEMBER nDrvExtra AS _INT
MEMBER nFields AS DWORD
MEMBER nOrientat AS _INT
MEMBER nPaperSiz AS _INT
MEMBER nPaperLen AS _INT
MEMBER nPaperWid AS _INT
MEMBER nScale AS _INT
MEMBER nCopies AS _INT
MEMBER nDefSrc AS _INT
MEMBER nPrnQlty AS _INT
MEMBER nColor AS _INT
MEMBER nDuplex AS _INT
MEMBER nYResolut AS _INT
MEMBER nTTOpt AS _INT
MEMBER nCollate AS _INT
MEMBER cFormName AS STRING LEN CCFORMNAME
MEMBER nUnusePad AS _INT
MEMBER nBitsPPel AS DWORD // Según el código original es _INT.
Funciona en VB pero no en FW
// ¿ Por qué ? (Si lo sabe, mándeme un
e-mail, por favor)
MEMBER nPelWidth AS DWORD
MEMBER nPelHeigh AS DWORD
MEMBER nDisFlags AS DWORD
MEMBER nDisFreq AS DWORD
ENDSTRUCT
cBuffer:=oDevMode:cBuffer
uRet := EnumDisplaySettings(0, 0, @cBuffer) //No se pasa la STRUCT
sino su cBuffer
oDevMode:cBuffer:=cBuffer
If uRet
// Informa al buffer los campos que se van a cambiar WIDTH, HEIGHT
[,COLORES]
oDevMode:nFields := nOr(DM_PELSWIDTH, DM_PELSHEIGHT /* ,
DM_BITSPERPEL */)
oDevMode:nPelWidth := nX //ScreenWidth
oDevMode:nPelHeight:= nY //ScreenHeight
// Descomente éste si va a cambiar los colores (No recomendado)
// oDevMode:nBitsPPel := 16 //(could be 8, 16, 32 or even 4)
// Prueba para saber si se puede hacer el cambio y si se requiere
reiniciar
cBuffer:=oDevMode:cBuffer
uRet := ChangeDisplaySettings(@cBuffer, CDS_TEST)
oDevMode:cBuffer:=cBuffer
// Hace el cambio, si se puede
DO CASE
Case uRet=DISP_RESTART
If MsgYesNo( If( oApp:cOriginalLng="ESP", ;
"Deberá reiniciar Windows para aplicar los cambios." + CRLF + ;
"¿Desea reiniciar ahora?",;
"You must restart Windows to aply this changes." + CRLF + ;
"Do you want to restart now?" ), oApp:cMsgCaption)
uRet := ExitWndEx(EWX_REBOOT, 0)
Endif
Case uRet=DISP_SUCCESS
uRet := ChangeDisplaySettings(@cBuffer, CDS_UPDATE)
lDone:=.T.
otherwise
MsgAlert( If(oApp:cOriginalLng="ESP",;
"El modo de resolución escogido no es soportado.",;
"The resolution mode selected is not supported." ),
oApp:cMsgCaption )
ENDCASE
endif
Return lDone
************************************************************ **************
DLL32 FUNCTION EnumDisplaySettings(lpszDeviceName AS DWORD,iModeNum AS
DWORD, ;
@lpDevMode AS LPSTR) AS BOOL PASCAL;
FROM "EnumDisplaySettingsA" LIB "User32.dll"
DLL32 FUNCTION ChangeDisplaySettings(@lpDevMode AS LPSTR,dwFlags AS
DWORD) AS DWORD;
FROM "ChangeDisplaySettingsA" LIB "User32.dll"
DLL32 FUNCTION ExitWndEx(uFlags AS DWORD,dwReserved AS DWORD) AS DWORD
PASCAL;
LIB "user32.dll"

Pregunta para José Lalin

Publicado: Lun Jul 31, 2006 12:24 am
por jlalin

Bingen,
> Tu que pareces con todo respeto "el mostruo del C" sabrí­as de alguna
> función para cambiar al usuario la resolución de pantalla, he visto
> algunas en C por Internet pero cada vez que intento un Inline C para chino.
hombre, feo sí­ pero tanto como monstruo no ;-)) Ahora en serio, después
de tres años trabajando con los mejores maestros hay que aprender algo,
por aquello del qué dirán :-))))
Mira el ZIP adjunto, contiene el fuente de la clase TScreenResolution y
el OBJ por si no tienes el compilador de C instalado.
Aquí­ tienes un ejemplo de uso:
//---
METHOD Button1Click( oSender ) CLASS TForm1
WITH OBJECT TScreenResolution():New()
:nWidth := 1024
:nHeight := 768
IF :Test() // Probamos si está soportada
MsgInfo( "Resolución soportada." )
IF :Set() // La ponemos
MsgInfo( "Cambiada correctamente." )
// Si hay que reiniciar, preguntamos al usuario
IF :lNeedRestart
IF MSgYesNo( "¿ Desea reiniciar ?" ) == IDYES
RebootSystem()
ELSE
// Dejar como estaba al inicio de la aplicación
:Reset()
ENDIF
ENDIF
ELSE
MsgInfo( "No se ha podido cambiar la resolución." )
ENDIF
ELSE
MsgInfo( "Resolución no soportada." )
ENDIF
END
RETURN Nil
//---
Saludos,
José Lalí­n
--

Pregunta para José Lalin

Publicado: Mar Ago 01, 2006 10:16 am
por Bingen Ugaldebere
Como siempre ¡bárbaro! lo he puesto como Inline C en vez de compilar en
C o usar el Obj y también va perfectamente.
Muchí­sismas gracias.
José Lalí­n escribió:
>
> Bingen,
>
>> Tu que pareces con todo respeto "el mostruo del C" sabrí­as de alguna
>> función para cambiar al usuario la resolución de pantalla, he visto
>> algunas en C por Internet pero cada vez que intento un Inline C para
>> chino.
>
> hombre, feo sí­ pero tanto como monstruo no ;-)) Ahora en serio, después
> de tres años trabajando con los mejores maestros hay que aprender algo,
> por aquello del qué dirán :-))))
>
> Mira el ZIP adjunto, contiene el fuente de la clase TScreenResolution y
> el OBJ por si no tienes el compilador de C instalado.
>
> Aquí­ tienes un ejemplo de uso:
>
> //---
> METHOD Button1Click( oSender ) CLASS TForm1
>
> WITH OBJECT TScreenResolution():New()
> :nWidth := 1024
> :nHeight := 768
> IF :Test() // Probamos si está soportada
> MsgInfo( "Resolución soportada." )
> IF :Set() // La ponemos
> MsgInfo( "Cambiada correctamente." )
>
> // Si hay que reiniciar, preguntamos al usuario
> IF :lNeedRestart
> IF MSgYesNo( "¿ Desea reiniciar ?" ) == IDYES
> RebootSystem()
> ELSE
> // Dejar como estaba al inicio de la aplicación
> :Reset()
> ENDIF
> ENDIF
> ELSE
> MsgInfo( "No se ha podido cambiar la resolución." )
> ENDIF
> ELSE
> MsgInfo( "Resolución no soportada." )
> ENDIF
> END
>
> RETURN Nil
> //---
>
> Saludos,
> José Lalí­n
>

Pregunta para José Lalin

Publicado: Lun Ago 07, 2006 7:08 pm
por jlalin
Bingen,
> Como siempre ¡bárbaro! lo he puesto como Inline C en vez de compilar en
> C o usar el Obj y también va perfectamente.
¡ Genial ! Me gustarí­a saber en qué versiones de windows lo estás
usando, si es posible.
> Muchí­sismas gracias.
De nada :-)
Saludos,
José Lalí­n

Pregunta para José Lalin

Publicado: Lun Ago 28, 2006 10:53 am
por Bingen Ugaldebere
Hola José, perdona el retraso pero he estado 3 semanitas de vacaciones y
acabo de leer tu mensaje.
Lo he probado en W98SE y XP SP2 que son los 2 sistemas de los que
dispongo y en ambos va de maravilla.
Salu2.

Pregunta para José Lalin

Publicado: Lun Ago 28, 2006 10:56 am
por Bingen Ugaldebere
Perdona el retraso he estado 3 semanas de vacaciones.
Lo he probado en Win98 2ªEd. y WinXP SP2 que son los dos sistemas de que
dispongo aquí­ y funciona perfectamente en ambos.
Salu2.

Pregunta para José Lalin

Publicado: Lun Ago 28, 2006 3:09 pm
por jlalin
Bingen,
> Hola José, perdona el retraso pero he estado 3 semanitas de vacaciones y
> acabo de leer tu mensaje.
Yo estoy ahora :-)
> Lo he probado en W98SE y XP SP2 que son los 2 sistemas de los que
> dispongo y en ambos va de maravilla.
¡ Genial ! Muchas gracias por probarla.
Saludos,
José Lalí­n