Windows中的网格几何不限制调整大小

时间:2012-11-10 06:18:19

标签: tcl tk

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

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

1 个答案:

答案 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}

正如您所看到的,要想做到这一点并不是特别简单!