変形フォームを作る


 え〜実に1年半ぶりの更新になってしまいました。
 そして突然ですが、今回をもって最終回とします。以後はVB6にステージを移してTpisを紹介していく予定です。

 今回はAPIの応用として普通じゃないフォームウインドウの作り方のアイデアを紹介します。
 昔からウインドウというものは四角くいものと相場は決まっていますが(笑)、丸や星形やハート型のウインドウがあってもいいんじゃないか?ということで、今回は丸いウインドウを作ってみました。
 下のハードコピーの薄黄色の丸いのが今回作るウインドウです。
 サンプルプロジェクトは、 ここを押すとダウンロード できます。



まず、フォームのプロパティ BorderStyle0-なし に設定します。これが0以外になっているとウインドウのタイトルバーや境界線が表示されたままになってしまいます。


Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SelectClipRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long) As Long

CreateEllipticRgn は、楕円形のリージョンを作るAPIです。リージョンとは簡単に言えば図形領域の形のことで、円や多角形などを作ることができますし、リージョンを組み合わせて任意の形を作ることもできます。
ちなみにリージョンに関する主なAPIは、

があります。

SelectClipRgn は、クリッピングリージョンをデバイスコンテキストに選択する関数です。クリッピングとは、グラフィック出力をクライアント領域の一部分に限定する処理のことです。つまり、ウインドウはCreateEllipticRgn で作った図形の範囲にしか出力しなくなり、結果的に楕円形のリージョンを選択した場合、ウインドウ自体が楕円形に見えるということです。
実際のコーディングは、


Private Sub Form_Load()
 Rgn = CreateEllipticRgn(0, 0, 200, 150)
 SelectClipRgn hdc, Rgn
 ZOrder 0
End Sub

フォームが初期化される時にリージョンを作ります。
CreateEllipticRgn(0, 0, 200, 150) で、(0,0) - (200,150) に内接する楕円形のリージョンを作り、
SelectClipRgn hdc, Rgn でそのリージョンをFormのデバイスコンテキストに適用します。(hdcはForm1.hdcを略しています)
デバイスコンテキストとは、簡単に言えばWindowsから見たグラフィックの出力先のことです。
あとは、FormのZorderを0にして最前面に表示させます。


Private Sub Form_DblClick()
 End
End Sub

ウインドウのタイトルバーが表示されていないため普通に終了することができませんので、ダブルクリックでプログラム終了としています。


以上で楕円形フォームが表示できます。
が、これだけでは実用的ではありません。
まず、ウインドウタイトルバーがないので、ウインドウを動かすことができませんが、これは「グラフィックの扱い方(自前ドラッグ)」で紹介した方法で移動できるようになります。
しかし実際にやってみるとどうでしょうか? ウインドウの周りの四角い部分(デザイン時のフォームの領域部分)が、ずりずりとついてきます。これを解決するのはなかなかやっかいです。移動先のグラフィックをフォーム領域にコピーしなければなりません。

移動しないようなウインドウ、例えばアナログ時計風のものやスクリーンセーバーのように画面全体を使用するアプリケーションなら問題ないと思いますが・・・。


最後に
ということで、今回はあくまでアイデアの紹介です。応用は皆さん自身で考えて下さい (^^;
VBではあまり意識することはありませんが、リージョンというのは重要な概念です。また、グラフィック関係のWindowsAPIを使用する上でデバイスコンテキストも非常に重要ですので、是非研究してみて下さい。

目次に戻る