方法 : 四角形以外の Windows フォームを作成する
更新 : 2007 年 11 月
以前は、四角形以外のフォームを作成するのは時間と手間のかかる作業であり、API 呼び出しと手の込んだプログラミングを必要としました。このリリースでは、そのような作業が不要になりました。
メモ : |
---|
このプロセスにはハードウェアに対して大量のグラフィックス処理が行われます。そのため、搭載されているメモリおよびグラフィックス カードによってコンピュータの動作が異なります。アプリケーションでカスタムの描画を実行する場合は、ユーザーに配布する前に、必ず各種のビデオ カードでテストして、満足のいく性能が得られることを確認してください。 |
四角形以外のフォームを作成するプロセスには、2 つの要素が含まれます。形状を持ったフォームを作成することと、フォームを移動したり閉じたりするためのプログラミング ロジックをコーディングすることです。この 2 番目の手順が必要なのは、カスタムの形状を持つフォームにはタイトル バーがなく、固有の機能も一切含まれていないため、フォームを画面上で動かしたり閉じたりすることができないためです。したがって、そのような機能をレプリケートするコードを記述する必要があります。四角形以外の形状を持つフォームとコントロールの両方を作成する方法の詳細については、「方法 : 成型された Windows フォームを作成する」を参照してください。
四角形以外のフォームの作成は、次の 3 つの手順から成ります。
フォームの表面として機能するビットマップを作成する。実際には、四角形から目的のフォームの形状を "切り出し" ます。
Windows アプリケーション プロジェクトを作成し、そのプロパティを設定して、タイトル バーを取り除き、作成したビットマップをフォームの背景として使用します。
フォームを移動したり閉じたりなど、タイトル バーによって提供されていた機能を再作成するコードを入力します。
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
形状を変更したフォームを作成するには
1 つの色を持つ、四角形以外のビットマップを作成し、背景の色にはそれと区別できる別の色を指定します。任意の描画プログラムを使用します。描画した形状が最終的なフォームとなるため、実用的に十分な大きさに描画してください。
メモ : 背景色には、青などの覚えやすい色を選択してください。この点は後で重要になります。
Visual Studio で、新しい Windows アプリケーション プロジェクトを作成します。詳細については、「方法 : Windows アプリケーション プロジェクトを作成する」を参照してください。
[プロパティ] ウィンドウで、次の操作を行います。
FormBorderStyle プロパティを None に設定します。
このプロパティにより、フォームからタイトル バーが取り除かれます。フォームを閉じたり移動したりなど、タイトル バーによって提供される機能も削除されます。ただし、この欠点については後でコードで対処します。
フォームの BackgroundImage プロパティに、前の手順で作成したビットマップ ファイルを設定します。このファイルをプロジェクト システムに追加する必要はありません。背景イメージとしてファイルを指定したときに、自動的に追加されます。
このプロパティにより、ビットマップ イメージがフォームの背景に設定されます。次に説明する TransparencyKey プロパティと共に使用することで、このプロパティはフォームの形状を定義します。
TransparencyKey プロパティにビットマップ ファイルの背景色を設定します。
このプロパティにより、フォームのどの部分を透明にするかがアプリケーションに指示されます。
メモ : モニタの色深度の設定が 24 ビットより大きい場合は、TransparencyKey プロパティの設定に関係なく、フォームの特定の部分が透明にならないという表示上の問題が発生することがあります。この問題を避けるには、コントロール パネルの [画面] で、モニタの色深度を 24 ビット以下に設定してください。このような透明表示を使用するアプリケーションを開発するときは、ユーザーがこの問題を認識するように配慮する必要があります。
フォームを閉じるコードを記述するには
ボタン コントロールをフォームに追加します。詳細については、「方法 : Windows フォームにコントロールを追加する」を参照してください。
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# メモ : イベント ハンドラを有効にするためのコードを必ず追加してください。この例のコードを使用する場合、次のようになります。
this.Button1.Click += new System.EventHandler(this.button1_Click);
フォームを移動するコードを記述するには (オプション)
フォームがドラッグされたときにフォームを移動するプロシージャを作成します。次に示すようなコードを入力して新規 Point オブジェクトを作成します。このオブジェクトは、フォームをどのように移動するかを計算するときに変数として使用されます。isMouseDown フィールドは、ユーザーがマウス ボタンを押しているかどうかを把握するために使用されます。フォームは、マウス ボタンが押されているときにだけ移動するようにする必要があります。
Private mouseOffset As Point Private isMouseDown As Boolean = False
private Point mouseOffset; private bool isMouseDown = false;
フォームの 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# メモ : イベント ハンドラを有効にするためのコードを必ず追加してください。この例のコードを使用する場合、次のようになります。
this.MouseDown += new System.Windows.Forms.MouseEventHandler (this.Form1_MouseDown);
フォームの 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# メモ : イベント ハンドラを有効にするためのコードを必ず追加してください。この例のコードを使用する場合、次のようになります。
this.MouseMove += new System.Windows.Forms.MouseEventHandler (this.Form1_MouseMove);
フォームの 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; } }