Hi I have a form with several frames inside.
For some of the frames, i wish to scroll the contents (or at least handle the mousewheel event).
I have tried the following:
Simply assigning a OnMouseWheel event handler for each frame
Overriding the MouseWheel event for the parent form:
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;
Unfortunately both dont seem to work.
So, put simply, how can i direct the mousewheel event to the top most control that the mouse cursor is over (regardless of which frame/parent/form etc the cursor is in)?
To postpone mouse wheel handling to a TWinControl
over which is currently mouse cursor, override in your main frame form the MouseWheelHandler
method using a code like this:
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With