Canvas 画布的宽度有限制吗

Canvas 画布的宽度有限制吗,canvas,tcl,tk,Canvas,Tcl,Tk,画布属性“宽度”的值是否有限制 在下面的示例中,我在滚动窗口中创建了一个画布 # Packages package require BWidget # Mainframe set mfr [MainFrame .mfr -textvariable "Test"] pack $mfr -fill both -expand yes # Create a Paned Window with two panes set pw1 [PanedWindow [$mfr getframe].pw1 -si

画布属性“宽度”的值是否有限制

在下面的示例中,我在滚动窗口中创建了一个画布

# Packages
package require BWidget

# Mainframe
set mfr [MainFrame .mfr -textvariable "Test"]
pack $mfr -fill both -expand yes

# Create a Paned Window with two panes
set pw1 [PanedWindow [$mfr getframe].pw1 -side left]
set pat [$pw1 add -minsize 200]
set pai [$pw1 add -minsize 200]
pack $pw1 -fill both -expand yes -anchor nw

# Create a frame for each pane
set tft [TitleFrame $pat.tft -text "Scrollable Canvas"]
set tfi [TitleFrame $pai.tfi -text "Informations"]
pack $tft -fill both -expand yes -anchor nw
pack $tfi -fill both -expand yes -anchor nw

# Create a canvas inside a ScrolledWindow for the first pane
set swt [ScrolledWindow [$tft getframe].swt -relief sunken -borderwidth 2 -scrollbar horizontal -auto none]
set sft [ScrollableFrame $swt.sft -width 50000 -height 200]
$swt setwidget $sft
set tab [canvas [$sft getframe].tab -width 50000 -height 200 -background black]
# Draw an horizontal line on the canvas
$tab create line 0 100 50000 100 -width 1 -fill white

pack $tab -fill both -expand yes -anchor nw
pack $swt -fill both -expand yes -anchor nw

# Create a ScrolledWindow for the second pane
set swl [ScrolledWindow [$tfi getframe].swl -relief sunken -borderwidth 2 -scrollbar vertical -auto both]
pack $swl -expand yes -fill both

# Display the window manager
wm minsize . 600 350
wm deiconify .
wm protocol . WM_DELETE_WINDOW {exit}
bind . <Control-q> {exit}
#包
包需要BWidget
#主机
设置mfr[MainFrame.mfr-textvariable“Test”]
包装$mfr-填充两个-展开“是”
#创建包含两个窗格的窗格窗口
设置pw1[PanedWindow[$mfr getframe].pw1-左侧]
设置pat[$pw1添加-minsize 200]
设置pai[$pw1添加-分钟200]
包装$pw1-填充两个-扩展是-锚定nw
#为每个窗格创建一个框架
设置tft[标题框$pat.tft-文本“可滚动画布”]
设置tfi[标题框$pai.tfi-文本“信息”]
包装$tft-填充两个-扩展是-锚定nw
包装$tfi-填充两个-展开是-锚定nw
#在滚动窗口内为第一个窗格创建画布
设置swt[ScrolledWindow[$tft getframe].swt-浮雕凹陷-边框宽度2-滚动条水平-自动无]
设置sft[可滚动框架$swt.sft-宽度50000-高度200]
$swt setwidget$sft
设置选项卡[canvas[$sft getframe]。选项卡-宽度50000-高度200-背景黑色]
#在画布上画一条水平线
$tab创建线0 100 50000 100-宽度1-填充白色
打包$tab-填充两个-展开是-锚定nw
包装$swt-填充两个-扩展是-锚定nw
#为第二个窗格创建一个滚动窗口
设置swl[ScrolledWindow[$tfi getframe].swl-浮雕凹陷-边框宽度2-滚动条垂直-自动两者]
包装$swl-展开“是”-填写两个
#显示窗口管理器
wm minsize。600 350
wm去神化。
wm协议。WM_删除_窗口{exit}
绑定{exit}
在本例中,我使用了宽度为“50000”的画布,但当我使用滚动条时,画布的黑框在前面结束。同样的问题也会影响画布上绘制的水平线

我错过什么了吗? 画布的“宽度”属性是否有已知的限制


感谢您的帮助

如果将它们设置为大于32000(严格地说是32767,是有符号的C
short
的限制),尤其是在渲染层(而且绝对不要将画布视口设置为该大小!),事情会变得有点古怪。然而,底层的canvas模型使用IEEE
double
s来存储坐标,因此没有理由不让事情偏离那么远。您只需将单个对象的大小保持在较低的水平


这都是X11的遗留版本,它在许多关键结构中使用16位值作为坐标和维度。改变这一点在逻辑上很容易,但在实践中需要做大量工作(假设无处不在)。

是的,我最近没有看到最近浏览器画布大小的最大值,但它们过去的宽度或高度为8k-12k,最大像素为2mb。依我看,创建过大的画布尺寸通常是为了“展平”设计要求。如果由于画布大小而遇到问题(例如,超出了浏览器的最大大小),则应将此视为将设计更改为不太平坦的信号。渲染所需的缓冲区大小完全取决于视口(画布的可见部分)的大小。但是坐标计算在绘制坐标时有点不稳定,坐标超出了视口中可见的
短范围(转换为视口坐标后)。谢谢你的回答。所以我可以在画布上绘制坐标高于其视图大小的图形项目,并且我必须使用滚动条来移动画布的可视部分?