2008-10-15 40 views
17

Có cách nào để chỉ định trình giám sát nào sẽ xuất hiện trên trình ứng dụng Delphi hoặc C++ Builder không?Bắt đầu chương trình trên màn hình thứ hai?

Tôi đang phát triển một chương trình đơn giản cho khách hàng, hiển thị các đơn đặt hàng nhà bếp trên màn hình phụ, được tạo ra bởi hệ thống khách sạn. Hiện tại, họ cần phải tự kéo cửa sổ lên màn hình thứ hai sau khi nó bắt đầu.

Trả lời

22

Lưu vị trí cửa sổ trước khi tắt chương trình và khôi phục chúng khi khởi động. Multimonitor hiển thị chỉ tăng kích thước của desktop; các bề mặt màn hình khác chỉ có một phần khác nhau của cùng một mặt phẳng X/Y với nguồn gốc của nó ở phía trên bên trái của màn hình chính.

Điều này có thể được thực hiện tự động cho bạn theo số any of several components.

BTW, Biến màn hình trong đơn vị Biểu mẫu có thuộc tính được gọi là MonitorCount và một thuộc tính có thể lập chỉ mục khác, Màn hình [Chỉ mục: Số nguyên]: TMonitor. TMonitor có các thuộc tính chỉ ra bên trái, trên cùng, chiều rộng, chiều cao, vv, vì vậy tất cả thông tin bạn cần đều có.

+0

Cảm ơn, tôi đã sử dụng Screen.MonitorCount như bạn và Jim đã đề xuất. – stukelly

+6

Bạn cũng nên xác nhận màn hình đã lưu trước khi sử dụng các cài đặt khi khởi động. Nếu không, cửa sổ của bạn sẽ không hiển thị trên màn hình nếu người dùng xóa một màn hình đã từng ở đó. – anon6439

+0

Bắt đầu một ứng dụng trên tọa độ màn hình phủ định luôn vui vẻ khi xem người dùng cách hiển thị ứng dụng ... –

-4

Tôi không làm gì nhiều với hệ thống cửa sổ, vì vậy tôi sẽ đề xuất một hack như thế này.

Lấy chiều rộng của màn hình có thể xem (cả hai màn hình được kết hợp), chia một nửa và làm cho vị trí bắt đầu của bạn.

Bạn cũng có thể xem những gì api cho bạn biết kích thước của màn hình.

+1

Điều đó sẽ chỉ làm việc nếu cả hai màn hình có màn hình cùng kích thước. – Re0sless

+0

@ReOsless: Ya. Giống như tôi đã nói đó là một hack. –

-3

Windows sẽ cho phép bạn chỉ định tọa độ của cửa sổ trong lệnh gọi API CreateWindow. Tôi không biết đủ về Delphi hoặc C++ Builder để biết nếu bạn có quyền truy cập vào phần đó của quá trình.

Bạn cũng có thể di chuyển cửa sổ trong trình xử lý WM_CREATE.

EnumDisplayMonitors sẽ cung cấp cho bạn tọa độ của từng màn hình trong hệ thống.


Rõ ràng Delphi và C++ Builder có cơ sở làm cho câu trả lời này hơi liên quan. Tôi sẽ để nó ở đây trong trường hợp ai đó đi qua câu hỏi này nhưng cần nó trả lời cho một môi trường khác.

+2

Delphi có abstractions để bao gồm tất cả các chức năng này, từ Screen.Monitors bộ sưu tập thông qua các sự kiện trước khi xây dựng để kiểm soát vị trí hình thức. –

1

Không thực sự là câu trả lời cho câu hỏi của bạn, nhưng bạn không thể lưu trữ các cài đặt cửa sổ (kích thước, vị trí, trạng thái tối đa) khi nào ứng dụng đóng, sau đó áp dụng chúng khi khởi động?

+0

Đây là cách triển khai đơn giản nhất – benPearce

+2

Có vấn đề với điều này.Điều gì xảy ra nếu montor thứ hai bị xóa khỏi máy tính sau khi ứng dụng đang sử dụng nó? (MySql Query Brower có vấn đề này) –

25

Đối tượng màn hình toàn cục (một phần của Biểu mẫu) có khái niệm về Màn hình. Tôi nghĩ rằng đây đã được bổ sung khoảng Delphi 6 hoặc 7. Các mã sau đây sẽ làm việc:

// 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; 

Bạn có thể sử dụng bất kỳ tích cực bù đắp từ vị trí đó để đặt nó ở bất cứ đâu trong màn hình đó. Bạn cũng có thể lấy chiều rộng và chiều cao từ đó để biết kích thước.

+1

Cảm ơn mã mẫu, nó hoạt động rất tốt. – stukelly

-2

Tôi đã làm một điều tương tự trong một thời gian trước trong 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; 
Các vấn đề liên quan