フォームの角を丸くする

フォームの角を丸くするテクニックです。

サンプル(32bit) ダウンロード

'フォームの角を丸くする
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long


Private Sub Form_Resize()
    
    Dim loghRgn As Long
    Dim logFormScale(1) As Long
    
    '======[ フォームの角を丸くする
    logFormScale(0) = Me.Width / Screen.TwipsPerPixelX
    logFormScale(1) = Me.Height / Screen.TwipsPerPixelY
    loghRgn = CreateRoundRectRgn(0, 0, logFormScale(0), logFormScale(1), 80, 80)
    Call SetWindowRgn(Me.hWnd, loghRgn, True)

End Sub

サンプル解説

以下の手順で角の丸いフォームを作成します。

  1. CreateRoundRectRgn関数で角の丸まった四角形の枠を作成。
  2. 作成した枠をSetWindowRgn関数でフォームに適用しています。

まず、CreateRoundRectRgn関数は四角形の枠(リージョン)を作成します。

引数は次の通りです。
(引数の名前は、Declare Functionで指定したものです)

メンバー I/O 説明
X1 In 長方形の左上隅のX座標
Y1 In 長方形の左上隅のY座標
X2 In 長方形の右下隅のX座標
Y2 In 長方形の右下隅のY座標
X3 In 角の丸みの幅
Y3 In 角の丸みの高さ

座標情報はすべてピクセルです。
X1〜Y2はフォーム内の座標となります。
そのため、フォームの一部分だけ表示する事も可能です。

サンプルでは0,0(フォームの左上隅)〜Me.Widthのピクセル値,Me.Heightのピクセル値(フォームの右下隅)を指定しています。

CreateRoundRectRgn関数は作成したリージョンのハンドルを返します。

そして作成したリージョンをSetWindowRgn関数でフォームに適用します。

メンバー I/O 説明
hWnd In フォームのハンドル
hRgn In リージョンのハンドル
bRedraw In リージョン適用後に再描画を行うかのフラグ
  • True : 行う
  • False : 行わない

サンプルでは、とーぜん再描画を行う必要があるのでTrueをセットしています

タイトルバーがある場合、タイトルバーも含めて角が丸くなるので注意してください。

CreateRoundRectRgn関数の引数X3・Y3をフォームと同じ幅・高さにすれば丸いフォームも表示できます。
アナログ時計のアプリがそんな感じですね。

余談ですが、CreatePolygonRgn関数を使えば多角形のリージョンを作成することが出来ます。


[ Window Close ]