Windows XP 中的网格化顶层窗口似乎并没有限制用户以数字的倍数调整大小。它适用于 X,但不适用于 Windows。我可以调整到任何像素大小。
Windows 窗口管理器不支持吗?我可以手动完成吗,也许通过将一些命令绑定到顶层的 resize 事件?
您说得对,它在 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}
正如您所看到的,这并不是特别简单!