2011-11-10 40 views
6

Xin chào, tôi có một biểu mẫu có nhiều khung bên trong.Delphi 7 - Xử lý sự kiện MouseWheel cho Khung được nhúng trong Biểu mẫu?

Đối với một số khung, tôi muốn cuộn nội dung (hoặc ít nhất là xử lý sự kiện con lăn chuột).

Tôi đã thử những điều sau đây:

Đơn giản chỉ cần gán một xử lý sự kiện OnMouseWheel cho mỗi khung

Trọng sự kiện mousewheel cho form cha:

procedure TFmReview.MouseWheelHandler(var Message: TMessage); 
var Control: TControl; 
begin 
    Control := ControlAtPos(ScreenToClient(SmallPointToPoint(TWMMouseWheel(Message).Pos)), False, True); 
    if Assigned(Control) and (Control <> ActiveControl) then 
    begin 
     ShowMessage(Control.Name); 
     Message.Result := Control.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam); 
     if Message.Result = 0 then 
      Control.DefaultHandler(Message); 
    end else inherited MouseWheelHandler(Message); 
end; 

Đáng tiếc là cả hai không có vẻ làm việc.

  • Trong trường hợp 1, sự kiện sẽ không bao giờ được kích hoạt, tuy nhiên, trình xử lý bánh xe chuột được kích hoạt.
  • Trong trường hợp 2, điều khiển nhận tiêu điểm là bảng chứa khung tôi muốn gửi sự kiện con lăn chuột tới.

Vì vậy, chỉ đơn giản là, làm cách nào tôi có thể điều khiển sự kiện con lăn đến phần điều khiển trên cùng mà con trỏ chuột kết thúc (bất kể con trỏ/khung hình/con trỏ ở đâu)?

+0

Hãy xem [những SO câu trả lời] [ 1] họ có thể sẽ giúp đỡ. [1]: http://stackoverflow.com/questions/2472743/what-is-the-best-method-for-implementing-mouse-wheel-activity-in-delphi-vcl-form –

+0

có thể trùng lặp của [Làm thế nào để chỉ đạo đầu vào bánh xe chuột để điều khiển theo con trỏ thay vì tập trung?] (http://stackoverflow.com/questions/2251019/how-to-direct-the-mouse-wheel-input-to-control -under-cursor-thay-of-focus) – Kromster

Trả lời

1

Để hoãn xử lý bánh xe chuột để một TWinControl trên mà hiện nay là chuột con trỏ, ghi đè trong khung chính của bạn hình thành phương pháp MouseWheelHandler sử dụng một mã như thế này:

type 
    TMainForm = class(TForm) 
    private 
    procedure MouseWheelHandler(var AMessage: TMessage); override; 
    public 
    { Public declarations } 
    end; 

implementation 

procedure TMainForm.MouseWheelHandler(var AMessage: TMessage); 
var 
    Control: TWinControl; 
begin 
    Control := FindVCLWindow(SmallPointToPoint(TWMMouseWheel(AMessage).Pos)); 
    if Assigned(Control) then 
    begin 
    AMessage.Result := Control.Perform(CM_MOUSEWHEEL, AMessage.WParam, 
     AMessage.LParam); 
    if AMessage.Result = 0 then 
     Control.DefaultHandler(AMessage); 
    end 
    else 
    inherited MouseWheelHandler(AMessage); 
end; 
+0

Vì một số lý do mã này tạo StackOverflow khi tôi cuộn trên TMainForm – Kromster

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