ウィンドウスタイルを変更して試してみる

まず、前回使ったサンプルコードをそのまま実行する。次のようなウィンドウが起動してくる。

  • 実行サンプル - WS_OVERLAPPEDWINDOW

    実行サンプル - WS_OVERLAPPEDWINDOW

このウィンドウには、次のような特徴がある。

  • タイトルバーがある
  • タイトルバーに名前がある
  • タイトルバーに最大化、最小化、クローズのボタンがある
  • 1200x800で起動してくる
  • ウィンドウサイズを変更することができる

これらの挙動はCreateWindowEx()で指定したものだ。CreateWindowEx()で指定する値を変更すると、この基本的な挙動も変更されることになる。

まず、ウィンドウスタイルの指定をWS_BORDERに変更すると次のようになる。

  • 実行サンプル - WS_BORDER

    実行サンプル - WS_BORDER

最大化、最小化、クローズのボタンが消えている。そしてわかりにくいが、ウィンドウの端にマウスを合わせてもサイズ変更のマウスカーソルに変化しないし、サイズを変更することもできない。

WS_DLGFRAMEを指定しても似たようなものが出てくる。

  • 実行サンプル - WS_DLGFRAME

    実行サンプル - WS_DLGFRAME

WS_SIZEBOXを指定してみる。実行すると次のようになる。

  • 実行サンプル - WS_SIZEBOX

    実行サンプル - WS_SIZEBOX

見た目はWS_BORDERと同じが、こちらはウィンドウの端にマウスを合わせるとマウスを変更するためのマウスカーソルに変化し、サイズの変更を行うこともできる。

WS_POPUPWINDOWを指定するともっと興味深い。タイトルバーすら表示されず、ボーダーのあるウィンドウがスクリーンの左上に張り付くように表示されるだけだ。

  • 実行サンプル - WS_POPUPWINDOW

    実行サンプル - WS_POPUPWINDOW

これまで取り上げてきたウィンドウスタイルは単体で指定することができたが、ほかのウィンドウスタイルと併用しなければ効果がない、または、使えないものもある。例えば、WS_DISABLEDはウィンドウを不活性状態にするというウィンドウスタイルだ。WS_OVERLAPPEDWINDOWと合わせて実行すると次のようになる。

  • 実行サンプル - WS_OVERLAPPEDWINDOW|WS_DISABLED

    実行サンプル - WS_OVERLAPPEDWINDOW | WS_DISABLED

スクリーンショットでは通常のウィンドウのように見えるが、このウィンドウはユーザーからのアクションに反応しない。クローズボタンからウィンドウを閉じることもできない。EnableWindwo()関数を呼ぶまでユーザからはなんのアクションもできない状態だ。

クローズボタンはWS_SYSMENUを加えることで表示されるようになる。次のような感じだ。

  • 実行サンプル - WS_OVERLAPPED|WS_SYSMENU

    実行サンプル - WS_OVERLAPPED | WS_SYSMENU

WS_SYSMENUに対して、さらにフラグを追加することができる。WS_MAXIMIZEBOXを追加すると、次のように最大化ボタンが表示されるようになる。

  • 実行サンプル - WS_OVERLAPPED|WS_SYSMENU|WS_MAXIMIZEBOX

    実行サンプル - WS_OVERLAPPED | WS_SYSMENU | WS_MAXIMIZEBOX

WS_SYSMENUに対してWS_MINIMIZEBOXを追加すれば、今度は次のように最小化ボタンが表示されるようになる。

  • 実行サンプル - WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX

    実行サンプル - WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX

そして、WS_MAXIMIZEBOXとWS_MINIMIZEBOXは同時に追加することができる。同時に追加すると次のようになる。

  • 実行サンプル - WS_OVERLAPPED|WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX

    実行サンプル - WS_OVERLAPPED | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX

スクロールバーを表示するかどうかもウィンドウスタイルで指定する。WS_VSCROLLを追加すれば縦スクロールバーが表示され、WS_HSCROLLを追加すれば横スクロールバーが表示される。

  • 実行サンプル - WS_VSCROLL

    実行サンプル - WS_VSCROLL

  • 実行サンプル - WS_HSCROLL

    実行サンプル - WS_HSCROLL

そして、この2つのスクロール指定は同時に指定することができる。同時に指定すると次のように縦スクロールバーと横スクロールバーが両方とも表示される。

  • 実行サンプル - WS_HSCROLL|WS_VSCROLL

    実行サンプル - WS_HSCROLL | WS_VSCROLL

このように、ウィンドウスタイルの指定を変更することでウィンドウの基本的な見た目や挙動を変えることができる。

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を使ったウィンドウの作成はこのようなものであり、指定されている内容を理解できるようになると、結構シンプルな使い方であることがわかると思う。

ウィンドウを作成したとは、ユーザがウィンドウに対して行うアクションに対してアプリケーションが動作するようにメッセージプールを実装しておくということになってくる。次回はこの辺りを追っていこう。ウィンドウアプリケーションを作成する最初のステップはこれでかなり進んだことになる。

参考