gpt4 book ai didi

c++ - 我如何才能确定 Tcl_Obj 是否是某种 ttk::entity,例如 ttk:entry?

转载 作者:行者123 更新时间:2023-11-30 05:46:33 26 4
gpt4 key购买 nike

我正在使用主要使用 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_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,但这有点复杂。)

关于c++ - 我如何才能确定 Tcl_Obj 是否是某种 ttk::entity,例如 ttk:entry?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28860606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com