リージョンとウインドウの形

Windows では、リージョン(領域)によって描画する「領域」を指定できます。例えば、(0,0)から(63,64)の正方形というリージョンを作ると、その範囲だけを対象に再描画や塗りつぶしといった操作が出来るわけです。
リージョンは、再描画やクリッピングの範囲を指定する時に使われる事が多い(再描画の範囲を制限する事で処理速度の向上を図る)のですが、リージョンをウインドウの形として設定する事も出来ます。
時計ソフトなどで丸いウインドウを使っていますが、円形のリージョンを作ってやればあのような事ができるわけですね。今回は、円形のリージョンを作って丸いウインドウを表示してみました。

リージョンの作成

リージョンは、CreateEllipticRgnなどのリージョン作成用APIで作成します。楕円や長方形、多角形などでリージョンを作る関数が用意され、さらにリージョン同士を重ねあわせる事も可能です。
これらの関数を使えば、かなり複雑な形をしたリージョンを作れるでしょう。最も今回作るのは単なる円のリージョンなので、使う関数も楕円形のリージョンを作成するCreateEllipticRgnだけです。この関数に、楕円に外接する長方形の左上端と右下端の座標を引数として渡すと、楕円のリージョンのハンドルが帰ってきます。
例えば、

CreateEllipticRgn(4,8,48,64);

とすると(4,8)-(48,64)の長方形に内接する楕円のリージョンが作られ、そのハンドルが返ってきます。

ウインドウの形

領域が出来たら、後はそれをウインドウの形に設定するだけです。そのためには、APIの関数SetWindowRgnを使います。このSetWindowRgnには、一つ目の引数にウインドウのハンドル、2つめにリージョンのハンドル、3つめの引数にはリージョンを設定した後再描画するかどうかのフラグを指定します。
SetWindowRgnを呼び出すと以後は引数で渡したリージョンをOSの方で使うそうなので、変更したりハンドルを解放したりしないようにしましょう。
ウインドウに対してSetWindowRgnを使うと、設定されたリージョンの外側の部分は表示されなくなります。

プログラムでは、最初にクライアント領域のみのウインドウを作り、ウインドウを円形にするボタンと終了させるボタンを配置しました。起動したら、円ボタンをクリックしてみてください。
また、円ボタンを一度クリックすると無効にするのは、一度領域設定した後で再度領域を設定しようとすると、ウインドウがおかしくなる(終了などが出来なくなる)みたいだからです。

プログラムソース表示


プログラミング資料庫 > Windowsプログラミング研究室