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;
Nguồn
2012-08-02 02:16:10
Tuy nhiên, các lỗi kiểu VCL khác. Xin vui lòng QC này. –
Địa chỉ web QC: http://qc.embarcadero.com/wc/qcmain.aspx –
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