Windows XP中的网格顶层窗口似乎不会限制用户以数字的倍数调整大小。它适用于X,但不适用于Windows。我可以调整大小到任何像素大小。
Windows Windows管理器不支持吗?我可以手动完成,可能是通过将一些命令绑定到顶层的resize事件吗?
答案 0 :(得分:3)
你说它在Windows上不能正常工作(对于Mac OS X / Aqua也是如此)是正确的,这是因为窗口管理器本身不支持该功能。你必须用一些脚本来合成它。 然而真正的复杂性是典型的网格化窗口不仅仅是一个网格窗口;它周围有一些额外的空间可以使更新的大小进入下一个网格大小,这会使窗口扩大一点并再次调整大小......一次又一次......
因此,我们需要一个两阶段的初始化,首先测量我们必须允许的额外空间的实际大小,然后才应用强制执行代码。
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}
正如您所看到的,要想做到这一点并不是特别简单!