2008-10-15 12 views
17

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

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

Respuesta

22

Guarde la posición de la ventana antes del apagado del programa y restaure al iniciar. Las pantallas de 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 any of several components.

Por cierto, la variable Pantalla en la unidad Forms tiene una propiedad llamada MonitorCount y otra propiedad indexable, Monitores [Índice: Entero]: 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í.

+0

Gracias, utilicé Screen.MonitorCount como sugirieron usted y Jim. – stukelly

+6

También debe validar el monitor guardado antes de usar la configuración al inicio. De lo contrario, su ventana no aparecerá en absoluto en la pantalla si el usuario retira un monitor que solía estar allí. – anon6439

+0

Iniciar una aplicación en coordenadas de pantalla negativas siempre es divertido ver a los usuarios cómo mostrar la aplicación ... –

-4

No hago mucho con los sistemas de Windows, así que sugeriría un truco como este.

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

También puede ver qué api le dice a las dimensiones del monitor2.

+1

que sólo funcionará si ambos monitores tienen el mismo tamaño escritorio. – Re0sless

+0

@ReOsless: Ya. Como dije, es un truco. –

-3

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

Es posible que también pueda 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 dejaré aquí en caso de que alguien se encuentre con esta pregunta, pero necesita que la respondan para un entorno diferente.

+2

Delphi tiene abstracciones para cubrir todas estas funciones, desde la colección de Screen.Monitors hasta eventos de preconstrucción para controlar la posición del formulario. –

1

No es realmente la respuesta que su pregunta implica, 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 aplicarlas al inicio?

+0

Esta es la implementación más simple – benPearce

+2

Hay un problema con esto.¿Qué sucede si el segundo monitor se elimina de la computadora después de que la aplicación lo haya estado usando? (MySql Query Brower tiene este problema) –

25

El objeto Pantalla global (parte de Forms) tiene el concepto de Monitores. Creo que esto se añadió 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; 

usted podría utilizar cualquier desplazamiento desde esa posición positiva a poner en cualquier lugar en ese monitor. Puede obtener el ancho y la altura desde allí también para conocer las dimensiones.

+1

Gracias por el código de muestra, funcionó muy bien. – stukelly

-2

he hecho algo similar hace un tiempo 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; 
1
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; 
Cuestiones relacionadas