In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Pregunta para José Lalin

Foro de Xailer profesional en español
Responder
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Pregunta para José Lalin

Mensaje 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"
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Pregunta para José Lalin

Mensaje 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
--
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Pregunta para José Lalin

Mensaje 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
>
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Pregunta para José Lalin

Mensaje 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
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Pregunta para José Lalin

Mensaje 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.
Bingen Ugaldebere
Mensajes: 1310
Registrado: Mié Sep 26, 2007 7:12 pm

Pregunta para José Lalin

Mensaje 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.
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Pregunta para José Lalin

Mensaje 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
Responder