CodeZine(コードジン)

特集ページ一覧

ドロップダウンリストボタンを使った.NETアプリケーションを作る

PlusPak for Windows Forms 5.0JのGcDropDownButtonコントロールを使ったアプリケーションの作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/03/24 14:00

 PlusPak for Windows Forms 5.0JのGcDropDownButtonコントロールは、ボタンにドロップダウンリスト機能を組み込んだ面白いコントロールです。タイトルバーを持たないフォームでは、メニューを実装することができませんが、このドロップダウンリストボタンを使うと、ボタンなのにメニューと同じように使うことができるようになります。

はじめに

 PlusPak for Windows Forms 5.0JのGcDropDownButtonコントロールは、ボタンにドロップダウンリスト機能を組み込んだ面白いコントロールです。

 タイトルバーを持たないフォームでは、メニューを実装することができません。しかし、このドロップダウンリストボタンなら、ボタンであるにもかかわらず、さながらメニューと同じように使うことができます。

 今回は、タイトルバーを持たないフォームでドロップダウンリストコントロールからファイルを開く、簡単なテキストファイルリーダーを作ってみました。

ドロップダウンリストボタンに「開く」「閉じる」メニューを組み込む
ドロップダウンリストボタンに「開く」「閉じる」メニューを組み込む
過去に開いたファイルをメニューのようにドロップダウンリストに追加する
過去に開いたファイルをメニューのようにドロップダウンリストに追加する

対象読者

 Visual Basic 2005・2008を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005・2008、Visual C# 2005・2008、Visual Studio 2005・2008でプログラムが作れる環境。

 なお、本プログラムはWindows Vista上で動作するVisual Studio 2005を使用して作成し、動作確認を行っています。

プログラム実行時の注意事項

 PlusPak for Windows Forms 5.0Jを使って作成したアプリケーションを配布する場合、PlusPak for Windows Forms 5.0Jのアセンブリファイルを添付する必要があります。これは、Common Language RuntimeのDLLをアプリケーションと一緒に配布するのと同じです。

 本記事のサンプルアプリケーションを正常に動作させるためには、次の4つのファイルをインストールする必要があります。

ファイル名 説明
GrapeCity.Win.PlusPak.v50.dll 本体コンポーネント
GrapeCity.Framework.PlusPak.v20.dll 製品のフレームワーク
GrapeCity.Win.PlusPak.v50.resources.dll 本体コンポーネントのサテライトリソース
GrapeCity.Framework.PlusPak.v20.resources.dll 製品フレームワークのサテライトリソース

 これらのファイルを、プログラムを実行するBinフォルダに格納します。.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

コンポーネントのインストール

 はじめてPlusPak for Windows Forms 5.0Jを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にPlusPak for Windows Forms 5.0Jをインストールする必要があります。

 インストーラは、グレープシティのWebページからダウンロードできます。ユーザー情報を登録すると送られてくるメールにダウンロード用のURLが記載されているので、ここからダウンロードしてインストールしてください。ファイルはzip形式で圧縮されています。

 有償のコントロールですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 PlusPak for Windows Forms 5.0Jをインストールしたら、ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコントロール」のアセンブリ名が「GrapeCity.Win.PlusPak」で始まるコンポーネント「GcDropDownButton」です。

アセンブリ名が「GrapeCity.Win.PlusPak」で始まる「GcDropDownButton」コントロールを選択する
アセンブリ名が「GrapeCity.Win.PlusPak」で始まる「GcDropDownButton」コントロールを選択する

GUIのデザイン

 今回作成するGUIは、フォームのタイトルバーを非表示にし、背景にテクスチャを設定した独自のデザインのフォームにします。

 GcDropDownButtonコントロール以外は標準コントロールを使用します。設定するプロパティと値は表のとおりです。また、ContextMenuStripコントロール「ContextMenuStrip1」は、GcDropDownButtonコントロールを配置すると自動的に実装されます。GcDropDownButtonコントロールの設定は次の項目で解説します。

Form1
プロパティ 設定値
BackGroundImage WATER2-1.GIF
ControlBox False
FormBorderStyle None
MaximizeBox False
MinimizeBox False
Label1
プロパティ 設定値
Text (空白)
BorderStyle Fixed3D
AutoSize False
TextAlign MiddleLeft
Image1
プロパティ 設定値
Image b-line6.gif
BackColor Transparent
Dock Bottom
SizeMode StretchImage
Image2
プロパティ 設定値
Image b-line6.gif
BackColor Transparent
Dock Top
SizeMode StretchImage
Button1
プロパティ 設定値
Text (空白)
Image error.ico
OpenFileDialog1
プロパティ 設定値
Filter テキストファイル(*.txt)|*.txt
RichText1
特に設定なし
GUIの画面
GUIの画面

GcDropDownButtonコントロールの設定

 GcDropDownButton コントロールは、コンテキストメニューをドロップダウンで表示する機能を搭載した拡張ボタンコントロールです。

 ドロップダウンリストにメニューを追加するには、フォームデザイナではContextMenuStripコントロールにメニューを追加します。GcDropDownButtonコントロールの「DropDown」プロパティには、このContextMenuStripコントロールのオブジェクト名が設定されています。そのため、自動的にContextMenuStripコントロールのメニュー項目が、GcDropDownButtonコントロールのドロップダウンリストに設定されるようになります。

ドロップダウンリストの設定

 このプログラムでは、ContextMenuStripコントロールに次の2つのメニューを設定します。

設定するメニュー
設定するメニュー

 設定したメニュー項目は、GcDropDownButtonコントロールのスマートタグから「ドロップダウン項目」を選ぶと表示される「項目コレクションエディタ」で編集できます。

「ドロップダウン項目」を選ぶ
「ドロップダウン項目」を選ぶ
項目コレクションエディタ
項目コレクションエディタ

 ここでは、2つのメニュー項目にそれぞれアイコンファイルとJPEGファイルを設定し、セパレータを追加しています。

OpenFileDialog1
メニュー項目 Image設定値
開くToolStripMenuItem folderopen.ico
閉じるToolStripMenuItem close.jpg

 これらは、ContextMenuStripコントロールのプロパティからも設定できます。

できあがったドロップダウンリスト
できあがったドロップダウンリスト

ドロップダウンリストが選択された処理

 ドロップダウンリストの各項目が選択された処理は、VBのフォームデザイン時であれば各ToolStripMenuItemオブジェクトのClickイベントハンドラに記述できます。

 ここでは、「開く」メニューを選ぶとファイルを開くダイアログボックスを表示し、選んだテキストファイルをリッチテキストボックスで表示するようにします。また、「閉じる」ボタンを選ぶとリッチテキストボックスを空にします。

Visual Basic
Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click
    Dim fname As String
    Me.OpenFileDialog1.ShowDialog()
    fname = Me.OpenFileDialog1.FileName

    Me.RichTextBox1.LoadFile(fname, RichTextBoxStreamType.PlainText)
    Me.Label1.Text = fname

End Sub

Private Sub 閉じるToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 閉じるToolStripMenuItem.Click
    Me.RichTextBox1.Text = ""
    Me.Label1.Text = ""
End Sub

 C#では、GcDropDownButtonコントロールのDropDownItemClickedイベントハンドラを利用します。このイベントハンドラはVBでも利用可能です。

 イベントハンドラの引数「e」のClickedItemプロパティには、選択されたメニュー項目のオブジェクトへの参照が格納されています。Nameプロパティを使うとそのオブジェクト名を取得できますので、ここから選択されたメニューを識別して処理を組み立てます。「開く」「閉じる」メニューの各オブジェクトは、ToolStripMenuItemオブジェクトのオブジェクト名で識別されるので、switchステートメントを使って処理を振り分けます。

C#
private void gcDropDownButton1_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    switch (e.ClickedItem.Name)
    {
        case "開くToolStripMenuItem":
            String fname;
            openFileDialog1.ShowDialog();
            fname = openFileDialog1.FileName;

            richTextBox1.LoadFile(fname, RichTextBoxStreamType.PlainText);
            label1.Text = fname;
            break;
         case "閉じるToolStripMenuItem":
            richTextBox1.Text = "";
            label1.Text = "";
             break;
    } 

コードからドロップダウンリストを設定する

 一度開いたファイルの名前をメニューに組み込んでいくという、Windowsのアプリケーションではおなじみの処理をドロップダウンリストにも組み込んでみます。

 この処理はコードからリストを組み込むのですが、GcDropDownButton コントロールに組み込むのではなく、ContextMenuStripコントロールに項目を追加する形をとります。

 まず、ToolStripMenuItemクラスのインスタンスを作成し、Nameプロパティで名前を付けます。そして、このオブジェクトをContextMenuStripコントロールに追加します。この処理は、メニュー「開く」のイベントハンドラに組み込みます。

Visual Basic
Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click
	...
	...
	
    'リストの追加
    Dim additem1 As New System.Windows.Forms.ToolStripMenuItem(fname)
    additem1.Name = "additem"
    ContextMenuStrip1.Items.Add(additem1)
End Sub
C#
switch (e.ClickedItem.Name)
{
    case "開くToolStripMenuItem":
	...
	...

        //リストの追加
        ToolStripMenuItem additem1 = new ToolStripMenuItem(fname);
        additem1.Name = "additem";
        contextMenuStrip1.Items.Add(additem1);
        break;
開いたファイル名がメニューに組み込まれる
開いたファイル名がメニューに組み込まれる

追加したメニューがクリックされた時の処理

 コードから追加したメニューが選択された時の処理は、まず、Nameプロパティの値「additem」で識別し、イベントハンドラの引数「e」のClickedItemプロパティからTextプロパティを参照して、メニューの項目名を取得します。ここから開くファイル名をフルパスで取得し、リッチテキストボックスのLoadFileメソッドに渡せば、ファイルを開くことができます。

 この処理は、Visual Basic・C#ともに、GcDropDownButtonコントロールのDropDownItemClickedイベントハンドラに作成します。

Visual Basic
Private Sub GcDropDownButton1_DropDownItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles GcDropDownButton1.DropDownItemClicked
    If e.ClickedItem.Name = "additem" Then
        Me.RichTextBox1.LoadFile(e.ClickedItem.Text, RichTextBoxStreamType.PlainText)
    End If
End Sub
C#
private void gcDropDownButton1_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    switch (e.ClickedItem.Name)
    {
        case "開くToolStripMenuItem":
			....
			....
            break;

        case "閉じるToolStripMenuItem":
			...
			...
			break;

        case "additem":
            richTextBox1.LoadFile(e.ClickedItem.Text, RichTextBoxStreamType.PlainText);
            break;
    } 
}

フォームをドラッグして移動させる処理

 おまけとして、フォームをドラッグして移動させる処理を組み込んでおきます。このプログラムのフォームはタイトルバーがありませんから、フォームをマウスでドラッグして移動させることができないからです。

 そこで、フォームのMouseDown、MouseMoveイベントハンドラを使ってフォームが移動できるようにします。処理は簡単で、MouseDownイベントでマウスポインタの位置を取得しておき、MouseMoveイベントで再度マウスポインタの位置を取得して移動量を算出し、フォームのLeft・Topプロパティの値をその移動量分変化させるだけです。

Visual Basic
Private mp As Point

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    If e.Button = Windows.Forms.MouseButtons.Left Then
        mp = New Point(e.X, e.Y)
    End If
End Sub

Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    If e.Button = Windows.Forms.MouseButtons.Left Then
        Me.Left += e.X - mp.X
        Me.Top += e.Y - mp.Y
    End If
End Sub
C#
private Point mp;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button ==  MouseButtons.Left)
    {
        mp = new Point(e.X, e.Y);
    } 
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        this.Left += e.X - mp.X;
        this.Top += e.Y - mp.Y;
    }
}

まとめ

 ドロップダウンリストボタンは、ボタンにメニュー機能を組み込んだ面白いボタンコントロールです。

 メニューはフォームの上部に配置されますが、このボタンならフォームのどの位置でもメニューを組み込むことができます。イベント処理も難しくありませんので、新しいフォームのデザインに活用できるのではないでしょうか。

製品情報

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5