windows - mus hjul begivenhed

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en formular med mange kontroller (treeview, memo, listbox, paneler osv.).


Jeg vil flytte rullestængerne til disse knapper automatisk, når musen er over komponenterne, og hjulet rulles.


Ligesom hvordan rad studios inspektør bar, værktøjskasse, projekt manger arbejder.


Og det er umuligt at skrive den samme kode på hver enkelt kontrol (mere end 11 kontroller indtil nu)



  [[Redigeret]]

  
  

    Tak for alle dine svar, men

    
    kontroller som knapper ikke har
    scroll-barer så deres forældre (ligesom
    paneler, rammer) skal flyttes når
    mus hjulet er flyttet over knapperne (barnet kontrol)

  


Bedste reference


Tilføj en TApplicationEvents til din formular, og tilføj en OnMessage handler:


procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  pnt: TPoint;
  ctrl: TWinControl;
begin
  if Msg.message = WM\_MOUSEWHEEL then
  begin
    if not GetCursorPos(pnt) then Exit;
    ctrl := FindVCLWindow(pnt);
    if Assigned(ctrl) then
    begin
      SendMessage(ctrl.Handle, Msg.message, Msg.wParam, Msg.lParam);
      Handled := true; // or maybe Msg.message := WM\_NULL;
    end;
  end;
end;


Opdater


David Heffernan [[se kommentarerne]] kom på en smart måde at forbedre denne kode på:


procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  pnt: TPoint;
  ctrl: TWinControl;
begin
  if Msg.message = WM\_MOUSEWHEEL then
  begin
    if not GetCursorPos(pnt) then Exit;
    ctrl := FindVCLWindow(pnt);
    if Assigned(ctrl) then
      Msg.hwnd := ctrl.Handle;
  end;
end;