ふぢのVB小技集

丸いウィンドウを作りたい

(質問)
いつも、四角いウィンドウばかりで飽きちゃいました。四角以外のウィンドウは作れませんか?



(回答)
いくつかのWindowsAPIを使用すれば可能です。



(解説)
WindowsAPIを使用すれば、どんな形のウィンドウでも作成できます。
今回は、丸いウィンドウを作ってみましょう。

標準モジュール、またはFormのGeneralプロシージャに以下の宣言文を追加する

'*************************************************************
'楕円形のリージョンを作成するAPI
'*************************************************************
    Public Declare Function CreateEllipticRgn Lib "gdi32" _
            (ByVal X1 As Long, ByVal Y1 As Long, _
             ByVal X2 As Long, ByVal Y2 As Long) As Long


'*************************************************************
'ウィンドウにリージョンをセットするAPI
'*************************************************************
    Public Declare Function SetWindowRgn Lib "user32" _
            (ByVal hWnd As Long, ByVal hRgn As Long, _
             ByVal bRedraw As Boolean) As Long

    Public lngRegion As Long                'リージョン
                                                     'プログラムの終了時にオブジェクト(リージョン)を
                                                     '解放する必要がある為、Publicで宣言する。



次に、フォームのloadイベントに以下の処理をいれましょう。

Private Sub Form_Load()
    '楕円形のリージョンを作成
    lngRegion = CreateEllipticRgn(0, 0, _
        (Me.Width \ Screen.TwipsPerPixelX), (Me.Height \ Screen.TwipsPerPixelY))
                                                     '形を変えたいフォーム内の任意の座標を指定する。

                                                     '指定された長方形に内接する楕円のオブジェクトが
                                                     '取得できる。
                                                     '失敗した場合には、lngRegionに0が設定される。

    
    '楕円形のリージョンをFormにセット
    lngAPIReVal = SetWindowRgn(Me.hWnd, lngRegion, 1)
                                                     'これで丸いウィンドウの出来上がり。簡単でしょ?

End Sub




次に、フォームのUnloadイベント等に以下の処理をいれましょう。

Private Sub Form_UnLoad()
    'リージョンが作成済か
    If lngRegion <> 0 Then
        '以前に取得したリージョンを削除する

        DeleteObject (lngRegion)            '使い終わったリージョン(オブジェクト)は必ず削除
                                                     'しよう!!
    End If

End Sub

うまくいったかな?




戻る