由上一节课我们了解到了Win32程序的整体窗口机制和消息机制,我们现在开始一点点仔细分析。
    最根本的,就是窗口类了。没有窗口类,就没有窗口,没有窗口就没有窗口机制,也没有消息机制。所以,我们首先来仔细了解一下窗口类的相关知识。
    现代社会,对于开发速度要求越来越快,因为需求变化太快。各种热门语言,各种热门技术,有的就是火热一时然后悄然退去。作为我们自己要给自己所学的技术保值,不会那么容易过时,能够持久有效,我们就必须深入学习基础的技术,而不是各种浮夸的框架就可以了的。
    需求变化的快,应运而生会产生很多框架技术,如果只停留在各种库的使用上,不仅你学习应接不暇,而且始终都是立足于浮沙之上。一旦这个库或者框架改变了,或者过时了,或者有一个新的更强劲的框架来代替了,你不得不再花大把时间来学习。这样你就惨了,越学越多,越学越没意思,始终不得精华。你学的很多人都会,你还有什么竞争力呢?而且变化总是莫测的,你不知道哪一天,学的东西就不再流行,而被迫转型了。
    我们C++技术网看到这点,力求引导一种学习基础技术的氛围和普及编程基础教育,所以,我们也推出这些基础的课程,免费的哦。说到这些事情,我想告诉你,技术的发展总是与时代相契合的,所以,各种技术点,也是有这么些特点的。
    我们来结合我们的这些背景,来讲讲技术。正是发展的越来越快,我们都在追求一个开发效率,总是想尽可能少写代码,或者尽可能复用代码(重复使用),或者直接将这些重复性的工作,放在了框架中来完成,我们开发就不用管这些了。这么一来,很多细节我们就不知道了。所以,各种框架的学习,直接学的话,总是有点不知所措。这方面的问题,还是没有基础。怎么解决?沉下心学习基础就是了。
    我们现在讨论的窗口类,也是基于这种复用的思想。其实创建一个窗口是比较复杂的,涉及到底层的各种绘图,但是微软已经考虑到这些,所以,就简化了我们创建窗口的复杂度,将创建的过程都封装在内部。这样,我们失去了什么?得到了什么?一个事情总有得与失的。我们得到了快捷方便的创建窗口的方法,而却失去了很个性化创建窗口的方法。我们现在创建的窗口,为什么都是差不多的呢?而要创建个性化的,又该如何做呢?
    创建个性化的窗口,当然使用窗口类也是可以实现的,不过比较局限。而现在流行了个性化的界面,也就发展了很多界面库。他们实现的效果,并不是使用系统提供的各种窗口类,而是直接绘图,直接绘制按钮,这样可以实现很炫的效果。要实现很不错的效果,你需要懂得很多基础而深入的知识,你要对消息机制和绘图,以及Windows内部有深入的了解。这个不是我们探讨的主题,你可以学习我们网站QT零基础入门来了解这部分的内容。
    而创建普通的从窗口,就是我们的窗口类的发挥作用的时候。对于我们现实需求来说,主要是业务需求,对于程序的界面来讲,和系统的一致就可以了。这个时候,微软使用了窗口类的东西就可以实现这个需求了。不仅是我们来创建,还是系统内部来创建,都是用这一套窗口类,这样就让我们创建的窗口和系统的一样了。而要做些个性化的,也就是对提供的窗口类做一些部件的增删修改之类的。
    这么一说,你应该想到了,窗口类就是模板一类的东西。有了这个模板,再创建窗口,很快就弄出来一个。这个和盖章一样,刻好章后,盖章是多么爽的事情。
    如何来确定这个模板的样子呢?这个自然想到了C语言的结构体,用各个成员来表示窗口的基本特征,就可以确定这类窗口属于一种,改变了其中一些特征后,就成了另外一类窗口了。而系统则只需要知道这些参数,就可以根据不同的参数来绘制窗口。基本的绘制工作就被封装在内部了。这个复用就大大提高了开发效率。不是说好的模板直接盖章吗?怎么又这么多不一样的窗口了?
    是这样的,为了快速实现创建一些窗口,系统已经提供了标准的窗口,这些叫做标准公共控件。就是我们的按钮,列表框以及打开文件对话框之类的控件和标准对话框等。这个就是直接盖章的效果,这个章是系统已经做好了的(系统已经创建好系统窗口类了)。但是虽然对于窗口不需要太个性化,但是多少还是需要根据需求来调整一下窗口吧。比如说,我要显得神秘的一款黑客软件,我要做成黑色的背景,你总不能默认成为白色,还不能改吧。当然,在创建具体的窗口的时候,还可以调整定制微调窗口的样式。窗口类是在整体上定义窗口的类型,而窗口修改就是小调整而已。窗口类可以把你定义为一个猴子,窗口样式可以把你修饰成漂亮的猴子哦。窗口类决定的是窗口的本质属性,而窗口创建修改的只是显示的样式罢了。这一点,很多人都没有区分清楚。不然,为什么叫做窗口类呢?决定一个窗口类型的东西,才可以称之为类嘛。
    而我们要定制,实际上就是在系统提供的空白的章里给我们规划好,留空给我们来填,我们填好后,就是一个新章了。我们可以在上面随意的定制,但是不管怎么定制都还是这么一个章。我们可以理解为我们的章是在系统的基础上二次开发出来的章。也就是说,系统窗口类是已经写好的窗口模板,我们定制的窗口类,是基于窗口类模板定制出来的其中一种窗口类。
    我们都知道的窗口类,大家都认为是WNDCLASS这个结构体,事实上,这是微软定义好的窗口类的模板,用来定制得到一种窗口类用的。而定制后得到的窗口类,其实可以理解为窗口模板,用这个窗口模板,就可以做出一个窗口。
    而我们用我们自己定制的窗口模板来创建窗口,就是我们定制的窗口了。而直接使用系统窗口类,就是固定不变的那些控件类。
    下面以一张图来总结:
Windows零基础入门:2.8 什么是窗口类?WNDCLASS就是窗口类吗?
    总结一下,系统窗口类就是事先已经由系统指定样式和注册好的窗口模板,然而WNDCLASS窗口类结构体就是我们的定制窗口类的模板,而我们定制的窗口类则是创建窗口的窗口模板,就和系统窗口类一样了。然后就用这些注册好的窗口类来创建窗口。所以,千万不要以为WNDCLASS结构体就是窗口类,这是大错特错的。他是窗口类的模板而已。用这个结构体可以定制出数不清的定制窗口类,而用定制窗口类也可以创建数不清的窗口,所以才叫做模板。