2012-06-07 21 views
22

Trên hệ thống đa màn hình, ứng dụng VCL "trống" tối đa hóa tiền phạt, nhưng ứng dụng tương tự đã bật kiểu (và một ứng dụng được chọn làm mặc định) sẽ tối đa hóa không chính xác. Những gì tôi thấy là cạnh bên phải của cửa sổ mở rộng lên màn hình thứ 2 (chính của tôi là ở bên trái). Khi tôi bắt đầu so sánh với các ứng dụng Windows khác, tôi nhận thấy rằng trong Windows 7 (ít nhất), các cửa sổ tối đa thậm chí không có viền không phải của máy khách ở bên trái, bên phải hoặc bên dưới. Và thực sự, ứng dụng VCL tiêu chuẩn (không theo kiểu) hoạt động theo cách tương tự, không có biên giới không phải của khách hàng.Tôi có thể làm gì về cửa sổ được tối đa hóa, theo kiểu hiển thị đường viền trên màn hình liền kề?

Làm cách nào để khắc phục sự cố này? Tôi nhận thấy rằng TFormStyleHook có một trình xử lý cho WMNCCalcSize, mà tôi chưa phân tích, nhưng làm cho tôi tự hỏi nếu VCL có thể xử lý không chính xác thông điệp này cho một cửa sổ tối đa.

+5

Tuy nhiên, các lỗi kiểu VCL khác. Xin vui lòng QC này. –

+1

Địa chỉ web QC: http://qc.embarcadero.com/wc/qcmain.aspx –

+0

Bạn có thể sao chép hành vi này trong một màn hình không? Tôi hỏi vì trên vị trí hiện tại của tôi, tôi không có một màn hình khác để kiểm tra vấn đề này. – RRUZ

Trả lời

5

Sau khi bỏ qua một số thời gian về vấn đề này, tôi thực hiện, đây không phải là lỗi kiểu vcl. Điều này thực sự liên quan đến hành vi trong số article được đề cập trong một câu hỏi comment cho câu hỏi theo số mghie.

Hành vi cụ thể là, kích thước của cửa sổ được phóng to lớn hơn vùng làm việc của màn hình mà cửa sổ được phóng to. Được cho là, trình quản lý cửa sổ ẩn các đường viền nhô ra. Rõ ràng, nó không hoàn toàn làm như vậy với khung tùy chỉnh. Lưu ý rằng custom window frame example của MSDN có vẻ như bị cùng một vấn đề (tham khảo bài đăng có tiêu đề "Lỗi khi cửa sổ được tối đa hóa" trong nội dung cộng đồng). Ứng dụng của VCL khác với ví dụ MSDN ở chỗ nó không dựa trên DWM, nhưng tôi vẫn nghĩ đó là vấn đề tương tự.

Đường viền nhô ra có kích thước đường viền kích thước hệ thống (SM_C [X | Y] SIZEFRAME), nhưng điều này không liên quan đến giải pháp bên dưới vì nó bỏ qua kích thước/vị trí được đề xuất của hệ điều hành và sử dụng khu vực làm việc.

Rất tiếc, tôi không nghĩ rằng giải pháp này có thể sử dụng được. Đối với một, hành vi được đề cập không phải là tài liệu, đối với hai, workaround không phải là hoàn hảo; vẫn còn một điểm ảnh lạ. Nếu bạn chụp chính xác cửa sổ trên vùng làm việc, trình quản lý cửa sổ sẽ quyết định dời cửa sổ đến nơi mà cửa sổ cho rằng cửa sổ (có khung ẩn) nên được đặt. (VCL có thể được sửa đổi để làm những gì người quản lý cửa sổ làm, và đưa vào tài khoản nhô ra và không vẽ chúng hoặc một cái gì đó tương tự, nhưng nó sẽ được nhiều công việc và nó vẫn sẽ là workaround hành vi không có giấy tờ ..)

Dù sao;

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    // overriding styles is not necessary since TFormStyleHook.WMGetMinMaxInfo 
    // first calls the default window procedure 
    procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); 
     message WM_GETMINMAXINFO; 

.. 

procedure TForm1.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); 
var 
    R: TRect; 
begin 
    // always arrives with MinMaxInfo.ptMaxPosition = (-SM_CXFRAME, -SM_CYFRAME) 
    // and MinMaxInfo.ptMaxSize = (PrimaryMonitor.Width (?) + 2 * SM_CXFRAME, ...) 
    inherited; 

    // should test for OS, styles etc. before running the below 
    R := Monitor.WorkareaRect; 
    InflateRect(R, -1, -1);    // odd pixel 
    OffsetRect(R, -Monitor.Left, -Monitor.Top); 
    Message.MinMaxInfo.ptMaxPosition := R.TopLeft; 
    Message.MinMaxInfo.ptMaxSize := Point(R.Width, R.Height); 
end; 
+0

Raymond đặc biệt nói "lừa thị giác" vì vậy tôi cho rằng chúng tôi không thay đổi kích thước cửa sổ trực tràng, nhưng chỉ cần cắt các biên giới nhô ra? – whosrdaddy

+0

@whos - Chắc chắn, nó sẽ tốt hơn nhiều (cũng sẽ loại bỏ các khung bên trong). Tôi nghĩ chúng tôi cần sự hợp tác của VCL cho điều đó, nhưng có lẽ không. –

0

Cách duy nhất tôi tìm thấy là xử lý sự kiện WM_SIZE và sửa đổi vùng cửa sổ để cắt biên phụ.