Smalltalk 当容器发生变化时,如何重新缩放子变形?

Smalltalk 当容器发生变化时,如何重新缩放子变形?,smalltalk,pharo,squeak,morphic,Smalltalk,Pharo,Squeak,Morphic,我正在探索MacOS中5.2版的Squeak 我正在矩形变形“r”内绘制线(多边形)。当我转换“r”时,线条会转换,但当我重新缩放“r”时,线条不会重新缩放 运行下面被剪断的按钮。然后使用光环平移并调整矩形“r”的大小。您将看到行“p”被转换,但没有重新缩放 r := RectangleMorph new. "[Pharo] r:= Morph.new." r extent: 500@500. r openInWindow. p := PolygonMorph vertic

我正在探索MacOS中5.2版的Squeak

我正在矩形变形“r”内绘制线(多边形)。当我转换“r”时,线条会转换,但当我重新缩放“r”时,线条不会重新缩放

运行下面被剪断的按钮。然后使用光环平移并调整矩形“r”的大小。您将看到行“p”被转换,但没有重新缩放

r := RectangleMorph new.
"[Pharo] r:= Morph.new."
r extent: 500@500.
r openInWindow. 

p := PolygonMorph 
        vertices: {(r left)@(r top). (r right)@(r bottom)}
        color: Color white borderWidth: 2 borderColor: Color white.

r addMorph: p.
我怎样才能让“p”重新缩放


再见

这可能不是您想要的完整答案,但分享我所做的,可能会帮助您在解决您感兴趣的问题方面取得一些进展

  • 我不是Squeak(或Pharo)用户,所以我从网上下载了Squeak
  • 将代码粘贴到工作区并执行
  • 复制您观察到的行为:调整矩形的大小对其多边形子变形没有影响
  • 弹出矩形菜单,看到“添加光环”项
  • 在某个地方编写了
    “添加光环”
    ,然后右键单击以将所有具有该文字的方法显示出来
  • 找到
    #addHalo:
    作为菜单项的关联消息
  • 插入一个
    halt
    来调试
    #addHalo:
  • Cmd+单击以带来光环并进行调试,直到我发现调整大小句柄将发送
    addGrow:with:
    添加到变形
  • 然后我看到
    addGrow:with:
    发送
    setextntfromhalo:
    ,而这发送
    extent:
  • 我的结论是,您需要一个新的
    RectangleMorph
    子类,当它接收到
    setExtentFromHalo:
    时,它会按比例调整其所有子变形的大小。关于

    ScalableRectangleMorph >> #setExtentFromHalo: aPoint
      current := self extent.
      super setExtentFromHalo: aPoint.
      scale := self extent - current / current.
      self submorphsDo: [:m | m extent: (m extent * scale) rounded]
    

    请尝试一下(我没有),并让我们知道它是如何进行的。

    我可以建议您自己进行更多的探索吗?调试
    p scale:1.2
    以查看它为什么会缩放。然后调试
    r scale:1.2
    ,看看它为什么不缩放。这应该会给你一些启示。在你的消息之后,我发现了CMD+D:/这将花费我很多时间来解释这一切。如果你能帮我一把,告诉我情况如何,如果我能得到我所要求的一切,我将不胜感激。无论如何,如果我有机会,我会下载Squeak并亲自尝试一下。但是没有承诺,所以继续调试。这是最有效的学习方法。好的,我会尽量从调试器中获取我能得到的,我对SmallTalk非常陌生。我也在Pharo(7.0.3 MacOS)中测试了脚本,类似的问题。当您移动调整光环时,矩形将接收
    doGrow:with:
    ,它依次发送
    setextfromHalo:
    ,它只发送
    范围:
    。因此,如果您创建了
    RectangleMorph
    的子类,该子类除了更改其
    范围
    之外,还更改了其所有子变形的
    范围
    (按比例),您应该会得到您想要的效果(通过使用新的子类而不是
    RectangleMorph
    )。非常感谢@Leandro解释您是如何分析问题的!明天早上我会试试!再见。为其子变形设置一个新的LayoutPolicy就足够了