gpt4 book ai didi

c# - 无垃圾客户端坐标

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:45 26 4
gpt4 key购买 nike

我想在我的 winform 中获取鼠标的坐标。

  myMousePosition = myForm.PointToClient(Control.MousePosition)

这可行,但会产生垃圾(堆分配)。因为我经常调用此方法,所以这是个问题。

  myMousePosition.X = Control.MousePosition.X - myForm.Location.X;
myMousePosition.Y = Control.MousePosition.Y - myForm.Location.Y;

这不起作用,因为还需要考虑标题栏。有什么建议吗?

编辑:更多信息。 VS2010 分析向导说当我使用 PointToClient 方法时生成了数千个 drawing.point 类型的实例。问题是,我没有在 Update 方法中创建新变量,那么这些实例来自哪里?

public sealed class InputManager
{
private System.Drawing.Point mPos;

public InputManager()
{
mPos = new System.Drawing.Point(0, 0);
}
//////////////////////////////////////////////////////////////////////////

public void Update()
{
mPos = myForm.PointToClient(Control.MousePosition);
}
}

最佳答案

这是 code对于 PointToClient()

public Point PointToClient(Point p) { 
return PointToClientInternal(p);
}

internal Point PointToClientInternal(Point p) {
NativeMethods.POINT point = new NativeMethods.POINT(p.X, p.Y);
UnsafeNativeMethods.MapWindowPoints(NativeMethods.NullHandleRef, new HandleRef(this, Handle), point, 1);
return new Point(point.x, point.y);
}

PointToClient() 调用 PointToClientInternal(),它会创建一个新的 NativeMethods.POINT 实例。

这是 NativeMethods.POINT:

[StructLayout(LayoutKind.Sequential)] 
public class POINT {
public int x;
public int y;

public POINT() {
}

public POINT(int x, int y) {
this.x = x;
this.y = y;
}
}

所以我认为这就是您的堆分配的来源。调用 PointToClient() 会导致实例化一个新的 NativeMethods.POINT 对象(请注意,这是一个类,而不是结构)。

如果这是您的应用程序中的问题,我建议仅在您实际需要该值时才调用 PointToClient()。您也可以查看使用 MapWindowPoints()直接,但这可能是可取的,也可能不是可取的。

关于c# - 无垃圾客户端坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13750394/

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