0

Windows XP 中的网格化顶层窗口似乎并没有限制用户以数字的倍数调整大小。它适用于 X,但不适用于 Windows。我可以调整到任何像素大小。

Windows 窗口管理器不支持吗?我可以手动完成吗,也许通过将一些命令绑定到顶层的 resize 事件?

4

1 回答 1

3

您说得对,它在 Windows 上并不真正工作(Mac OS X/Aqua 也是如此),这是因为窗口管理器本身不支持该功能。你必须用一些脚本来合成它。然而真正的复杂之处在于,一个典型的网格窗口不仅仅是一个网格窗口。它周围有一些额外的空间,可以使更新后的大小进入下一个网格大小,并使窗口扩大一点并再次调整大小……一次又一次……</p>

因此,我们需要一个两阶段的初始化,首先测量我们必须允许的额外空间的实际大小,然后才应用执行代码。

package require Tk

proc initGrid {window w h} {
    # Do nothing for subwindows
    if {$window ne [winfo toplevel $window]} return

    lassign [wm grid $window] xcount ycount xstep ystep
    set wExtra [expr {$w - $xcount*$xstep}]
    set hExtra [expr {$h - $ycount*$ystep}]
    bind $window <Configure> [list resizeGrid $wExtra $hExtra %W %w %h]
}
proc resizeGrid {wExtra hExtra window w h} {
    # Do nothing for subwindows
    if {$window ne [winfo toplevel $window]} return

    lassign [wm grid $window] xcount ycount xstep ystep
    if {$w-$wExtra != $xcount*$xstep || $h-$hExtra != $ycount*$ystep} {
        set w [expr {($w - $wExtra)/$xstep}]
        set h [expr {($h - $hExtra)/$ystep}]
        wm grid $window $w $h $xstep $ystep
    }
}

pack [text .t -setgrid 1] -fill both -expand 1
bind . <Configure> {initGrid %W %w %h}

正如您所看到的,这并不是特别简单!

于 2012-11-10T08:13:23.277 回答