gpt4 book ai didi

delphi - 在 Delphi 7 中的 OnMouseMove 事件中移动组件时如何减少 CPU 使用率?

转载 作者:行者123 更新时间:2023-12-03 14:58:08 26 4
gpt4 key购买 nike

在 Delphi 7 应用程序中,我想跟随鼠标移动组件。我正在做这样的事情:

procedure MyComponent.MouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
begin
AnotherComponent.Top := X;
AnotherComponent.Left := Y;
end;

当我移动鼠标时,在最近的 PC 上主核心的 CPU 使用率会达到 100%。

在这种情况下有什么想法或勾选来减少 CPU 使用率吗?

最佳答案

您可以创建一个 TTimer,每隔 0.10 秒左右轮询一次当前鼠标位置,然后根据当前鼠标位置定位“AnotherComponent”。

那么您就不会为鼠标移动的每个像素触发事件 - 您根本不需要控制组件上的任何 OnMouseMove 事件。

在我的计算机上,这基本上对性能没有任何影响。

procedure TForm1.Timer1Timer(Sender: TObject);
var
pt: TPoint;
begin
//Is the cursor inside the controlling component? if so, position some
//other control based on that mouse position.

GetCursorPos(pt);
if MouseWithin(pt.x,pt.y,MyComponent,Form1.Left,Form1.Top) then begin
//replace with whatever real positioning logic you want
AnotherComponent.Top := pt.y;
AnotherComponent.Left := pt.x;
end;
end;

function TForm1.MouseWithin(mouseX, mouseY: integer;
const comp: TWinControl; const ParentWindowLeft: integer;
const ParentWindowTop: integer): boolean;
var
absoluteCtrlX, absoluteCtrlY: integer;
begin
//take a control, and the current mouse position.
//tell me whether the cursor is inside the control.
//i could infer the parent window left & top by using ParentwindowHandle
//but I'll just ask the caller to pass them in, instead.

//get the absolute X & Y positions of the control on the screen
//needed for easy comparison to mouse position, which will be absolute
absoluteCtrlX := comp.Left + ParentWindowLeft;
absoluteCtrlY := comp.Top + ParentWindowTop +
GetSystemMetrics(SM_CYCAPTION);

Result := (mouseX >= absoluteCtrlX)
and (mouseX < absoluteCtrlX + comp.Width)
and (mouseY >= absoluteCtrlY)
and (mouseY <= absoluteCtrlY + comp.Height);
end;

关于delphi - 在 Delphi 7 中的 OnMouseMove 事件中移动组件时如何减少 CPU 使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/682451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com