繁体   English   中英

如何确定Tcl_Obj是否是某种ttk ::实体,例如ttk:entry?

[英]How can I find out if a Tcl_Obj is a certain kind of ttk:: entity, such as ttk:entry?

我正在使用主要用C和C ++构建的旧式(现在称为桌面式)Windows应用程序。 当此应用程序在Windows触摸屏笔记本电脑上运行时,我需要在用户点击对话框屏幕上的输入框时自动显示触摸键盘。 此行为非常普遍,据我所知,Microsoft在Windows 8 / 8.1中禁用了此以前的自动行为,并将在Windows 10中重新启用它。

所以...我可以以编程方式显示触摸键盘,该部分已解决。 我现在想做的是在ttk :: entry小部件获得焦点然后激活键盘时捕获。 我最接近的是tk8.5.9 / generic / tkFocus.c。 有一种称为Tk_FocusObjCmd的方法:

 /*
 *--------------------------------------------------------------
 *
 * 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,但这并不能满足我的期望,有时会崩溃(还没有弄清楚为什么):

char *objectType = objv[1]->typePtr->name;

if (objectType)
{
    printf("Object Type: %s\n", objectType); // don't do this, it breaks sometimes.
}

这就是我卡住的地方。 我将不胜感激任何能帮助我朝正确方向发展的见识。

您这样做非常错误。 相反,您应该做的是假设您已传递了小部件名称(类似.a2.b5.c9 ),然后要求Tk告诉您具有该名称的小部件的类是什么。

winfo class .a2.b5.c9

对于ttk::entry的实例,这将返回TEntry (除非您通过在创建小部件时传入-class选项对其进行了更改)。

从C级别开始,您将使用Tk_Class()来查询该类, Tk_Class()带有一个Tk_Window参数(您可以通过Tk_NameToWindow获取,以参数值的字符串形式传递,然后可以从Tcl_GetString获取)。 。 但是使用Tcl_VarEval ,假设非邪恶的窗口名称,可能会更简单……

if (Tcl_VarEval(interp, "winfo class ", Tcl_GetString(objPtr), NULL) == TCL_OK) {
    const char *className = Tcl_GetString(Tcl_GetObjResult(interp));
    // ...
}

(真正谨慎或真正热衷速度的人将使用Tcl_EvalObjv ,但这要复杂一些。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM