SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(PlusPak)

タブページスタイルのMDIフォームを持った簡易エディタを作成する

PlusPak for Windows Forms 5.0JでカスタムデザインのMDIアプリケーションを作る

  • X ポスト
  • このエントリーをはてなブックマークに追加

 最近、タブページスタイルのアプリケーションが増えてきました。今回はこの流れに乗って、タブスタイルのMDIアプリケーションを作ってみましょう。子ウィンドウには、RichTextBoxコントロールを配置して簡易エディタのアプリケーションとし、メニュー以外にファンクションキーを使ってファイルを開いたり保存したりできるようにします。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 最近、タブページスタイルのアプリケーションが増えてきました。今回はこの流れに乗って、タブスタイルのMDIアプリケーションを作ってみましょう。子ウィンドウには、RichTextBoxコントロールを配置して簡易エディタのアプリケーションとし、メニュー以外にファンクションキーを使ってファイルを開いたり保存したりできるようにします。

複数の文書をタブスタイルのMDI子ウィンドウで表示する
複数の文書をタブスタイルのMDI子ウィンドウで表示する

対象読者

 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」です。

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

GUIのデザイン

 今回使用するコントロールです。

GUIで使用するコントロール
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イベントハンドラで、インスタンスを作成します。

Visual Basic
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
C#
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キーに割り当てます。

FunctionKeyButtonコレクションエディタでファンクションキーを設定する
FunctionKeyButtonコレクションエディタでファンクションキーを設定する

 表示されているファンクションキーの並び順は自由に変えられませんが、GcFunctionKeyクラスの「Sorted」プロパティをTrueにすると、ソートされて表示されます。

メニューとファンクションキーのイベント処理

 組み込んだメニューとファンクションキーのイベント処理を作成します。

ファイルを開く処理

 ファイルを開く処理は、まず「ファイルを開く」ダイアログでファイル名を取得します。

 次に、子フォームのインスタンスを作成して、子フォームに配置してあるRichTextBoxコントロールのLoadFileメソッドでファイルを開きます。これで、ファイルを開くたびに新しい子フォームを作成しそこにファイルの中身を表示します。このとき、ファイル名のフルパスを子フォームのタイトルに表示します。

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

    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
C#
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メソッドを実行するだけです。

Visual Basic
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
C#
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プロパティに押されたキーが格納されるので、ここで設定したファンクションキーかどうかを判別して処理を実行させます。

Visual Basic
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
C#
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コントロールは、メニューの設定と連動させることができるので、同じ処理コードを書かなくて済むのがうれしいです。ファンクションキーが使えるようになると、アプリケーションの操作性もぐっと上がるのではないでしょうか。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3175 2009/03/17 12:12

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング