Procedimientos relacionados con el monitor del PC


Índice de los procedimientos:


Procedimiento para ver las propiedades del monitor

- Cambiar la resolución de la pantalla

- Ajustar la pantalla para diferentes dispositivos móviles 

- Ajustar la pantalla para resoluciones diferentes

- Seleccionar un monitor diferente cuando abro mi aplicación



- Capturar un trozo de la pantalla y guardarlo en un bitmap







Procedimiento para ver las propiedades del monitor:



PROCEDURE TForm1.GetWMIDisplayInfo(CONSTRemoteMachine,Username,Password:STRING);
VAR
FSWbemLocator:OLEVariant;
FWMIService:OLEVariant;
FWbemObjectSet:OLEVariant;
FWbemObject:OLEVariant;
oEnum:IEnumvariant;
iValue:LongWord;
BEGIN
;
TRY
FSWbemLocator:=CreateOleObject('WbemScripting.SWbemLocator');
FWMIService:=FSWbemLocator.ConnectServer(RemoteMachine,'root\CIMV2',
Username,Password);
FWbemObjectSet:=FWMIService.ExecQuery(
'select*fromWin32_DesktopMonitor','WQL',0);
TRY
oEnum:=IUnknown(FWbemObjectSet._NewEnum)ASIEnumVariant;
WHILEoEnum.Next(1,FWbemObject,iValue)=0DO
BEGIN
memo5.lines.add(
VarToStr(FWbemObject.Availability)+','+
VarToStr(FWbemObject.Bandwidth)+','+
VarToStr(FWbemObject.Caption)+','+
VarToStr(FWbemObject.ConfigManagerErrorCode)+','+
VarToStr(FWbemObject.ConfigManagerUserConfig)+','+
VarToStr(FWbemObject.CreationClassName)+','+
VarToStr(FWbemObject.Description)+','+
VarToStr(FWbemObject.DeviceID)+','+
VarToStr(FWbemObject.DisplayType)+','+
VarToStr(FWbemObject.ErrorCleared)+','+
VarToStr(FWbemObject.ErrorDescription)+','+
VarToStr(FWbemObject.InstallDate)+','+
VarToStr(FWbemObject.IsLocked)+','+
VarToStr(FWbemObject.LastErrorCode)+','+
VarToStr(FWbemObject.MonitorManufacturer)+','+
VarToStr(FWbemObject.MonitorType)+','+
VarToStr(FWbemObject.Name)+','+
VarToStr(FWbemObject.PixelsPerXLogicalInch)+','+
VarToStr(FWbemObject.PixelsPerYLogicalInch)+','+
VarToStr(FWbemObject.PNPDeviceID)+','+
VarToStr(FWbemObject.PowerManagementCapabilities)+','+
VarToStr(FWbemObject.PowerManagementSupported)+','+
VarToStr(FWbemObject.ScreenHeight)+','+
VarToStr(FWbemObject.ScreenWidth)+','+
VarToStr(FWbemObject.Status)+','+
VarToStr(FWbemObject.StatusInfo)+','+
VarToStr(FWbemObject.SystemCreationClassName)+','+
VarToStr(FWbemObject.SystemName)

);

FWbemObject:=Unassigned;
END;

FINALLY
FWbemObjectSet:=Unassigned;
END;

EXCEPTON E:Exception DO
RAISE;
END;
END;







y la llamada al procedimiento sería:



PROCEDURE TForm1.Button12Click(Sender: TObject);
BEGIN

TRY
CoInitialize(NIL);
TRY
GetWMIDisplayInfo('localhost', '', '');
FINALLY
CoUninitialize;
END;
EXCEPT
ON E: Exception DO
BEGIN
showmessage(E.Classname + ':' + E.Message);

END;
END;

END;










- Cambiar la resolución de la pantalla







var
FMenu: TFMenu;
W, H : integer; //para coger resolución
spCambioResolucion: string; //para cambiar resolución

implementation

Uses UDM;

{$R *.dfm}

function NuevaRes(XRes, YRes: DWord): Integer;
var
lpDevMode : TDeviceMode;
begin
EnumDisplaySettings (nil, 0, lpDevMode);
lpDevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
lpDevMode.dmPelsWidth := XRes;
lpDevMode.dmPelsHeight := YRes;
NuevaRes := ChangeDisplaySettings (lpDevMode, 0)
end;


En OnCreate para cambiarla

Código Delphi [-]
procedure TFMenu.FormCreate(Sender: TObject);
begin
//coger resolución de pantalla
W := Screen.Width;
H := Screen.Height;
spCambioResolucion := 'No';
//si es 800 por 600 se cambia a 1024 por 768 y se anota el cambio
if (W = 800) and (H = 600) then
begin
NuevaRes(1024, 768);
spCambioResolucion := 'Si';
end;
end;

En OnClose para dejarlo como estaba

Código Delphi [-]
procedure TFMenu.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//si se cambio la resolución que había de 800 por 600 volver a poner 800 por 600
if spCambioResolucion = 'Si' then
NuevaRes(800, 600);
end;










- Ajustar la pantalla para diferentes dispositivos móviles



1) ajusta los controles a tu gusto, según el tamaño de la pantalla del dispositivo seleccionado


2) Cambia en las propiedades de alineamiento de los controles a "scale"



al jugar esta propiedad podrás conseguir lo que quieres




- Ajustar la pantalla para resoluciones diferentes




No utilizes formularios que no puedan maximizarse y tengan un tamaño fijo. Utiliza las propiedades  Anchors, Align y Constraits de los componentes visuales de forma que estos se adapten al formulario.







- Seleccionar un monitor diferente cuando abro mi aplicación

















Usando el objeto Screen

Obtengo el número de monitores

ShowMessage(IntToStr(Screen.MonitorCount))

Obtengo los parametros del monitor

Screen.Monitors[i].Left (integer)
.Top (integer)
.Width (integer)
.Height (integer)
.BoundsRect (TRect)
.WorkareaRect (TRect)
.Primary (boolean)

Donde i es el indice del monitor, esto es: i = 0, 1, ..., Screen.MonitorCount - 1.


Para hacer que el form ocupe todo el monitor:

BoundsRect := Screen.Monitors[i].BoundsRect;
WindowState := wsMaximized;



Otra forma:

if Screen.MonitorCount > 1 then //existen 2 o mas monitores
begin
if not Assigned(CustMonForm) then
CustMonForm := TCustMonForm.create(tFSPosLoginform);
CustMonForm.Show;
end;

On the create of the form you want to show on the other monitor

En el OnCreate del form se muestra el monitor

if Screen.MonitorCount > 1 then
with Screen.monitors[ 1 ] do begin
self.left := left +(width div 2) -(self.width div 2);
self.top := top +(height div 2) -(self.height div 2)
end
end;


Otra forma:

application.mainForm.monitor := screen.monitors[ 1 ];












- Capturar un trozo de la pantalla  y guardarlo en un bitmap







procedure CapturarPantalla( x, y, iAncho, iAlto: Integer; Imagen: TBitmap );
var
DC: HDC;
lpPal : PLOGPALETTE;
begin
if ( iAncho = 0 ) OR ( iAlto = 0 ) then
Exit;

Imagen.Width := iAncho;
Imagen.Height := iAlto;
DC := GetDc( 0 );

if ( DC = 0 ) then
Exit;

if ( GetDeviceCaps( dc, RASTERCAPS) and RC_PALETTE = RC_PALETTE ) then
begin
GetMem( lpPal, SizeOf( TLOGPALETTE ) + ( 255 * SizeOf( TPALETTEENTRY ) ) );
FillChar( lpPal^, SizeOf( TLOGPALETTE ) + ( 255 * SizeOf( TPALETTEENTRY ) ), #0 );
lpPal^.palVersion := $300;
lpPal^.palNumEntries := GetSystemPaletteEntries( DC, 0, 256, lpPal^.palPalEntry );

if (lpPal^.PalNumEntries <> 0) then
Imagen.Palette := CreatePalette( lpPal^ );

FreeMem( lpPal, SizeOf( TLOGPALETTE ) + ( 255 * SizeOf( TPALETTEENTRY ) ) );
end;

BitBlt( Imagen.Canvas.Handle, 0, 0, iAncho, iAlto, DC, x, y, SRCCOPY );
ReleaseDc( 0, DC );
end;


Para capturar toda la pantalla de Windows haríamos lo siguiente:

var Imagen: TBitmap;
begin
Imagen := TBitmap.Create;
CapturarPantalla( 0, 0, Screen.Width, Screen.Height, Imagen );
Imagen.SaveToFile( ExtractFilePath( Application.ExeName ) + 'captura.bmp' );
Imagen.Free;
end;




















No hay comentarios:

Publicar un comentario

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...