当前位置:C++技术网 > 资讯 > 四种复选框控件的状态类型详细分析

四种复选框控件的状态类型详细分析

更新时间:2016-02-05 15:45:51浏览次数:1+次

    我们最简单的按钮就是下压按钮。下压按钮又有两种,即普通下压按钮和默认下压按钮,分别由BS_PUSHBUTTON和BS_DEFPUSHBUTTON按钮样式定义。下压按钮的分析,参考文章《普通下压按钮和默认下压按钮区别和联系》。
    复选框控件是按钮控件的一种,是为了完成多选而准备的一种公共控件。和下压按钮一样,复选框也不只一种哦。
    复选框有四种类型,分别为普通的两态复选框、自动切换状态的两态复选框、普通的三态复选框和自动切换状态的三态复选框。四种复选框分别由BS_CHECKBOX、BS_AUTOCHECKBOX、BS_3STATE和BS_AUTO3STATE四种按钮风格定义。
    我们再细分下,根据复选框状态可以将四种复选框分为两大类,即两态复选框和三态复选框。如果根据是否自动切换状态,可以分为非自动切换状态复选框和自动切换状态的复选框。
    那么自动切换状态和不自动切换状态有什么区别呢?当你用BS_CHECKBOX或BS_3STATE创建复选框时,你是不是就会以为单击了复选框之后就可以勾选上复选框了呢?大多数人对此不清楚,就认为是的。我敢说,很多人都不知道自动切换状态的复选框是怎么回事。当我们用BS_CHECKBOX或BS_3STATE按钮风格创建按钮后,然后发现单击鼠标选不上复选框,就开始慌了,也搞不清楚怎么回事了。他们会以为,虽然不是自动切换状态,但是我们不是单击了复选框了吗?一肚子的委屈。好吧,那我们换一种方式想想,按你的想法,自动切换状态的复选框是不是就是你不动鼠标就能选中呢?如何实现?通过意念?我想不能吧。
    要理解状态的自动切换,也只有学习了win32才能彻底明白。因为win32坏境下,没有任何包装。当我们要选中复选框的时候,我们就要发消息BM_SETCHECK,WPARAM参数设置为1即可选中复选框。WPARAM参数为0,即可取消选中复选框。然而这是用编程方式来直接设置的。在用户交互的过程中,是由用户单击之后才选中复选框。
    非自动切换状态复选框在接受到单击之后,也只是得到了单击复选框控件的WM_LBUTTONDOWN消息而已,所以复选框按钮也只知道单击了,与状态无关。如果要处理状态,就一定是收到了BM_SETCHECK消息。所以,你单击的话,是不会修改状态的。所以非自动切换状态复选框就必须要你设置状态,即发送BM_SETCHECK给复选框才行。而发送此消息的时机就是复选框被单击的时候。
    然而控件都是系统封装好了的,你没法直接处理控件单击的消息。要么你子类化控件实现,要么就使用自动切换状态复选框来实现点击复选框后自动切换状态。子类化窗口(控件)的技术分析,请阅读《窗口子类化如何实现切换多个子窗口控件的焦点》。
    当然只是实现自动切换复选框的状态,就没有必要子类化。我们只要使用自动切换状态的复选框即可。自动切换状态就是在复选框被单击之后,复选框内部自己就更换了状态,而不需要我们再发送消息去设置复选框的状态了。
    而两态和三态的区别,也就是状态的数量问题,没有什么好说。两个状态就是选中和不选中,三态则多了一个既不是选中也不是取消选中的状态。既不是选中也不是取消选中的状态的复选框是灰色的对勾。如果要设置这种状态,给BM_SETCHECK的WPARAM参数传入2即可。