メインウィンドウ

メインウィンドウを作るとき、スタイルが出てきます。 これは数値です。 この値を変えることでメインウィンドウのスタイルを変えることができます。 そして、論理演算を知っていると理解がしやすいです。

スタイルとビット演算 (win119)

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 にする

特定のビットを 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 にする

特定のビットを 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 とすれば最小化ボタンの有効化が逆転します。


[前] [目次]