はじめに
最近、タブページスタイルのアプリケーションが増えてきました。今回はこの流れに乗って、タブスタイルのMDIアプリケーションを作ってみましょう。子ウィンドウには、RichTextBoxコントロールを配置して簡易エディタのアプリケーションとし、メニュー以外にファンクションキーを使ってファイルを開いたり保存したりできるようにします。
対象読者
Visual Basic 2005・2008またはVisual C# 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ページからダウンロードできます。
なお、ダウンロードはユーザー情報を登録すると送られてくるE-Mailに、ダウンロード用のURLが記載されているので、ここからダウンロードしてインストールしてください。ファイルはzip形式で圧縮されています。有償のコントロールですが、プロダクトキーを入力せずにインストールすることでトライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
PlusPak for Windows Forms 5.0Jをインストールしたら、ツールボックスに専用のタブを作成し、使用するコントロールを追加します。追加するコントロールは、「.NET Frameworkコントロール」のアセンブリ名が「GrapeCity.Win.PlusPak」で始まるコントロール「GcMdiTabControl」「GcFunctionKey」です。
GUIのデザイン
今回使用するコントロールです。
OpenFileDialogコントロールは、ダイアログでテキストファイルを選択できるような設定にします。PlusPakの各コントロールの設定については、記事の中で紹介していきます。
作成するプログラムの機能
このプログラムは、テキストファイルをMDIで編集できるようにした簡易エディタです。
MDI子フォームは、PlusPak for Windows Forms 5.0JのGcMdiTabControlコントロールを使用し、タブページ形式で表示します。タブページは通常のWindowsフォームの子フォームですが、MDI親フォームに配置したGcMdiTabControlコントロールが、Windowsフォームをタブページに変換して表示します。
親フォームにはメニューとファンクションキーで、「ファイルを開く」「上書き保存」「閉じる」という処理を実行します。ファンクションキーは、PlusPak for Windows Forms 5.0JのGcFunctionKeyコントロールを使用し、キーボードとマウスで操作できるようにします。
GcMdiTabControlコントロールの配置と設定
ツールボックスから、GcMdiTabControlコントロールをフォームにドラッグ&ドロップします。MDI機能を有効にするには、フォームの「IsMdiContainer」プロパティをTrueにします。
後は、通常のMDI子フォームを作成する要領で子フォームを追加していきます。今回は、Windowsフォーム「Form2」をプロジェクトに追加し、このフォームにRichTextBoxコントロールを配置したものを、子フォームのひな型にします。
この子フォームを、プログラム起動時に親フォーム内に表示したい場合は、親フォームのLoadイベントハンドラで、インスタンスを作成します。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim child As New Form2 child.MdiParent = Me child.Show() End Sub
private void Form1_Load(object sender, EventArgs e) { Form child = new Form2(); child.MdiParent = this; child.Show(); }
GcMdiTabControlコントロールのタブ形状は、スマートタグの「外観スタイル」で選べるようになっています。多くの種類がありますが、今回はこの中から「CutCorner」を選びました。
さらに、GcMdiTabControlコントロールは、他にもタブへのイメージ配置、タブ位置の変更、タブの背景イメージの設定など、いろいろな形状のタブにすることができます。
ファンクションキーの設定
親フォームにファンクションキーを使った処理を設定するには、PlusPak for Windows Forms 5.0JのGcFunctionKeyコントロールを使用します。ツールボックスからGcFunctionKeyコントロールをフォームにドラッグ&ドロップすると、フォームの下側にファンクションキー用の領域が設定されます。
このコントロールは、スマートタグの「ショートカットソース」で、メニューに設定されているショートカットキーを自動的に設定できます。
独自にファンクションキーを設定するには、プロパティウィンドウの「FunctionKeyButton」プロパティの値欄をクリックすると、「FunctionKeyButtonコレクションエディタ」が表示されるので、ここでファンクションキーを設定します。
「追加」ボタンを押すと、新しいボタンが設定されるので、「FunctionKey」プロパティで割り当てるキーを選びます。また、「Text」プロパティで表示する文字を設定します。
ここでは、アクティブなページを閉じる操作として「閉じる」にF3、プログラムの終了操作で「終了」をF12キーに割り当てます。
表示されているファンクションキーの並び順は自由に変えられませんが、GcFunctionKeyクラスの「Sorted」プロパティをTrueにすると、ソートされて表示されます。
メニューとファンクションキーのイベント処理
組み込んだメニューとファンクションキーのイベント処理を作成します。
ファイルを開く処理
ファイルを開く処理は、まず「ファイルを開く」ダイアログでファイル名を取得します。
次に、子フォームのインスタンスを作成して、子フォームに配置してあるRichTextBoxコントロールのLoadFileメソッドでファイルを開きます。これで、ファイルを開くたびに新しい子フォームを作成しそこにファイルの中身を表示します。このとき、ファイル名のフルパスを子フォームのタイトルに表示します。
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 Dim child As New Form2() child.MdiParent = Me child.Show() If fname <> "" Then Try child.RichTextBox1.LoadFile(fname, RichTextBoxStreamType.PlainText) child.Text = fname Catch ex As Exception MessageBox.Show(ex.InnerException.Message) End Try End If End Sub
private void 開くToolStripMenuItem_Click(object sender, EventArgs e) { String fname; openFileDialog1.ShowDialog(); fname = openFileDialog1.FileName; Form2 child = new Form2(); child.MdiParent = this; child.Show(); RichTextBox rtbox = (RichTextBox)child.ActiveControl; if(fname != ""){ try{ rtbox.LoadFile(fname, RichTextBoxStreamType.PlainText); child.Text = fname; }catch(Exception ex){ MessageBox.Show(ex.InnerException.Message); } } }
上書き保存の処理
上書き保存しようとするファイルは、現在アクティブになっている子ウィンドウを対象とします。従って、親フォームのActiveMdiChildプロパティを使って、現在アクティブな子フォームをFormオブジェクトとして取得します。
子フォームのタイトルバーにファイル名のフルパスが表示されているので、後はこれを使ってRichTextBoxクラスのSaveFileメソッドを実行するだけです。
Private Sub 上書き保存ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 上書き保存ToolStripMenuItem.Click Dim activeform As Form = Me.ActiveMdiChild Dim fname As String = activeform.Text Dim richtext As RichTextBox = activeform.Controls(0) richtext.SaveFile(fname, RichTextBoxStreamType.PlainText) End Sub
private void 上書き保存ToolStripMenuItem_Click(object sender, EventArgs e) { Form activeform = this.ActiveMdiChild; String fname = activeform.Text; RichTextBox richtext = (RichTextBox)activeform.Controls[0]; richtext.SaveFile(fname, RichTextBoxStreamType.PlainText); }
ファンクションキーのイベント処理
GcFunctionKeyコントロールは、キーが押されるとFunctionKeyDownというイベントが発生しますので、処理を実行する場合はこのイベントハンドラに作成します。
イベントが発生すると、KeyCodeプロパティに押されたキーが格納されるので、ここで設定したファンクションキーかどうかを判別して処理を実行させます。
Private Sub GcFunctionKey1_FunctionKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles GcFunctionKey1.FunctionKeyDown If e.KeyCode = Keys.F12 Then Me.Close() End If If e.KeyCode = Keys.F5 Then Me.ActiveMdiChild.Close() End If End Sub
private void gcFunctionKey1_FunctionKeyDown(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.F12){ this.Close(); } if(e.KeyCode == Keys.F5){ this.ActiveMdiChild.Close(); } }
まとめ
GcMdiTabControlコントロールは、簡単にタブ形式のMDIページを作成できるコントロールです。設定も簡単で、すぐにMDIアプリケーションが作れます。
GcFunctionKeyコントロールは、メニューの設定と連動させることができるので、同じ処理コードを書かなくて済むのがうれしいです。ファンクションキーが使えるようになると、アプリケーションの操作性もぐっと上がるのではないでしょうか。