Windows零基础入门:4.4 获取窗口类风格和判断窗口类风格是否存在

3747 人浏览 | 时间: 2015-10-26 21:11:21 | 作者: codexia 会员文章,禁止转载

    前两节课介绍了获取窗口类ID和窗口背景画刷句柄的方法。分别见《Windows零基础入门:4.2 获取窗口类信息之查询窗口类名称ID》和《Windows零基础入门:4.3 获取窗口类背景画刷句柄和使用窗口类背景画刷句柄》,因为最近工作上在技术攻关,所以比较忙,耽误了更新教程。请先复习前面的课程,然后继续看咯。我们现在一有时间就更新教程。
    那么今天来讲讲如何获取窗口类的窗口类风格吧。
    其实,这几个成员的获取,都差不多。但是为什么我要讲呢?如果是简单的,一方面是为了完整性,另一方面可以借机融入开发经验,可以介绍多一点背景知识,这些对于我们日后的开发都是有用的。
    窗口类风格成员的赋值操作,在前面讲过了。很多背景知识也介绍过了,如果你还不清楚,请回去再好好看看哦。我们介绍的会有更多的知识,不会重复说的。如果真的有些地方重复提到了,说明你需要特别注意,一定要将这些技术点理解透哦。
    窗口类风格的获取,还是用函数GetClassLong咯。传入的标志为GCL_STYLE,使用的代码如下:

DWORD dwStyle = GetClassLong(hwnd,GCL_STYLE);

     是的,这样就得到了需要的窗口类风格成员的值了。不过,这个才是刚刚开始。得到了不一定会用哦。这种情况太常见了。在以后的编程中,你会经常发现千辛万苦得到了一东西,然后才发现,这才是刚刚开始。如何使用,这个东西是什么,怎么用都是问题。别慌,遇到这种情况,有时候挺打击的,不过,你已经成功了走出了第一步。做底层开发的,经受挫折最基本的。这不比上层的应用开发,只需要使用框架的东西,轻松都解决了。然而那样总是学不到真东西的。所以,我们才要深入学习,而在这个过程,你一定会碰见各种各样的打击挫折。千万不要因为不知道一个函数怎么使用就放弃了。如果这样的话,你永远也做不好一件事。不会可以查MSDN,也可以百度,还可以加入群聊问人。只要你有心,总是有办法弄明白的。
    我们要学会使用窗口类风格,我们需要在多学点背景知识。你可能会想,得到了一个DWORD值,怎么用呀?似乎总不能像一个值代表一个风格一样,那样多方便呀。但是,那样就会真正麻烦咯。因为风格有很多,而且就一个标志而已,一个数值就可以存下了。更应该说是,一个位就可以表示了。如果每一个风格都用一个整数表示,那最后一万多个风格的话,那岂不是要写一万行的类型定义呀。这样实在太低效了,也不好管理。如果多设置一些风格,存在窗口类中,那多占内存呀。
    所以Windows中采用一个整数存数所有的风格,一个位存储一个,用1表示含有了风格,用0表示没有是使用这个风格。那么你想想,一个32位或者64位的整数,就可以存储32个或者64个风格。而且一个整数中可以同时最多纪录32个或者64个风格哦。这就是位的好处,充分利用内存资源。有时候,你不节省就非常浪费。32位的就是4个字节,就可以存储N多种风格组合,自己用排列组合来算吧,我数学不好。而如果用一个整数存储一个风格,不知道要用多少内存哦。
    DWORD这个类型是大家开始接触的,所以可能不太熟悉。1字节=8位,1字=两个字节,双字=2字(4字节)。在Windows中,位用bit表示,字节的类型是BYTE,字的类型为WORD,双字的类型就是DWORD,即double word,两个字。这些类型是Windows里对语言类型的重定义类型。你可以在VS中右击这些类型,然后查看定义就明白了。
    这些类型的使用,就和int一样的。提醒一下,你看到我命名的dwStyle这个变量名,你一开始肯定觉得很怪吧。我习惯了,倒是觉得这个看起来很舒服。这是惯用命名,在变量名前面加一个前缀,表示变量的类型。以后一看到变量名就知道类型了,不用查看定义了。这是匈牙利命名法和驼峰命名法的组合,你可以查一下这方面的资料,其实很简单。也可以看看这篇文章《范围类型命名法(Scope-Type Name):一套规范的命名法》。
    BYTE一般缩写为bt,WORD一般缩写为w,DWORD一般缩写为dw,其他的你接触多了自然也知道了。你也慢慢形成这习惯,一是方便看别人的代码,一方面也可以提高自己的代码规范哦。
    好了,我们知道我们得到的是一个DWORD类型的变量,也知道这个变量里可能存储了很多个风格。我们得到这个风格值,那就开始使用吧。
    我们第一个就是想知道这里面有哪些风格对吧?或者说有没有你想要的风格?如果你不知道,那还敢乱用吗?当然这个值你可以赋值给其他变量,这些都好说。好了,我们来判断获取的窗口类风格有没有我们想要的风格先。
    假如我们在设置一个新的窗口风格,但是发现总是没有效果。那么解决问题的一个办法就是,设置之后,获取设置之后的风格,看有没有设置成功,然后再继续检查其他地方。如果不检查,万一是没有设置成功,那后面再怎么检查也没有问题,是不是会很痛苦呢?越是很难发现的问题,经常出现在这些低级错误上,比如变量赋值错了,或者变量名写错了等等。这没设置成功,把窗口句柄写错了,导致没有设置成功,这不是没有可能发生的哦。
    因为我们的风格是以位来存储的,所以自然还是用位操作来判断哦。别慌,位操作其实很简单的,不管你以前学的怎么样,都没有关系,我们这里会给你解释清楚,让你学会的。我们在设置窗口窗口类变量的时候,介绍过风格的位操作哦。如何去掉一个风格,如何加入一个风格。所以就不在这里多说了,你自己去看。
    我们在这里介绍如何判断是否存在一个风格。想到用哪个操作符了吗?位与咯!位与的操作符符号为&。位与的特点就是让两个位相互与一下。什么叫做与?与可以理解为门当户对才能共同发展,只有大家都有资源,才可以一起走,否则最后大家都没得玩。所以1&1=1,只要任何一方没有资源,就是1&0 或者 0&1的情况,这样,结局就是0,最后都没得玩了。所以现在都推崇强强联合,而不是强弱联合!很现实的一个问题,这里可以看到这个道理。

DWORD dwStyle = GetClassLong(hwnd,GCL_STYLE);
if(dwStyle & CS_GLOBALCLASS)
{
    // - 有这个窗口类风格哦。
}
else
{
    // - 很遗憾没有这个窗口类风格哦。
}
     dwStyle & CS_GLOBALCLASS位与后的结果你知道是什么吗?CS_GLOBALCLASS实际上就是一个常量值0x4000,变换成二进制的值就是:0100000000000000。我们将这个值与变量与,每一个位相互与,因为这个常量其他的位都是0,与之后,其他人都会被你一无所有吓跑的,所以都是0.即使碰到了屌丝,他也是0,最后还是0。你一无所有的时候,终究都是一无所有,所以要努力哦。当你在某方面取得成就,说不定可以交到土豪朋友哦。
    所以最后我们只需要看那个为1的一位,如果对方这个位也为1,那么最后的结果就是这个位保留,最后的结果就是你们两个成为一对了,值就是你这个值,最后还是0x4000,如果不幸他竟然是屌丝0,那不好意思,你也不愿意交到这个朋友就自杀了。最后结果就是0。
    在C/C++语言中,0为假,非零就是真。所以这个结果中,要么就是非零值,在if里就是真理咯,否则就是0。这就是这个判断的所有分析过程。我可以说,很多人第一反应知道这个if里的表达式是什么意思,但是并没有真正这么搞明白哦。
    其实这节课就是这一点代码,但是却讲了很多额外的知识甚至是学习感悟和人生道理哦。当然也扯淡了些,如果你是土豪的话,还是要和我们这些屌丝交交朋友咯。屌丝的我们缺乏土豪的爱呀,哈哈哈哈。
    那么如果你想增加或者判断之后去掉一个窗口类风格的某一个,可以回去看前面介绍窗口类风格的课程部分,那里讲的很清楚了。
    再提醒一下,很多人获取了窗口类风格后,就直接给他赋值了。根本就不考率窗口类的感受的。你赋值的话,最后就变成你赋值的这样了。而窗口类风格是用位来表示多个窗口类风格的,如果只直接赋值,这个变量就被覆盖了。里面的原有的风格位就被破坏了。如果你赋值为3,3由两个二进制的1组成,就成了这两个风格了。这是非常没有逻辑道理的。也不要想着用+=的方式来给窗口类风格赋值。很多人获取窗口类风格后,然后就是直接赋值,赋值的风格上去了,而全有的风格就没有了然后他很奇怪为什么窗口的样子变了。还不是你搞得鬼!这是一个开发经验,问题在于很多人对于位操作不熟悉,才出的问题。既然你看到了这篇文章,就不要再犯这样的错误咯。
    本节课虽然简单,但是我希望你真看懂里面的道理,这些在编程中经常会遇见。看到别人写的很奇葩的代码,你都可能看不懂,就是因为人家领悟的高深,所以可以自由的写,写到你都不认识的地步,其实还是那个东西,只是人家已经是大师级别的咯。所以希望在平时学习的时候多思考。如果你一个人想不清楚,我们的课程里讲得这些道理,总可以领悟了吧。加油吧,屌丝!
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

Win32课程菜单