ウィンドウスタイルを変更して試してみる
まず、前回使ったサンプルコードをそのまま実行する。次のようなウィンドウが起動してくる。
このウィンドウには、次のような特徴がある。
- タイトルバーがある
- タイトルバーに名前がある
- タイトルバーに最大化、最小化、クローズのボタンがある
- 1200x800で起動してくる
- ウィンドウサイズを変更することができる
これらの挙動はCreateWindowEx()で指定したものだ。CreateWindowEx()で指定する値を変更すると、この基本的な挙動も変更されることになる。
まず、ウィンドウスタイルの指定をWS_BORDERに変更すると次のようになる。
最大化、最小化、クローズのボタンが消えている。そしてわかりにくいが、ウィンドウの端にマウスを合わせてもサイズ変更のマウスカーソルに変化しないし、サイズを変更することもできない。
WS_DLGFRAMEを指定しても似たようなものが出てくる。
WS_SIZEBOXを指定してみる。実行すると次のようになる。
見た目はWS_BORDERと同じが、こちらはウィンドウの端にマウスを合わせるとマウスを変更するためのマウスカーソルに変化し、サイズの変更を行うこともできる。
WS_POPUPWINDOWを指定するともっと興味深い。タイトルバーすら表示されず、ボーダーのあるウィンドウがスクリーンの左上に張り付くように表示されるだけだ。
これまで取り上げてきたウィンドウスタイルは単体で指定することができたが、ほかのウィンドウスタイルと併用しなければ効果がない、または、使えないものもある。例えば、WS_DISABLEDはウィンドウを不活性状態にするというウィンドウスタイルだ。WS_OVERLAPPEDWINDOWと合わせて実行すると次のようになる。
スクリーンショットでは通常のウィンドウのように見えるが、このウィンドウはユーザーからのアクションに反応しない。クローズボタンからウィンドウを閉じることもできない。EnableWindwo()関数を呼ぶまでユーザからはなんのアクションもできない状態だ。
クローズボタンはWS_SYSMENUを加えることで表示されるようになる。次のような感じだ。
WS_SYSMENUに対して、さらにフラグを追加することができる。WS_MAXIMIZEBOXを追加すると、次のように最大化ボタンが表示されるようになる。
WS_SYSMENUに対してWS_MINIMIZEBOXを追加すれば、今度は次のように最小化ボタンが表示されるようになる。
そして、WS_MAXIMIZEBOXとWS_MINIMIZEBOXは同時に追加することができる。同時に追加すると次のようになる。
スクロールバーを表示するかどうかもウィンドウスタイルで指定する。WS_VSCROLLを追加すれば縦スクロールバーが表示され、WS_HSCROLLを追加すれば横スクロールバーが表示される。
そして、この2つのスクロール指定は同時に指定することができる。同時に指定すると次のように縦スクロールバーと横スクロールバーが両方とも表示される。
このように、ウィンドウスタイルの指定を変更することでウィンドウの基本的な見た目や挙動を変えることができる。
WS_OVERLAPPEDWINDOWでよくある普通のウィンドウになる
こうやって動作を見ていくと、WS_OVERLAPPEDWINDOWというウィンドウスタイル、実際にはWS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOXという指定になっているわけだが、この指定が次のような感じでWindowsにおけるもっとも基本的なウィンドウの挙動および見た目を指定するものであることがわかってくる。
ウィンドウスタイル | 内容 |
---|---|
WS_OVERLAPPED | オーバーラップウィンドウ |
WS_CAPTION | タイトルバーとボーダー |
WS_SIZING | サイズ調整用ボーダー |
WS_SYSMENU | ウィンドウメニュー:クローズボタン表示 |
WS_MAXIMIZEBOX | ウィンドウメニュー:最大化ボタン表示(WS_SYSMENU必須) |
WS_MINIMIZEBOX | ウィンドウメニュー:最小化ボタン表示(WS_SYSMENU必須) |
ウィンドウスタイルを変更することで本当にほしいスタイルのウィンドウが作成できるというわけだ。
かなりシンプルなウィンドウの作成
まずウィンドウクラスの構造体を整え、これを登録。次にCreateWindowEx()関数をコールしてウィンドウの生成だ。Windows APIを使ったウィンドウの作成はこのようなものであり、指定されている内容を理解できるようになると、結構シンプルな使い方であることがわかると思う。
ウィンドウを作成したとは、ユーザがウィンドウに対して行うアクションに対してアプリケーションが動作するようにメッセージプールを実装しておくということになってくる。次回はこの辺りを追っていこう。ウィンドウアプリケーションを作成する最初のステップはこれでかなり進んだことになる。
参考
- Module 1. Your First Windows Program - Win32 apps | Microsoft Docs
- WNDCLASSA (winuser.h) - Win32 apps | Microsoft Docs
- Window Class Styles (Winuser.h) - Win32 apps | Microsoft Docs
- LoadCursorA function (winuser.h) - Win32 apps | Microsoft Docs
- GetSysColor function (winuser.h) - Win32 apps | Microsoft Docs
- Window Styles (Winuser.h) - Win32 apps | Microsoft Docs