有人想开发这样一个功能,说界面上有一个多行文本编辑框,他希望用户按下 TAB 按键后可以将输入焦点导航至其他控件,而不是在文本框里默认地输入一个 TAB 字符。
如果是你,你觉得应该怎样做呢?
他琢磨了一下,觉得应该使用子类化的方式来实现这项功能,代码如下:
我想说的是,上图中的做法,有很多错误。
您可以花费大量时间挑剔小细节,例如:
如果未能正确设置对话框中的焦点会怎样?
是否考虑嵌套对话框的场景?
是否无法处理 SHITF + TAB 导航键的情况?
如果控件不是对话框的一部分,那怎么办?
但所有这些小细节都忽略了大局: 与其与对话管理器作斗争,重新实现我们想要保留的所有部分,而忽略我们想要跳过的部分,不如与对话管理器紧密合作,并以对话管理器期望的方式表达我们的意图。
上面这段话可能有点绕弯儿,请继续看。
这是点一个没有泡菜的汉堡包和点一个有泡菜的汉堡包之间的区别,然后在你拿到汉堡时小心翼翼地从汉堡上挑出泡菜。
(编者注: 汉堡?泡菜!)
在这种情况下,我们希望防止编辑控件说”给我 TAB 键”。我们上次看到,这是通过 (1) 设置 DLGC_WANTTAB 对话框代码或 (2) 在给定 TAB 键消息时用 DLGC_WANTMESSAGE 响应来完成的。
因此,要告诉对话框管理器不要特别处理 TAB 键,只需关闭这两个行为即可。
在询问原始控件它认为它想要什么行为后,我们关闭 DLGC_WANTTAB 标志;这涉及第 (1) 部分。接下来,我们检查消息是否是按 TAB 键。如果是这样,那么我们关闭 DLGC_WANTMESSAGE 标志;这涉及第 (2) 部分。
这肯定比解决前面提到的所有小问题所需的代码要少,它通过完全回避尝试模拟对话框管理器的任务,而只是与对话框管理器合作以获得您想要的行为来实现这一点。
“如果你知道一个系统是如何工作的,你就可以与它合作,而不是反对它,每个人都会因此而更快乐”,这是我一直试图通过这个网站和我的书传达的东西。了解某些东西的使用方式可以让你成为一个更有效的程序员。
课后练习
考虑上图的代码,为什么我们不能像下面这样写?
总结
你如果想要在桌面程序开发中有所建树,钻研 Win32 细节是不可回避的一条路。
一生短暂,我只做好一件事:做好我的 Topomel Box (拓扑梅尔智慧办公平台),在过程中把细节整明白。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Those who do not understand the dialog manager are doomed to reimplement it, badly》
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.