メインウィンドウを作るとき、スタイルが出てきます。 これは数値です。 この値を変えることでメインウィンドウのスタイルを変えることができます。 そして、論理演算を知っていると理解がしやすいです。
CREATESTRUCT構造体は、次のように定義されています。 この中の style を見ていきます。
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams;
HANDLE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
LPCSTR lpszName;
LPCSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCT;
スタイルは、"winuser.h" に書いてあるマクロ定数を使います。 "WS_" で始まるマクロ定数です。
/* * Window Styles */ #define WS_OVERLAPPED 0x00000000L #define WS_POPUP 0x80000000L #define WS_CHILD 0x40000000L #define WS_MINIMIZE 0x20000000L #define WS_VISIBLE 0x10000000L #define WS_DISABLED 0x08000000L #define WS_CLIPSIBLINGS 0x04000000L #define WS_CLIPCHILDREN 0x02000000L #define WS_MAXIMIZE 0x01000000L #define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */ #define WS_BORDER 0x00800000L #define WS_DLGFRAME 0x00400000L #define WS_VSCROLL 0x00200000L #define WS_HSCROLL 0x00100000L #define WS_SYSMENU 0x00080000L #define WS_THICKFRAME 0x00040000L #define WS_GROUP 0x00020000L #define WS_TABSTOP 0x00010000L #define WS_MINIMIZEBOX 0x00020000L #define WS_MAXIMIZEBOX 0x00010000L #define WS_TILED WS_OVERLAPPED #define WS_ICONIC WS_MINIMIZE #define WS_SIZEBOX WS_THICKFRAME #define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW /* * Common Window Styles */ #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ WS_CAPTION | \ WS_SYSMENU | \ WS_THICKFRAME | \ WS_MINIMIZEBOX | \ WS_MAXIMIZEBOX) #define WS_POPUPWINDOW (WS_POPUP | \ WS_BORDER | \ WS_SYSMENU) #define WS_CHILDWINDOW (WS_CHILD)
この中の "WS_MINIMIZEBOX" は最小化ボタンと関係があります。 これを使って説明します。
#define WS_MINIMIZEBOX 0x00020000L
"00020000" は8桁の16進数です。 5桁目は "2" です。 これを2進数にすると、4桁の数になります。
"0010"
2進数は 0 と 1 しかありません。 ですから、2桁目が 1 なので、これを 0 にすると最小化ボタンが使えなくなります。 そこで、特定のビットだけを変える方法が必要になります。 C/C++ のビット演算子は、2進数で考えたとき、各桁ごとに論理演算します。
特定のビットを 1 にする方法です。 "|" は、or演算です。 0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1 です。 両方 0 のとき 0、それ以外は 1 です。 ですから、変えたい所は 1 、そのままの所は 0 にします。 ここで、x | 0010 とすれば、2桁目は 1 となり、他の値は変わりません。 ですから、x | WS_MINIMIZEBOX とすれば最小化ボタンが使えるようになります。
特定のビットを 0 にする方法です。 2つを組み合わせます。 "~" は、not演算です。"&" は、and演算子です。 not演算は、0 と 1 を入れ替えます。 0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1 です。 両方 1 のとき 1、それ以外は 0 です。 ここで、x & 1101 とすれば、2桁目は 0 となり、他の値は変わりません。 ですから、x & ~WS_MINIMIZEBOX とすれば最小化ボタンが使えなくなります。
特定のビットを 0 なら 1、1 なら 0にする方法です。 "^" は、xor演算です。 0 ^ 0 = 1, 0 ^ 1 = 0, 1 ^ 0 = 0, 1 ^ 1 = 0 です。 両方同じとき 1、それ以外は 0 です。 ですから、変えたい所は 1 、そのままの所は 0 にします。 ここで、x ^ 0010 とすれば、2桁目は 0 となり、他の値は変わりません。 ですから、x ^ WS_MINIMIZEBOX とすれば最小化ボタンの有効化が逆転します。