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


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

            以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的定义

  • 相关阅读:
    ASP.NET中自定义控件无法响应事件的问题
    通过编程为ASP.NET页面设置缓存
    VB.NET中Module的概念
    IDENTITY列及其编号的问题
    使用XML RPC进行远程调用
    存储过程编写和优化的经验
    为控件添加设计期支持
    SSIS的一个问题
    多线程编程中的锁定(lock,Monitor)
    汉字的奥秘: 获取汉字的笔画数
  • 原文地址:https://www.cnblogs.com/xuhuajie/p/11338952.html
Copyright © 2020-2023  润新知