Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Mostrar Ventana Monitor secundario (https://www.clubdelphi.com/foros/showthread.php?t=48478)

Quicksilver 26-09-2007 01:38:22

Mostrar Ventana Monitor secundario
 
Holas,
Alguno de ustedes sabe cómo reconocer las coordenadas ó el punto (0, 0) del monitor secundario en caso tenga instalado más de un monitor en mi PC?. Quiero hacer que una ventana se ejecute siempre en ese monitor y siempre maximizado. Agradezco su ayuda.
Slds.

quickynet 26-09-2007 10:09:06

Mirate "Screen.MonitorCount" para saber el numero de monitores, y a partir de ahi las propiedades y metodos de "Screen.Monitors[Numero de monitor]".

Un Saludo.

Neftali [Germán.Estévez] 26-09-2007 10:26:26

¿Has revisado la clase TScreen y TMonitor?
Desde la primera tienes acceso a un propiedad que te da el número de monitores y acceso a cada uno de ellos mediante la segunda clase.

Accediendo a los monitores puedes obtener las coordenadas y supongo que a partir de ahí podrás calcular la posición del escritorio correspondiente a la (0,0) del segundo.

Quicksilver 27-09-2007 15:31:36

Muchas gracias por sus respuestas, pero lamentablemente no me sirvio de mucho, lo que intento hacer es: Al abrir una nueva ventana desde mi aplicacion, por default se abra en el monitor secundario, al inicio me imagine que si conseguia las coordenadas del segundo monitor lo conseguiria, pero no funciono:
Esta es la parte de mi codigo

=============================
NewForm := TNewForm.Create(Self);
NewForm.Left := Screen.Monitors[1].Left;
NewForm.Top := Screen.Monitors[1].Top;
NewForm.Show;
=============================
Tienen idea de como puedo resolver esto?

Muchas gracias por sus aportes

Lepe 27-09-2007 16:00:43

pues a mi si me sale:
Código:

Monitor Nº: 0 IsPrimary : True
Dimensiones estandard
  Left  0
  Top    0
  Width  1024
  Height 768
BoundsRect
  Left  0
  Top    0
  Right  1024
  Bottom 768
WorkareaRect
  Left  0
  Top    0
  Right  1024
  Bottom 738

Monitor Nº: 1 IsPrimary : False
Dimensiones estandard
  Left  1024
  Top    0
  Width  1024
  Height 768
BoundsRect
  Left  1024
  Top    0
  Right  2048
  Bottom 768
WorkareaRect
  Left  1024
  Top    0
  Right  2048
  Bottom 768

el código delphi... nada del otro mundo:
Código Delphi [-]
var m:Tmonitor;
    i:Integer;
begin
  Memo1.Clear;
  for i:=0 to Screen.MonitorCount-1 do
  begin
    m := Screen.Monitors[i];
    with Memo1.Lines do
    begin
      Add('Monitor Nº: '+IntToStr(m.MonitorNum)+ ' IsPrimary : '+ BoolToStr(m.Primary,True));
      Add('Dimensiones estandard');
      Add('   Left   '+ IntToStr(m.Left));
      Add('   Top    '+ IntToStr(m.Top));
      Add('   Width  '+ IntToStr(m.width));
      Add('   Height '+ IntToStr(m.height));

      Add('BoundsRect');
        Add('   Left   '+ IntToStr(m.BoundsRect.Left));
        Add('   Top    '+ IntToStr(m.BoundsRect.Top));
        Add('   Right  '+ IntToStr(m.BoundsRect.Right));
        Add('   Bottom '+ IntToStr(m.BoundsRect.Bottom));

     Add('WorkareaRect');
        Add('   Left   '+ IntToStr(m.WorkareaRect.Left));
        Add('   Top    '+ IntToStr(m.WorkareaRect.Top));
        Add('   Right  '+ IntToStr(m.WorkareaRect.Right));
        Add('   Bottom '+ IntToStr(m.WorkareaRect.Bottom));
     Add('');
    end;
  end;

¿qué obtienes tú?

Saludos

Neftali [Germán.Estévez] 27-09-2007 16:05:33

Cita:

Empezado por Quicksilver (Mensaje 234296)
...pero lamentablemente no me sirvio de mucho, lo que intento hacer es: Al abrir una nueva ventana desde mi aplicacion, por default se abra en el monitor secundario, al inicio me imagine que si conseguia las coordenadas del segundo monitor lo conseguiria, pero no funciono....

¿Pero qué pasó? ¿Falló? ¿Error?
¿EWjecuta paso a paso y dinos qué valor tienen Left y Top? (la primera debería ser la ancura del primer monitor y la segunda 0).

Quicksilver 27-09-2007 17:43:45

Al ejecutar paso a paso, los valores que obtengo son:
Para Screen.Monitors[1].Left
Valor = 0; //Esto es el punto X de origen del monitor, no el ancho, el ancho es me lo da el weight

Para Screen.Monitors[1].Top
Valor = 0; //Esto es el punto Y de origen del monitor.

Finalmente lo que obtengo con esta parte del codigo es:
Código Delphi [-]
 
NewForm := TNewForm.Create(Self);
NewForm.Left := Screen.Monitors[1].Left;
NewForm.Top := Screen.Monitors[1].Top;
NewForm.Show;

Que la ventana me lo muestre en el primero monitor, esto debido a que, al asignarle 0, 0 como puntos de origenes, lo envia a la esquina superior izquierda del monitor primario, cuando lo que deseo es que lo envie a la esquina superior izquierda, pero del segundo monitor.

Gracias por el interes y la ayuda

Neftali [Germán.Estévez] 27-09-2007 18:04:14

AYUDA:
In multi-monitor applications, the available screen space can span multiple monitors from left to right. Read Left to determine where, in the entire available screen space, this monitor appears. The value of Left is in pixels relative to the left edge of the primary monitor.


Se supone que el Left del segundo monitor te debería devolver un valor igual al Width del primero, es decir (por lo que yo entiendo) el pixel a partir del cual empieza el segundo monitor.
Si te devuelve 0, ya sabemos porque no te aparece en el segundo; Lo que hay que saber ahora es porqué te devuelve 0 (la propiedad Left).

¿Como tienes la configuración de Multimonitor en Windows?

Quicksilver 27-09-2007 19:17:35

La configuracion de los monitores es:
Monitor Secundario a la Izquierda, Monitor Primario a la Derecha.

Por lo que tu me indicas, si el Left del segundo monitor es igual al width del primero, y si a mi me aparece en el primer monitor, al parecer es un problema quiza de la tarjetra de video, acabo de probar mi aplicacion, y funciono correctamente (POR FIN APARECIO EN EL SEGUNDO MONITOR!!).

Tu crees que el problema que tengo se deba a un problema con la tarjeta de video?.

Lepe 27-09-2007 20:42:28

No hay problema alguno.

Desde un principio deberías haber dicho cómo tienes configurados los monitores. Si en windows, en propiedades de pantalla, arrastras el monitor secundario, aparecerá un Hint con las coordenadas de la esquina superior izqda. En tu caso el monitor secundario estará como:
Left = - 1024
Top = 0

(Suponiendo que en ambos monitores uses una resolución de 1024x768)

Otra cosa es lo que tengas puesto en Delphi, es decir la propiedad de DefaultMonitor o algo así (donde indicas en qué monitor saldrá la aplicación) tiene preferencia sobre las coordenadas Top y Left que asignes... al menos al mostrar la ventana por primera vez.

Dado que tienes el escritorio extendido de windows activado, puedes preparar un boton en el form que te enseñe el Top y Left de tu ventana, llámalo por código en el OnCreate del form (antes de asignar las propiedades Top y Left), y también después de asignar las propiedades, mandando los mensajes a un TMemo por ejemplo.

Una vez mostrado el Form, puedes mover la ventana a un monitor u otro y pulsar el botón de nuevo.

Saludos


La franja horaria es GMT +2. Ahora son las 02:53:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi