Pregunta

¿Hay alguna manera de especificar en qué monitor aparece una aplicación en Delphi o C ++ Builder?

Estoy desarrollando un programa simple para un cliente, que muestra los pedidos de cocina en un monitor secundario, generado por un sistema de hospitalidad. Actualmente deben arrastrar la ventana manualmente al segundo monitor después de que se inicie.

¿Fue útil?

Solución

Guarde la posición de la ventana antes del cierre del programa y restáurelos al inicio. Las pantallas multimonitor solo aumentan el tamaño del escritorio; otras superficies del monitor solo tienen una sección diferente del mismo plano X / Y con su origen en la parte superior izquierda del monitor principal.

Esto se puede hacer automáticamente por usted mediante cualquiera de los varios componentes .

Por cierto, la variable Screen en la unidad de Formularios tiene una propiedad llamada MonitorCount y otra propiedad indexable, Monitors [Index: Integer]: TMonitor. TMonitor tiene propiedades que indican la izquierda, la parte superior, el ancho, la altura, etc., por lo que toda la información que necesita está allí.

Otros consejos

El objeto Pantalla global (parte de Formularios) tiene el concepto de Monitores. Creo que esto se agregó alrededor de Delphi 6 o 7. El siguiente código funcionará:

// Put the form in the upper left corner of the 2nd monitor
//   if more then one monitor is present.
if Screen.MonitorCount > 1 then
begin
  Left := Screen.Monitors[1].Left;
  Top := Screen.Monitors[1].Top;
end;

Puede usar cualquier desplazamiento positivo desde esa posición para colocarlo en cualquier lugar de ese monitor. También puede obtener el ancho y la altura desde allí para conocer las dimensiones.

No es realmente la respuesta que implica su pregunta, pero ¿no podría almacenar la configuración de la ventana (tamaño, posición, estado maximizado) cuando la aplicación está cerrada y luego aplicarla al inicio?

procedure TMDIChild.btnShowMonClick(Sender: TObject);
begin
    if Screen.MonitorCount > 1 then
    begin
      FormShow.Left:=Screen.Monitors[1].Left;
      FormShow.Top:=Screen.Monitors[1].Top;
      FormShow.Width:=Screen.Monitors[1].Width;
      FormShow.Height:=Screen.Monitors[1].Height;
    end
    else
    begin
        FormShow.Show;
    end;
end;

Hace un tiempo que hice algo similar en Delphi 5:

procedure TForm18.FormCreate(Sender: TObject);
var
  Mon: TMonitor;
  MonitorIdx: Integer;
begin
  MonitorIdx := 1; // better read from configuration
  if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin
    Mon := Screen.Monitors[MonitorIdx];
    Left := Left + Mon.Left - Monitor.Left;
    Top := Top + Mon.Top - Monitor.Top;
  end;
end;

Windows le permitirá especificar las coordenadas de una ventana en la llamada a la API CreateWindow. No sé lo suficiente sobre Delphi o C ++ Builder para saber si tiene acceso a esa parte del proceso.

También puedes mover la ventana en un controlador WM_CREATE.

EnumDisplayMonitors le dará las coordenadas de cada monitor en el sistema.


Evidentemente, Delphi y C ++ Builder tienen instalaciones que hacen que esta respuesta sea algo irrelevante. Lo dejo aquí en caso de que alguien se encuentre con esta pregunta, pero necesita una respuesta para un entorno diferente.

No hago mucho con los sistemas de Windows, por lo que sugeriría un hack como este.

Agarre el ancho del escritorio visible (ambos monitores combinados), divídalo por la mitad y haga que sea su posición inicial.

También puedes ver lo que api te dice sobre las dimensiones de monitor2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top