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"