当前位置:C++技术网 > 资讯 > 什么是Tab键顺序,Tab键顺序的本质含义是什么

什么是Tab键顺序,Tab键顺序的本质含义是什么

更新时间:2016-02-05 17:20:25浏览次数:1+次

    我们在窗口上经常需要使用Tab键来切换多个控件的焦点。我们在文章《窗口子类化如何实现切换多个子窗口控件的焦点》自己实现了切换多个控件以及与窗口之间的焦点。实际上我们并没有理会Tab键顺序。
    在标准的窗口程序中,Tab键会按照Tab键顺序来轮流切换焦点。那么问题来了,Tab键顺序是什么,Tab键顺序是如何确定的,Tab键顺序到底是什么东西。
    在网上可以查阅到很多资料,对于前面两个问题有所解答,不过对于最后一个问题,根本就没有人问过吧。可能在实际开发中,很少有人会用到,也就没有去理会。不过我是喜欢打破砂锅问到底的人,所以想搞清楚Tab键顺序的本质是什么。不然经常说什么Tab键顺序却始终不知道它怎么来的。因为我在研究学习win32,所以,很多东西就需要深入的了解,才能彻底掌握。
    经过思考和调查,我把我的总结分享给大家。
    Tab键顺序是为了键盘操作快速在多个控件中切换焦点,而无需鼠标的干涉,自然效率比较高。那么Tab键顺序就是不停的按下键盘的Tab键时,焦点会按照什么顺序不同的切换,焦点会依次从哪个控件切换到哪个控件。那么这个顺序就叫做Tab键顺序。
    在对话框中,对话框管理器会自动响应Tab键,来切换焦点。那么哪样的控件有机会得到焦点呢?是不是全部控件都可以得到呢?
    答案是,只有具备WS_TABSTOP窗口风格的控件,焦点才会切换到控件上。TABSTOP是就是Tab Stop,也就是Tab键按下后,焦点能够停留下来的控件。如果窗口没有WS_TABSTOP风格,也就表示这个控件不想让Tab切换焦点时焦点切换到这个控件上。当然,如果你要单独设置没有WS_TABSTOP风格的控件的焦点时,这个控件还是可以拥有焦点的。我们这里只是说,按下Tab键不会将焦点切换到没有WS_TABSTOP风格的控件上。
    我们搞清楚了哪样的控件可以接受焦点,也知道Tab键顺序的定义了。那么现在的问题是,这个顺序到底是哪样的呢?Tab键顺序可不可以改变呢?
    在一个窗口上,可能有很多个控件,并且这些控件都有WS_TABSTOP风格,所以它们都能够让焦点停留。在按下Tab键后,焦点第一个花落谁家呢,第二次有到哪一家呢?这是一个问题。
    在对话框程序中,我们在资源编辑器中,拖放了不同的控件,那这些控件的Tab键顺序就是依照放置的先后顺序。第一个放入的控件,通常是Tab键顺序的第一个。

    对于静态标签控件,默认不需要焦点停留,所以就没有加上WS_TABSTOP窗口风格。其他可以得到焦点的控件,默认会加上WS_TABSTOP窗口风格,以支持Tab键顺序。在VS的资源编辑器中,按Ctrl+D就可以显示当前的控件的Tab键顺序,用数字显示出来了。你单击上面的数字,即可修改顺序了。你单击的先后也就确定了Tab键顺序的先后,下面是一个对话框的Tab键顺序:

Ctrl+D修改Tab键顺序示意图

【Ctrl+D修改Tab键顺序示意图】
    到了这里,我们知道了Tab键顺序如何确定的以及如何修改Tab键顺序的。然而,到底Tab键顺序是什么顺序呢?假如我不用资源编辑器,我都用手动的创建控件,即调用CreateWindow函数创建控件,还有没有Tab键顺序呢?
    如果问到这个问题,也就开始接触Tab键本质的东西了。为什么我们可以改变资源编辑器中的对话框上的控件的Tab键顺序呢?因为控件只是暂时定义而已,并没有实际创建出来。在修改了控件的Tab键顺序之后,我们可以看到RC文件中定义控件的顺序改变了。这说明什么呢?
    RC编译器自然也是从前往后编译的,所以,RC文件中先定义的控件会被先创建出来。这也就表明,真正的Tab键顺序,实际上就是具备WS_TABSTOP风格的控件的创建顺序。不管你前面如何如何修改顺序,在最终,都是由创建顺序来决定的。正是因为在RC资源编辑器中,控件都是没有创建的,只是一个预先定义,所以RC编辑器可以让你随便修改Tab键顺序,实际上就是在RC文件内部调整控件的定义顺序。最终RC编译器就按照RC文件中定义的顺序来创建所有的控件。
    所以,如果我们没有使用对话框,而是全部手动创建的,那么我们只要确定创建的顺序就可以确定Tab键顺序了。记得,还得带上WM_TABSTOP风格哦。