如何确定Tcl_Obj是否是某种ttk::entity,例如ttk:entry? 我正在使用一个遗留的(桌面样式,如他们现在所知道的)Windows应用程序,主要是用C和C++构建的。当该应用程序在触摸屏Windows笔记本电脑上运行时,当用户在对话框屏幕上点击输入框时,我需要自动显示触摸键盘。这种行为非常常见,据我所知,Microsoft在Windows 8/8.1中禁用了以前的自动行为,并将在Windows 10中重新启用它
所以。。。我可以编程显示触摸键盘,这部分已经解决了。我现在要做的是捕捉ttk::entry小部件接收到焦点,然后激活键盘。最接近我的是tk8.5.9/generic/tkFocus.c。有一种称为Tk_FocusObjCmd的方法:如何确定Tcl_Obj是否是某种ttk::entity,例如ttk:entry? 我正在使用一个遗留的(桌面样式,如他们现在所知道的)Windows应用程序,主要是用C和C++构建的。当该应用程序在触摸屏Windows笔记本电脑上运行时,当用户在对话框屏幕上点击输入框时,我需要自动显示触摸键盘。这种行为非常常见,据我所知,Microsoft在Windows 8/8.1中禁用了以前的自动行为,并将在Windows 10中重新启用它,c++,tcl,tk,C++,Tcl,Tk,所以。。。我可以编程显示触摸键盘,这部分已经解决了。我现在要做的是捕捉ttk::entry小部件接收到焦点,然后激活键盘。最接近我的是tk8.5.9/generic/tkFocus.c。有一种称为Tk_FocusObjCmd的方法: /* *-------------------------------------------------------------- * * Tk_FocusObjCmd -- * * This function is invoked to proce
/*
*--------------------------------------------------------------
*
* Tk_FocusObjCmd --
*
* This function is invoked to process the "focus" Tcl command. See the
* user documentation for details on what it does.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* See the user documentation.
*
*--------------------------------------------------------------
*/
int
Tk_FocusObjCmd(
ClientData clientData, /* Main window associated with interpreter. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *CONST objv[]) /* Argument objects. */
{
除其他外,该方法还提供了一个Tcl_Obj对象数组。我要做的是找出被操作的对象是否属于某种类型,比如ttk::entry。如果是,我将启动触摸键盘。我尝试过使用object->typePtr->name,但这并不能满足我的期望,有时它会崩溃(还不知道为什么):
这就是我被困的地方。我将非常感谢任何能让我走上正确方向的见解。你做得完全错误。相反,您应该做的是假设您被传递了一个小部件名称(类似于
.a2.b5.c9
),然后让Tk告诉您具有该名称的小部件的类是什么
winfo class .a2.b5.c9
对于ttk::entry
的实例,这将返回TEntry
(除非您通过在小部件创建时传入-class
选项对其进行更改)
从C级开始,您可以使用Tk_class()
查询该类,该类使用单个Tk_窗口
参数(您可以通过Tk_NameToWindow
获取该参数,并传递参数值的字符串形式,然后您可以从Tcl_GetString
获取该参数)。但如果只使用Tcl\u VarEval
,假设窗口名不是邪恶的,可能会更简单
if(Tcl_VarEval(interp,“winfo类”,Tcl_GetString(objPtr),NULL)=Tcl_OK){
const char*className=Tcl_GetString(Tcl_GetObjResult(interp));
// ...
}
(真正谨慎或热衷于速度的人将使用
Tcl\u EvalObjv
,但这有点复杂。)非常感谢!我使用了你的示例技术,效果很好。当我在ttk::entry字段中单击时,它将类名显示为TEntry。
winfo class .a2.b5.c9