はじめに
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」です。
GUIのデザイン
今回作成するGUIは、フォームのタイトルバーを非表示にし、背景にテクスチャを設定した独自のデザインのフォームにします。
GcDropDownButtonコントロール以外は標準コントロールを使用します。設定するプロパティと値は表のとおりです。また、ContextMenuStripコントロール「ContextMenuStrip1」は、GcDropDownButtonコントロールを配置すると自動的に実装されます。GcDropDownButtonコントロールの設定は次の項目で解説します。
プロパティ | 設定値 |
---|---|
BackGroundImage | WATER2-1.GIF |
ControlBox | False |
FormBorderStyle | None |
MaximizeBox | False |
MinimizeBox | False |
プロパティ | 設定値 |
---|---|
Text | (空白) |
BorderStyle | Fixed3D |
AutoSize | False |
TextAlign | MiddleLeft |
プロパティ | 設定値 |
---|---|
Image | b-line6.gif |
BackColor | Transparent |
Dock | Bottom |
SizeMode | StretchImage |
プロパティ | 設定値 |
---|---|
Image | b-line6.gif |
BackColor | Transparent |
Dock | Top |
SizeMode | StretchImage |
プロパティ | 設定値 |
---|---|
Text | (空白) |
Image | error.ico |
プロパティ | 設定値 |
---|---|
Filter | テキストファイル(*.txt)|*.txt |
特に設定なし |

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

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

ここでは、2つのメニュー項目にそれぞれアイコンファイルとJPEGファイルを設定し、セパレータを追加しています。
メニュー項目 | Image設定値 |
---|---|
開くToolStripMenuItem | folderopen.ico |
閉じるToolStripMenuItem | close.jpg |
これらは、ContextMenuStripコントロールのプロパティからも設定できます。

ドロップダウンリストが選択された処理
ドロップダウンリストの各項目が選択された処理は、VBのフォームデザイン時であれば各ToolStripMenuItemオブジェクトのClickイベントハンドラに記述できます。
ここでは、「開く」メニューを選ぶとファイルを開くダイアログボックスを表示し、選んだテキストファイルをリッチテキストボックスで表示するようにします。また、「閉じる」ボタンを選ぶとリッチテキストボックスを空にします。
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ステートメントを使って処理を振り分けます。
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コントロールに追加します。この処理は、メニュー「開く」のイベントハンドラに組み込みます。
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
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イベントハンドラに作成します。
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
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プロパティの値をその移動量分変化させるだけです。
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
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; } }
まとめ
ドロップダウンリストボタンは、ボタンにメニュー機能を組み込んだ面白いボタンコントロールです。
メニューはフォームの上部に配置されますが、このボタンならフォームのどの位置でもメニューを組み込むことができます。イベント処理も難しくありませんので、新しいフォームのデザインに活用できるのではないでしょうか。