1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
type
TOpenControl = class(TControl)
// accès à DoMouseWheel qui est "protected"
end;
function TScrollBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint): Boolean;
begin
{ ATTENTION !
Sous Windows 7 c'est le TV qui a le focus qui capte le MouseWheel
sous Windows 10 c'est le composant sous la souris qui reçoit le message
cela donne des différences de comportement
la version du code actuel est testée sous W10 uniquement
}
Result := inherited; // on laisse une chance aux enfants de gérer l'évènement
if Result = False then
begin
// W10: le message est envoyé au TV sous la souris et remonte ici, il ne faut pas l'intercepter !
if FindVCLWindow(MousePos) is TBaseVirtualTree then
begin
Exit(False); // on ne le gère pas nous même
end;
// Windows 10 répond False sur une combo quand la souris est en dehors du component
if (Screen.ActiveControl <> nil) and IsChildOf(Self, Screen.ActiveControl) then
begin
Result := TOpenControl(Screen.ActiveControl).DoMouseWheel(Shift, WheelDelta, MousePos);
if Result then
Exit;
end;
if WheelDelta > 0 then
Perform(WM_VSCROLL, 0, 0)
else
Perform(WM_VSCROLL, 1, 0);
Result := True;
end;
end;
// ...
function TComboBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint): Boolean;
begin
Result := inherited or DroppedDown; // évite un détachement de la popup dans un TScrollBox
end;
// ...
function TDateTimePicker.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint): Boolean;
begin
Result := inherited or DroppedDown;
end; |
Partager