位定义,用于判断是否包含某属性

       很多时候,对象有很多属性,我们可以增删对象的属性的支持,这时候,位定义是比较好解决问题的。

        以windows窗口为例,窗口属性WS_OVERLAPPED,WS_BORDER,WS_DLGFRAME,WS_VSCROLL,WS_HSCROLL等等。

        我们想加上WS_VSCROLL属性的常用写法

        DOWRD ws_old = GetWindowLongA(hWnd,GWL_STYLE);  //获取目前属性

        ws_old |=WS_VSCROLL;

        或者去掉WS_VSCROLL属性

        ws_old &=~WS_VSCROLL;

        判断时候具有WS_VSCROLL属性

        if(ws_old & WS_VSCROLL)

        用起来十分方便,那么如何进行位定义呢?

        方法一:用enum

        enum class WINDOW_STYLE: char  //大小可以按照需求更改        

        {

             WS_BASE=1,

             WS_OVERLAPPED=WS_BASE<<1,

              WS_BORDER=       WS_BASE<<2,

              WS_DLGFRAME=   WS_BASE<<3,

              WS_VSCROLL=      WS_BASE<<4,

             WS_HSCROLL=       WS_BASE<<5

        }

       优点:类型保护,调试更清楚

       缺点:无法直接进行位操作。

 2、用define

        

          #define  WS_BASE   1

          #define   WS_OVERLAPPED  (WS_BASE<<1)

          #define   WS_BORDER           (WS_BASE<<2)

          #define    WS_DLGFRAME     (WS_BASE<<3)

          #define    WS_VSCROLL        (WS_BASE<<4)

          #define   WS_HSCROLL         (WS_BASE<<5)

      优点:可以直接进行位运算

      缺点:移位操作符的优先级很低,必须加括号保护

3、用define与16进制

     

          #define  WS_BASE                  1

          #define   WS_OVERLAPPED  2

          #define   WS_BORDER           4

          #define    WS_DLGFRAME     8

          #define    WS_VSCROLL       0x10

          #define   WS_HSCROLL        0x20

      优点:可以直接进行位运算

      缺点:排列不整齐,可以稍微改进下

      

          #define  WS_BASE                  0x0001

          #define   WS_OVERLAPPED  0x0002

          #define   WS_BORDER           0x0004

          #define    WS_DLGFRAME     0x0008

          #define    WS_VSCROLL        0x0010

          #define   WS_HSCROLL         0x0020

 是不是舒服很多。。。      附windows的定义

原文地址:https://www.cnblogs.com/xuhuajie/p/11338952.html