tkBind.c
有三个函数:Tk_BindEvent
,MatchPattern
和ExpandPercents
,它们会针对文本或条目窗口小部件中发生的任何事件连续调用。它们具有指针,例如eventPtr
,bindPtr
和disPtr
,它们存储在窗口小部件上发生的任何类型的事件。这些指针也存储文本,但字符方式;我想知道整个字符串或文本存储在哪里?哪个链表是那个,或指向该链表的指针在哪里?
答案 0 :(得分:0)
在特定小部件中编辑的整个文本根本不存储在该文件中。所有文件都是从显示引擎转入一个事件(“按下了一个键!”,“鼠标被移动了!”,“点击了一个按钮!”,“一个小部件被调整大小!”等)进入使用bind
命令注册的Tcl代码的回调。
例如,使用条目小部件,正常的按键最终将通过(通过Tk的源代码分发中的…/library/entry.tcl
中注册的脚本进行路由):
bind Entry <KeyPress> {
tk::CancelRepeat
tk::EntryInsert %W %A
}
这是一个通用键事件Entry
的类绑定(因为它位于<KeyPress>
上),而不是像<KeyPress-BackSpace>
这样的更具体的绑定并且它按顺序执行两个命令。一个取消正在进行的任何键重复,另一个取消实际插入相关字符序列(%W
)的当前窗口小部件(%A
)。这是插入代码的样子:
proc ::tk::EntryInsert {w s} {
if {$s eq ""} {
return
}
catch {
set insert [$w index insert]
if {([$w index sel.first] <= $insert)
&& ([$w index sel.last] >= $insert)} {
$w delete sel.first sel.last
}
}
$w insert insert $s
EntrySeeInsert $w
}
如果没有实际的字符序列(如某些键序列可能发生的话),则不执行任何操作,尝试删除所选内容(如果不存在选择则静默失败),实际插入是否插入到插入的位置cursor是($w insert insert $s
),然后尝试确保插入光标的新位置对用户可见。
正在编辑的字符串实际上存储在条目小部件的内部模型中,在string
结构的Entry
字段中将其保存为UTF-8(在{{1}中声明) })。如果用户需要,该值也可以反映到Tcl变量中(参见…/generic/tkEntry.h
配置选项);这在实践中很常见,但不是普遍的或必需的。