2011-11-10 9 views
6

Hola, tengo un formulario con varios marcos dentro.Delphi 7 - Manejo de eventos MouseWheel para marcos incrustados en formularios?

Para algunos de los marcos, deseo desplazar los contenidos (o al menos manejar el evento de la rueda del mouse).

He intentado lo siguiente:

simplemente asignar un controlador de eventos OnMouseWheel para cada cuadro

Anulación del evento MouseWheel para el formulario principal:

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; 

Desafortunadamente tanto no se parecen a trabajar.

  • En el caso 1, el evento nunca se desencadena, sin embargo, se desencadena el controlador de rueda del mouse padre de formularios.
  • En el caso 2, el control que recibe el foco es el panel que contiene el cuadro al que deseo enviar el evento de la rueda del mouse.

Así que, en pocas palabras, ¿cómo puedo dirigir el evento mousewheel al control más alto que el cursor del mouse (independientemente de qué frame/parent/form etc. el cursor está)?

+0

Tome un vistazo a [estos SO respuestas] [ 1] probablemente lo ayuden. [1]: http://stackoverflow.com/questions/2472743/what-is-the-best-method-for-implementing-mouse-wheel-activity-in-delphi-vcl-form –

+0

posible duplicado de [¿Cómo dirigir la entrada de la rueda del mouse para controlar debajo del cursor en lugar de enfocar?] (http://stackoverflow.com/questions/2251019/how-to-direct-the-mouse-wheel-input-to-control -under-cursor-instead-of-focused) – Kromster

Respuesta

1

Para posponer el manejo de la rueda del ratón para un TWinControl sobre el que se encuentra actualmente el cursor del ratón, de anulación en su marco principal forman el método MouseWheelHandler utilizando un código como el siguiente:

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

Por alguna razón, este código produce StackOverflow cuando me desplazo sobre TMainForm – Kromster