リージョンを使って非矩形ウィンドウ(長方形でないウィンドウ)を作成する - C#

C#でリージョンを使って長方形でないウィンドウを作成するプログラムを紹介します。

概要

リージョンを使うことで、角を丸くした長方形や、円、その他自由な形状の非矩形のウィンドウを作成できます。

プログラム例

コード

以下のコードは、角を丸くした長方形ウィンドウを作成するコードです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowRegion
{
  public partial class Form1 : Form
  {
    [DllImport("user32.dll")]
    static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);

    [DllImport("gdi32.dll")]
    static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy);

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      IntPtr rgn1 = CreateRoundRectRgn(0,0,200,200,64,64);
      SetWindowRgn(Handle,rgn1,true);
    }
  }
}

解説

リージョンを作成するCreateRoundRectRgn、リージョンの形状でウィンドウ領域をマスクするSetWindowRgnはWindowsAPIを呼び出すため、DllImport属性を付けたAPIの定義をする必要があります。
リージョンで非矩形ウィンドウを作成した場合は通常表示されるウィンドウの表示内容をリージョンでマスクするだけになります。 そのため、デフォルトの状態(FormBorderStyle=Sizeable)では、ウィンドウ枠などが含まれてしまいます。 きれいに表示させるには、ウィンドウ枠を表示させない状態(FormBorderStyle=None)に設定します。

表示結果

FormBorderStyle=Noneの場合


FormBorderStyle=Sizeableの場合



著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2010-02-01
iPentec all rights reserverd.