Khi thay đổi kích thước biểu mẫu có nhiều điều khiển, biểu mẫu có vẻ không ổn định do nhấp nháy. Một số mẹo để thay đổi kích thước hình thức mượt mà hơn là gì?Làm cách nào để làm cho biểu mẫu của tôi thay đổi kích thước một cách trơn tru hơn?
Trả lời
procedure TForm1.WMEnterSizeMove(var Message:TWMMove);
begin
Self.DisableAlign;
end;
procedure TForm1.WMExitSizeMove(var Message:TWMMove);
begin
Self.EnableAlign;
end;
Thử sử dụng WM_SETREDRAW (not LockWindowUpdate).
Bạn cũng có thể xem DeferWindowPos.
+1, cả hai phần tư vấn rất tốt trong chính nó. Đây có lẽ sẽ không giúp đỡ với một hình thức VCL phức tạp bằng cách sử dụng liên kết, kiểm soát lồng nhau và như vậy, mặc dù. 'DeferWindowPos()' là giá trị thử nghiệm cho vị trí thủ công trong trình xử lý 'OnResize'. – mghie
Các biểu mẫu phức tạp thường được tạo thành từ các bảng lồng nhau và quá trình sơn lại có thể gây nhấp nháy. Nếu đây là trường hợp với dự án của bạn có hai giải pháp dễ dàng mà thể giúp đỡ:
- Vô hiệu hóa tài sản
FullRepaint
trên tấm của bạn. - Bật thuộc tính
DoubleBuffered
trên biểu mẫu của bạn. Bạn sẽ không tìm thấy thuộc tính này trên thanh tra đối tượng, vì vậy hãy đặtDoubleBuffered := true;
trong FormCreate.
Lưu ý rằng 'DoubleBuffered' giao dịch ít nhấp nháy hơn cho tốc độ cập nhật chậm hơn, một hiệu ứng có thể nhận thấy trên màn hình lớn, nơi thay đổi kích thước có thể trở thành" tăng vọt "với kích thước cửa sổ lớn hơn. – mghie
DoubleBuffered về cơ bản làm cho ứng dụng của bạn vô dụng trên Citrix và Terminal Server. –
>>> "DoubleBuffered về cơ bản làm cho ứng dụng của bạn vô dụng trên Citrix và Terminal Server" Bạn có thể chỉ định tại sao không? – Alex
Tôi đã có khoảng này như sau:
- Trong 'OnResize' sự kiện của mẫu đơn, có một thói quen để ẩn tất cả các điều khiển con và sau đó bắt đầu một giờ với một đánh dấu khoảng 500ms .
- Khi bộ hẹn giờ kích hoạt, tắt nó và sau đó đặt tất cả các điều khiển con để hiển thị.
Bằng cách chơi xung quanh với hoạt động này, bạn sẽ nhận được biểu mẫu trống khi bạn đang định kích thước, nhưng sau đó tự điền gọn khi bạn 'buông'.
Bri
Tôi nghĩ bạn sẽ thấy rằng việc xử lý các thông báo di chuyển nhập/thoát (với sửa đổi được ghi chú trong phần bình luận ở trên) sẽ tạo ra trải nghiệm người dùng tốt hơn vì bạn ít nhất có thể thấy biểu mẫu (chưa được) trong khi bạn thay đổi kích thước cửa sổ. – frogb
tôi tránh nhấp nháy bằng cách canh không quá phi alClient
thành phần mỗi phụ huynh, luôn luôn đi kèm với một alClient
(ví dụ một TPanel
) để chứa tất cả các thành phần khác. Nhóm chúng trong các bảng không có đường viền.
Giả sử bạn muốn sắp xếp ba thứ: alLeft
, alTop
và alClient
cho chế độ xem chính. Dont làm điều này: Form alTop alLeft alClient // your main view
Nhưng thay vì nhúng này như sau: Form alTop alClient // panel to avoid flicker alLeft alClient // your main view
Cùng câu chuyện cho nhúng vài alTop
yếu tố.
Đó là tốt tại ngăn ngừa nhấp nháy, nhưng nó cũng có vẻ để ngăn chặn sự liên kết hoàn toàn. Tôi đã thêm một cuộc gọi không hợp lệ sau khi bật căn chỉnh: không hoàn hảo, vì bạn không thể thấy chính xác hiệu ứng mà kích thước biểu mẫu sẽ có, nhưng ít nhất nó loại bỏ tất cả nhấp nháy trên biểu mẫu nhiều bảng phức tạp. – frogb
thủ tục WMEnterSizeMove (var Tin nhắn: TWMMove); tin nhắn WM_ENTERSIZEMOVE; quy trình WMExitSizeMove (var Tin nhắn: TWMMove); tin nhắn WM_EXITSIZEMOVE; không kích hoạt các sự kiện aproporiate. Trên thực tế quên đề cập đến nó là một khung và không phải là một hình thức nhưng tôi đoán rằng nó sẽ có được như vậy. – zz1433