次の方法で共有


方法 : 四角形以外の Windows フォームを作成する

以前は、四角形以外のフォームを作成するのは時間と手間のかかる作業であり、API 呼び出しと手の込んだプログラミングを必要としました。 このリリースでは、そのような作業が不要になりました。

注意

このプロセスにはハードウェアに対して大量のグラフィックス処理が行われます。そのため、搭載されているメモリおよびグラフィックス カードによってコンピューターの動作が異なります。アプリケーションでカスタムの描画を実行する場合は、ユーザーに配布する前に、必ず各種のビデオ カードでテストして、満足のいく性能が得られることを確認してください。

四角形以外のフォームを作成するプロセスには、2 つの要素が含まれます。形状を持ったフォームを作成することと、フォームを移動したり閉じたりするためのプログラミング ロジックをコーディングすることです。 この 2 番目の手順が必要なのは、カスタムの形状を持つフォームにはタイトル バーがなく、固有の機能も一切含まれていないため、フォームを画面上で動かしたり閉じたりすることができないためです。 したがって、そのような機能をレプリケートするコードを記述する必要があります。 四角形以外の形状を持つフォームとコントロールの両方を作成する方法の詳細については、「方法 : 成型された Windows フォームを作成する」を参照してください。

四角形以外のフォームの作成は、次の 3 つの手順から成ります。

  • フォームの表面として機能するビットマップを作成する。 実際には、四角形から目的のフォームの形状を "切り出し" ます。

  • Windows アプリケーション プロジェクトを作成し、そのプロパティを設定して、タイトル バーを取り除き、作成したビットマップをフォームの背景として使用します。

  • フォームを移動したり閉じたりなど、タイトル バーによって提供されていた機能を再作成するコードを入力します。

注意

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

形状を変更したフォームを作成するには

  1. 1 つの色を持つ、四角形以外のビットマップを作成し、背景の色にはそれと区別できる別の色を指定します。 任意の描画プログラムを使用します。 描画した形状が最終的なフォームとなるため、実用的に十分な大きさに描画してください。

    注意

    背景色には、青などの覚えやすい色を選択してください。この点は後で重要になります。

  2. Visual Studio で、新しい Windows アプリケーション プロジェクトを作成します。 詳細については、「方法: 新しい Windows フォーム アプリケーション プロジェクトを作成する」を参照してください。

  3. [プロパティ] ウィンドウで、次の操作を行います。

    • FormBorderStyle プロパティを None に設定します。

      このプロパティにより、フォームからタイトル バーが取り除かれます。 フォームを閉じたり移動したりなど、タイトル バーによって提供される機能も削除されます。 ただし、この欠点については後でコードで対処します。

    • フォームの BackgroundImage プロパティに、前の手順で作成したビットマップ ファイルを設定します。 このファイルをプロジェクト システムに追加する必要はありません。背景イメージとしてファイルを指定したときに、自動的に追加されます。

      このプロパティにより、ビットマップ イメージがフォームの背景に設定されます。 次に説明する TransparencyKey プロパティと共に使用することで、このプロパティはフォームの形状を定義します。

    • TransparencyKey プロパティにビットマップ ファイルの背景色を設定します。

      このプロパティにより、フォームのどの部分を透明にするかがアプリケーションに指示されます。

      注意

      モニターの色深度の設定が 24 ビットより大きい場合は、TransparencyKey プロパティの設定に関係なく、フォームの特定の部分が透明にならないという表示上の問題が発生することがあります。この問題を避けるには、コントロール パネルの [画面] で、モニターの色深度を 24 ビット以下に設定してください。このような透明表示を使用するアプリケーションを開発するときは、ユーザーがこの問題を認識するように配慮する必要があります。

フォームを閉じるコードを記述するには

  1. ボタン コントロールをフォームに追加します。 詳細については、「方法 : Windows フォームにコントロールを追加する」を参照してください。

  2. Close メソッドを呼び出して、ユーザーがフォームを閉じるためのコードを追加します。

    次に示すのは、クリックされたときにフォームを閉じるボタンを追加する方法の例です。

    Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
       Me.Close()
    End Sub
    
    private void button1_Click(object sender, System.EventArgs e)
    {
       this.Close();
    }
    
    C# メモ : C# メモ

    イベント ハンドラーを有効にするためのコードを必ず追加してください。この例のコードを使用する場合、次のようになります。

    this.Button1.Click += new System.EventHandler(this.button1_Click);
    

フォームを移動するコードを記述するには (オプション)

  1. フォームがドラッグされたときにフォームを移動するプロシージャを作成します。 次に示すようなコードを入力して新規 Point オブジェクトを作成します。 このオブジェクトは、フォームをどのように移動するかを計算するときに変数として使用されます。 isMouseDown フィールドは、ユーザーがマウス ボタンを押しているかどうかを把握するために使用されます。 フォームは、マウス ボタンが押されているときにだけ移動するようにする必要があります。

    Private mouseOffset As Point
    Private isMouseDown As Boolean = False
    
    private Point mouseOffset;
    private bool isMouseDown = false;
    
  2. フォームの MouseDown イベントのイベント ハンドラーを作成します。 ハンドラーに、ユーザーがフォームの任意の場所をクリックしてドラッグできるようにするコードを追加します。 イベント ハンドラーの作成方法の詳細については、「方法 : デザイナーを使用してイベント ハンドラーを作成する」を参照してください。

    次に示すようなコードを入力して、マウス ポインターの現在の位置に基づいた座標がmouseOffset 変数に割り当てられるようにします。 次のコードでは、オフセット位置の計算に、境界線のサイズ (FrameBorderSize.Width) とタイトル バーの高さ (CaptionHeight) に関するシステム情報が使用されています。 測定はクライアント領域で行われる場合と画面座標で行われる場合とがあるため、オフセットをテストするときにはこれらの情報を考慮に入れる必要があります。 つまり、オフセットは、境界線の幅にキャプションの高さを加え、さらにフォームのクライアント領域へのオフセットを加えた値に等しくなります。

    Private Sub Form1_MouseDown(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseDown
        Dim xOffset As Integer
        Dim yOffset As Integer
    
        If e.Button = MouseButtons.Left Then
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width
            yOffset = -e.Y - SystemInformation.CaptionHeight - _
                    SystemInformation.FrameBorderSize.Height
            mouseOffset = New Point(xOffset, yOffset)
            isMouseDown = True
        End If
    End Sub
    
    private void Form1_MouseDown(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        int xOffset;
        int yOffset;
    
        if (e.Button == MouseButtons.Left) 
        {
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
            yOffset = -e.Y - SystemInformation.CaptionHeight - 
                SystemInformation.FrameBorderSize.Height;
            mouseOffset = new Point(xOffset, yOffset);
            isMouseDown = true;
        }    
    }
    
    C# メモ : C# メモ

    イベント ハンドラーを有効にするためのコードを必ず追加してください。この例のコードを使用する場合、次のようになります。

    this.MouseDown += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseDown);
    
  3. フォームの MouseMove イベントのイベント ハンドラーを作成します。

    次のようなコードを入力します。 マウスの左ボタンをクリックしてマウスをドラッグすると、フォームの Location プロパティが新しい位置に設定されます。

    Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseMove
        If isMouseDown Then
            Dim mousePos As Point = Control.MousePosition
            mousePos.Offset(mouseOffset.X, mouseOffset.Y)
            Location = mousePos
        End If
    End Sub
    
    private void Form1_MouseMove(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        if (isMouseDown) 
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouseOffset.X, mouseOffset.Y);
            Location = mousePos;
        }
    }
    
    C# メモ : C# メモ

    イベント ハンドラーを有効にするためのコードを必ず追加してください。この例のコードを使用する場合、次のようになります。

    this.MouseMove += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseMove);
    
  4. フォームの MouseUp イベントのイベント ハンドラーを作成します。 次のようなコードを入力します。

    Private Sub Form1_MouseUp(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        ' Changes the isMouseDown field so that the form does
        ' not move unless the user is pressing the left mouse button.
        If e.Button = MouseButtons.Left Then
            isMouseDown = False
        End If
    End Sub
    
    private void Form1_MouseUp(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        // Changes the isMouseDown field so that the form does
        // not move unless the user is pressing the left mouse button.
        if (e.Button == MouseButtons.Left) 
        {
            isMouseDown = false;
        }
    }
    
    C# メモ : C# メモ

    イベント ハンドラーを有効にするためのコードを必ず追加してください。この例のコードを使用する場合、次のようになります。

    this.MouseUp += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseUp);
    

参照

処理手順

方法 : 成型された Windows フォームを作成する

方法 : 透過的な Windows フォームを作成する

関連項目

Windows フォームの概要