当前位置:C++技术网 > 精选软件 > Windows零基础入门:2.16 窗口类结构体之窗口类风格

Windows零基础入门:2.16 窗口类结构体之窗口类风格

更新时间:2015-09-10 17:05:51浏览次数:1+次

    吐槽一句,写了一半了,没保存,断电。。。无语了,重写。经历过几次,这次淡定了。是时间久了就忘记了这个习惯的重要性了。所以,一些习惯,看似琐碎,其实并不一定,只要你打自内心的做,又没有人逼你做的话,其实也是挺轻松的。刚才只是因为还没有写好标题,所以,写着写着就沉浸在里面了,没有保存。这个在我们写代码时,而特别要注意,否则,那更加痛苦。
    对于习惯一说,在编写代码的时候,有些习惯也是要做好的,和时不时保存文档一个道理,发生的时候,你是猝不及防的。而代码中,甚至是隐秘的。不要觉得这些细节可以忽略,一旦你忽略,你就进入了危险状态。
    好了,重新整理刚才的思路,重写吧。真的勇士,敢于直视惨淡的人生,敢于再次重来。哈哈哈。
    在《Windows零基础入门:2.14 (1)窗口类使用完整代码演示和详细注释》中,有完整的代码,窗口类部分有了详细的注释。这里不重复贴代码。前面一节课,我们结合代码的使用,将窗口类的使用到创建窗口都讲述了一遍,相信你也深入了解了不少。而使用上,你动手写了,那也不存在问题。我们讲课做到让你深入理解,但是你一定要动手来写代码,培养手感,撸起来也爽些是吧。不然,写代码时你还去找键盘的字母在哪个位置,想来感觉,就见鬼了。然后写一个关键词就错误,你会爽,那我就什么话也不说了,跪地求饶了。
    本节课我们就只讲窗口类结构体的第一个成员style。窗口类结构图里面的成员,都是窗口类的各个特性,讲明白这个结构图,你对窗口类也就很清楚了。我们不急着讲解这个成员如何使用,这都是很简单,也是很没有水平的。我们需要知道,这个成员所带来的深层次的知识和背景。区别菜鸟和大神,就可以从这里看的出来。菜鸟是刚学,什么都不懂,基本的语法都可以错的人,而码农就是只会使用不会思考的人,而大神则是会深入探究思考和挖掘的人。大神并不代表他技术水平一定有多高,而是他的思想水平有多高。对于会思考的人来说,是更容易成就大神的。而对于技术使用,大家都可以学会。
    想成为大神,还是成为码农,只是一念之间,你想成为大神,你就不要急于求成,只学知道怎么用。别人不讲或者讲不了是别人的事情,我能讲如果你还不去深入,那就是你的问题咯。
    我在学习的时候,始终都对一个概念模模糊糊的。经过大量的思考之后,也清晰多了,在本节课中,我会跟大家解释清楚。
    这个疑惑就是,在窗口类结构体中有一个指定风格的成员,他会作用于用此窗口类创建的所有窗口,而注册好窗口类之后,我们用CreateWindow(XX,XX,窗口风格参数,...)创建窗口,在第三个参数中,还要指定窗口风格。为什么都要设置,是不是有点重复了呢?这两者到底有什么区别?对于这个问题在介绍基本的知识之后,再来解释。
    当我不知道一个东西的时候,我习惯性的去MSDN查阅,而且还是英文的。这里最为正宗,解释最为到位。而网上的很多都是从这里摘抄出来的,支离破碎的。有的也是从这里翻译出来的。而翻译必然也有不到位的地方。所以,MSDN是Windows编程必备的一个工具。VS2015版的MSDN下载地址以及在线版的MSDN地址,请看《VS2015离线MSDN安装包下载地址和各版本在线MSDN入口地址》,对应的VS2015离线版MSDN安装方法和简要的查询方法介绍参见《VS2015离线MSDN安装方法图解》,在线查询MSDN的方法,参考《在线MSDN查询使用方法,如何使用在线MSDN》。至于英文看不懂,不要紧,自己下载英语单词查询软件,启动“取词”和“画译”功能,就可以哪里不懂点哪里了。软件的使用我不解释了,这个你用了就会了。
    我们先来看看窗口类结构体的定义:

typedef struct tagWNDCLASS {
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
} WNDCLASS, *PWNDCLASS;
     我们来看窗口类结构体的第一个成员style。它是UINT类型,表示的是窗口类风格。UINT类型,对于刚接触Windows编程的朋友来说看起来很别扭,确实。我刚开始接触,也很不喜欢。不过,看多了就习惯了。也觉得这样其实挺好的。
typedef int           INT;
typedef unsigned int  UINT;
typedef unsigned int  *PUINT;
     我们来看一下定义,你可以在代码中,写UINT几个字,然后把光标放在放在这个几个字上面,然后右击,“馋看定义”,就可以看到上面的这几句代码。你要看其他的类型、API函数等,只要你不熟悉的,都可以用这种方式来查看。然后你就看到了你熟悉的样子。然后就理解了这个奇怪的样子。
    以上的代码是类型重定义,也就是给类型重新命名一个比较简短好记的名字,UINT就是无符号整数的缩写的大写形式,INT就是有符号整数的大写形式。类似的还有LONG、ULONG等等。
    这样一来,你就相当于学会了各种陌生的东西咯,其实就是换了一身衣服罢了,这双钛金眼镜(查看定义)就送给你了。再有不会的,自己动手,丰衣足食,不要在群里问这么些基本的,而别人又不屑一顾的问题,不问你又不知道的尴尬,从此可以避免了哈。
    这个成员的类型是UINT,那么就是一个正整数,而数字如何存储各种窗口类风格标志呢?不像在C语言中,我们可以用一个字符串数组来存储各种风格名称,而这里,并不是这样的。
    窗口类风格使用一个位表示一个风格类型,也就意味着,我们要对窗口类风格的操作就要用到位操作了。我们来看看这些风格都有哪些,看下面:
#define CS_VREDRAW          0x0001
#define CS_HREDRAW          0x0002
#define CS_DBLCLKS          0x0008
#define CS_OWNDC            0x0020
#define CS_CLASSDC          0x0040
#define CS_PARENTDC         0x0080
#define CS_NOCLOSE          0x0200
#define CS_SAVEBITS         0x0800
#define CS_BYTEALIGNCLIENT  0x1000
#define CS_BYTEALIGNWINDOW  0x2000
#define CS_GLOBALCLASS      0x4000
     这是所有的定义,根据上面送给你的钛金眼镜,你可以查看到这些定义。这里使用define宏定义,将这些数字定义为一个宏,方便记忆和使用。看着这些数字,是不是很有规律。你把他们展开为二进制,你会发现,一种风格只有一个位是1,表示这个位代表这种风格。而我们在操作的时候,就直接使用宏来进行位操作。这样就可以将多个位拼在一起,或者从已有的风格除去一个位,即去掉一个风格。这一点,对于所有的这类都有用哦,都是这个模式。
    那么以上这些风格就是这个成员的取值了。因为这个成员就是UINT类型,所以你可以直接赋值一个数字,也可以用这个宏赋值,这个宏就是一个数字。你可以使用位或操作(|)来将几种风格都使用上。比如前面代码中的就是使用了两种风格。
    那么本节就先介绍到这了。对于本节的提出的疑惑以及灵活使用,将在后面的课程紧接的介绍。