位定义,用于判断是否包含某属性
? ? ? ?很多时候,对象有很多属性,我们可以增删对象的属性的支持,这时候,位定义是比较好解决问题的。 ? ? ? ? ? 以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的定义 (编辑:长春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |