2009-09-21 29 views

Trả lời

13
procedure TForm1.WMEnterSizeMove(var Message:TWMMove); 
begin 
    Self.DisableAlign; 
end; 

procedure TForm1.WMExitSizeMove(var Message:TWMMove); 
begin 
    Self.EnableAlign; 
end; 
+0

Đó 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

+0

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

4

Thử sử dụng WM_SETREDRAW (not LockWindowUpdate).

Bạn cũng có thể xem DeferWindowPos.

+1

+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

4

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 đỡ:

  1. Vô hiệu hóa tài sản FullRepaint trên tấm của bạn.
  2. 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 đặt DoubleBuffered := true; trong FormCreate.
+1

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

+1

DoubleBuffered về cơ bản làm cho ứng dụng của bạn vô dụng trên Citrix và Terminal Server. –

+1

>>> "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

1

Tôi đã có khoảng này như sau:

  1. 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 .
  2. 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

+1

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

0

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, alTopalClient 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ố.

Các vấn đề liên quan