윈도우에 보면 항상 윈도우 스타일이라든가 그런것을 플래그 라고 정해두고,
입력할때 WS_POPUP | WS_CHILD | WS_ ... 이런식으로 BIT OR 연산으로 플래그를 사용한다.

그럼 플래그란 무엇이냐?
음 한마디로 말하면 옵션이다. 어떤 기능을 수행하는 함수를 만들때 여러가지 옵션에 따라서 수행 방법을 달리 하거나 할때 유용하다.

그런 옵션을 만드는 방법은?
1. bool형 인자를 각각의 옵션 갯수대로 만든다.
   이것은 몇개 없을경우(1,2개 정도)에는 괜찮지만 많아 지면 각각의 옵션마다
   전부다 if를 해야하는 관계로 무척 복잡하다.
   초급용.
2. int형 하나를 만들어서 그 값을 if해서 1,2,3,4로 검출한다.
   이것은 하나의 변수로 여러 옵션을 만들 경우 유용하다.
   그러나 #define을 잘 쓰지 않으면 몇번이 어떤 옵션인지 헷갈린다.
   중급용.
3. dw형(DWORD) 윈도우 스타일 플래그를 만든다.
   반드시 #define과 함께 쓰고 비트 연산을 한다.
   무척 유용하다. 윈도우에서 자주 쓰는 스타일이다.
   고급용이다.

1,2 번은 대충 짐작을 할것이고 3번에 대해서 알아보자.
2번의 경우 각각을 if 하는데 어떤 기능인지 헷갈린다고 했다.
3번 같은 플래그는 일단. 기능별로 분리를 하고 #define을 해야한다.

#define FLAG_AAA 0x001
#define FLAG_BBB 0x002
#define FLAG_CCC 0x004
#define FLAG_DDD 0x008
#define FLAG_EEE 0x010

이런식으로 정의 한다.
2번 int형을 자주 쓰던 사람이면 헉 왜이렇게 만들지 할것이다.
1,2,3,4,5로 하면 될것을.
그러나 지금 부터 이유를 설명 할 것이다.

우리가 함수에서 플래그를 넣을때
dwFlags = FLAG_AAA | FLAG_BBB | FLAG_CCC;
이렇게 넣었다고 가정해보자.

| 는 비트 OR이므로
FLAG_AAA = 00001
FLAG_BBB = 00010
FLAG_CCC = 00100
이렇게 된다. (이진수로)
다 합치면(OR)하면 00111이다.

뭔가가 깔끔하지 않는가??

그러면 그 인자를 받아서 detect해보는 작업을 하겠다.

if( FLAG_BBB & dwFlags )
이렇게 하면 이 값이 true가 된다.

왜냐?
비트 연산 한번만 더해보자
dwFlags는 이진수로 00111이고.
FLAG_BBB는 이진수로 00010이다.(0x002)
& (AND) 연산을 해보자.
AND는 둘다 1일때만 결과가 1이다.
00111
00010
-----
00010 이 결과이다.

이것은 0보다  큰 값이므로 true가 된다.
우리가 처음에 FLAG_AAA | FLAG_BBB | FLAG_CCC를 했으므로
if( FLAG_DDD & dwFlags )를 해보면..
00111
01000
----- &하면
00000
if의 결과는 false이다.
아는 사람이 많겠지만.
이거 잘쓰면 정말 유용하다.
도움이 됬으면 좋겠다.
그럼 이만.