代码之家  ›  专栏  ›  技术社区  ›  Tom Juergens

control.pointtoscreen提供不同的结果-为什么?

  •  0
  • Tom Juergens  · 技术社区  · 17 年前

    我在窗体的面板控件上有一些标签控件。我想获取标签相对于窗体原点的位置,以便在运行时隐藏面板和标签,并在它们的位置直接在窗体上绘制其他文本。

    基本上,我要做以下计算:用control.pointToScreen()获取标签的绝对屏幕位置,然后用control.pointToClient()将其转换回相对位置,因此:

    Dim newloc As Point = Me.PointToClient(ctl.PointToScreen(Point.Empty))
    

    Dim newloc As Point = Me.PointToClient(ctl.Parent.PointToScreen(ctl.Location))
    

    我发现,这两种方法有时会给我不同的结果-把我的新点放在可见区域之外,用负值!-但还不能确定原因。我本以为它们应该是相同的(大多数时候是相同的)。

    第一次看医生对我没有帮助,但也许我跳过了一些事情…不管怎样,在我开始扯头发之前,我会感谢你的帮助。

    或者,另一方面,有没有更好的方法来做到这一点?

    编辑:示例结果

    这是一个真实的例子。

    label1在x=4,y=6在面板1上;label2在x=163,y=6在同一父面板上,面板1上。显然,我期待不同的X位置,但Y应该两者相同。

    当我运行项目时

    ctl.PointToScreen(Point.Empty)
    ctl.Parent.PointToScreen(ctl.Location)
    在x=959,y=119处为Label1提供相同的屏幕位置(当然,这里的绝对值可能会随表单本身的位置而变化),因此在应用me.pointToClient时,相对于表单的正确位置(在x=5,y=32)。

    接下来的几行对label2执行相同的计算(记住,相同的父级,父级(6)中相同的y值),但结果完全关闭:ctl.parent.pointToScreen()给出x=1114,y=63。X几乎是正确的(959-4+163=1118),但Y离我为Label1得到的119远不远。然后ctl.pointtoscreen()给出x=166,y=29-转换回形式坐标(me.pointtoclient)x=-784,y=-2。

    这些数字是计算出来的,然后直接打印到调试窗口中,而不移动任何东西…疯狂。

    好吧,这变得相当混乱,但我还是希望有人能有一个简单的解释。谢谢!

    2 回复  |  直到 17 年前
        1
  •  3
  •   Tom Juergens    17 年前

    好的,我找到了解决方案。

    我碰巧打电话给control.pointtoscreen 之前 已创建控件:control.ishandleCreated=false。

    如果我确保首先创建控件(control.createControl),两个方法的工作效果都一样好。

    我在后续调用中得到不同结果的原因是,对control.pointtoscreen的第一次调用也会导致创建控件(因此它的父控件和位于父控件上的任何其他控件),这意味着第二次调用成功。

    好吧,我很高兴能完成这件事——)

        2
  •  0
  •   micahtan    17 年前

    我想是睡觉。):而不是:

    ctl.pointtoscreen(point.empty)

    ctl.parent.pointtoscreen(ctl.location)

    尝试:

    ctl.pointtoscreen(point.empty)

    ctl.pointtoscreen(ctl.location)//注意没有。父级!

    相反,你会看到x/y坐标的不同。

    另外,尝试使用control.topLevelControl或control.findform()在进行指向屏幕的数学运算时获取最外层的表单。