[英]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.