有人想开发这样一个功能,说界面上有一个多行文本编辑框,他希望用户按下 TAB 按键后可以将输入焦点导航至其他控件,而不是在文本框里默认地输入一个 TAB 字符。
如果是你,你觉得应该怎样做呢?
他琢磨了一下,觉得应该使用子类化的方式来实现这项功能,代码如下:
>> 请移步至 www.topomel.com 以查看图片 <<
我想说的是,上图中的做法,有很多错误。
您可以花费大量时间挑剔小细节,例如:
如果未能正确设置对话框中的焦点会怎样?
是否考虑嵌套对话框的场景?
是否无法处理 SHITF + TAB 导航键的情况?
如果控件不是对话框的一部分,那怎么办?
但所有这些小细节都忽略了大局: 与其与对话管理器作斗争,重新实现我们想要保留的所有部分,而忽略我们想要跳过的部分,不如与对话管理器紧密合作,并以对话管理器期望的方式表达我们的意图。
上面这段话可能有点绕弯儿,请继续看。
这是点一个没有泡菜的汉堡包和点一个有泡菜的汉堡包之间的区别,然后在你拿到汉堡时小心翼翼地从汉堡上挑出泡菜。
(编者注: 汉堡?泡菜!)
在这种情况下,我们希望防止编辑控件说”给我 TAB 键”。我们上次看到,这是通过 (1) 设置 DLGC_WANTTAB 对话框代码或 (2) 在给定 TAB 键消息时用 DLGC_WANTMESSAGE 响应来完成的。
因此,要告诉对话框管理器不要特别处理 TAB 键,只需关闭这两个行为即可。
>> 请移步至 www.topomel.com 以查看图片 <<
在询问原始控件它认为它想要什么行为后,我