SHOEISHA iD

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

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

ComponentZine(ComponentOne)

リボンインターフェースに「開いたファイルの履歴」を組み込む

PowerTools Ribbon for .NETのC1Ribbonコンポーネントを使ってアプリケーションにリボンを実装する-その3

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

今回は、プログラム実行中にコードからリボンメニューを操作し、アプリケーションメニューにメニュー項目を追加する処理を実装します。これまでのメニューコントロールと同様、リボンコンポーネントもメニューをコードから追加・削除することができます。

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

はじめに

 Windowsアプリケーションのメニューには「最近使用したドキュメント」というものがあります。アプリケーション起動中でも、他のファイルを開いた際にはこのメニューにファイル名やパスなどが逐一追加されていきます。また、このメニューのファイル名をクリックすると、そのファイルを開くことができます。

 今回はこのように、プログラム実行中にコードからリボンメニューを操作し、アプリケーションメニューに項目を追加する処理を実装します。これまでのメニューコントロールと同様、リボンコンポーネントもメニューをコードから追加・削除できます。

開いたファイルの名前とパス名をアプリケーションメニューに組み込む
開いたファイルの名前とパス名をアプリケーションメニューに組み込む

これまでの記事

  1. .NETでOffice 2007と同じ「リボンインターフェース」を持ったエディタを作る
  2. .NETアプリのリボンインターフェースにUndo・Redo・ズーム機能を組み込む

対象読者

 Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。

必要な環境

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

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

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

 本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。

  • C1.Win.C1Ribbon.2.dll…C1Ribbon コンポーネント(.NET Framework 2.0 用)

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

※注意
 Windows VistaでPowerTools Ribbon for .NETのサンプルをコンパイルしようとするとエラーが発生します。これは、Windows VistaのUAC(ユーザーアカウント制御)により、製品サンプルがインストールされているフォルダに書き込みができないため、コンパイル時にエラーが発生するという現象です。Visual Studioを管理者として実行するか、サンプルプロジェクト一式をアクセス権のあるフォルダに移動してからコンパイルを行うようにしてください。

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

 はじめてPowerTools Ribbon for .NETを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。

 インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。

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

コントロールの追加

 PowerTools Ribbon for .NETをインストールしたら、ツールボックスに専用のタブを作成し、PowerTools Ribbon for .NETコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「C1.Win.C1Ribbon」で始まる名前空間のコンポーネント「C1Ribbon」と「C1StatusBar」です。

「名前空間」が「C1.Win.C1Ribbon」で始まる名前空間のコンポーネント「C1Ribbon」と「C1StatusBar」を選択する
「名前空間」が「C1.Win.C1Ribbon」で始まる名前空間のコンポーネント「C1Ribbon」と「C1StatusBar」を選択する

C1Ribbonコンポーネントのオブジェクト構造

 コードからC1Ribbonコンポーネントを操作するにあたり、アプリケーションメニューの右ペインに組み込むメニュー項目が、どのようなオブジェクト構成になっているのかを把握しておく必要があります。

 アプリケーションメニュー全体は「RibbonApplicationMenu」クラスです。また、アプリケーションメニューの各ペインにあるメニューは「RibbonItems」「RibbonItemCollection」クラスになります。このペインの中には、ラベルやリスト、ボタンなどのメニューオブジェクトを組み込むことができます。そして、このオブジェクトへの参照を取得するには、例えば右ペインであれば「RightPaneItem」プロパティを使用します。

 ペイン内のリスト状のメニューは「RibbonListItem」クラスになります。そして、リストの各項目名は「RibbonLabel」クラスになります。

 これらをGUI上で確認すると以下のようになります。

アプリケーションメニューのオブジェクト構成
アプリケーションメニューのオブジェクト構成

アプリケーションメニューの実装

 では、アプリケーションメニューの上の階層のオブジェクトから順番に組み込んでいきましょう。最初は、右ペインに「最近使用したドキュメント」と区切り線を作成して組み込みます。

右ペインに見出し文字を組み込む

 プログラム起動時に、アプリケーションメニューの右ペインに「最近使用したドキュメント」という見出し文字と区切り線を組み込みます。処理としては、

  • RibbonListItemオブジェクトを作成
  • ApplicationMenuオブジェクトのRightPaneItemsプロパティを使用して右ペインのRibbonItemsオブジェクトを参照
  • RibbonItemsオブジェクトにRibbonListItemオブジェクトを組み込む

 という流れになります。

右ペインに「最近使用したドキュメント」という見出し文字と区切り線を組み込む
右ペインに「最近使用したドキュメント」という見出し文字と区切り線を組み込む

 まず、RibbonListItemオブジェクトへの参照を格納する変数をPublicアクセッサで宣言します。

 そして、フォームの初期化イベントハンドラでRibbonListItemオブジェクトを作成します。コンストラクタの引数にはRibbonLabelクラスのコンストラクタを指定し、「最近使用したドキュメント」という文字を設定したRibbonLabelオブジェクトを作成しこれを指定します。

 作成したら、AddメソッドでRibbonItemsオブジェクトにこのRibbonListItemオブジェクトを追加します。

 区切り線も同じ方法でRibbonListItemオブジェクトを作成しますが、コンストラクタの引数にはRibbonSeparatorオブジェクトを作成して指定します。

Visual Basic
Imports C1.Win.C1Ribbon

Public Class RibbonForm1
    Public fsize As Integer = 10

    'この変数を追加
    Public listItem As RibbonListItem

'このプロシージャをVersion3で修正
Private Sub RibbonForm1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    Dim i As Integer

    Me.RibbonComboBox1.Items.Add(10)
    For i = 50 To 500 Step 50
        Me.RibbonComboBox1.Items.Add(i)
    Next

    Me.RibbonComboBox1.Text = Me.RibbonTrackBar1.Value.ToString

    'この行以下をVersion3で追加
    Dim listItem As RibbonListItem = New RibbonListItem(_
        New RibbonLabel("最近使用したドキュメント"))
    listItem.AllowSelection = False
    C1Ribbon1.ApplicationMenu.RightPaneItems.Add(listItem)
    C1Ribbon1.ApplicationMenu.RightPaneItems.Add(New RibbonListItem(_
                                               New RibbonSeparator()))
End Sub
C#
using C1.Win.C1Ribbon;

public partial class RibbonForm1 : C1.Win.C1Ribbon.C1RibbonForm
{
    public int fsize=10;

    //この変数を追加
    public RibbonListItem listItem; 

    private void RibbonForm1_Load(object sender, EventArgs e)
    {
        int i;
        ribbonComboBox1.Items.Add("10");
        for (i = 50; i <= 500; i += 50)
        {
            ribbonComboBox1.Items.Add(System.Convert.ToString(i));
        }

        ribbonComboBox1.Text
          = System.Convert.ToString(ribbonTrackBar1.Value);

        //この行以下をVersion3で追加
        RibbonListItem listItem
          = new RibbonListItem(
                new RibbonLabel("最近使用したドキュメント"));
        listItem.AllowSelection = false;
        c1Ribbon1.ApplicationMenu.RightPaneItems.Add(listItem);
        c1Ribbon1.ApplicationMenu.RightPaneItems.Add(
                       new RibbonListItem(new RibbonSeparator()));
    }

 このように、右ペインにいろいろなメニューコントロールを組み込むことができます。このプログラムでは、リスト形式のRibbonListItemオブジェクトを組み込みましたが、他に次のようなオブジェクトを組み込んで使うことができます。

コントロールオブジェクト(クラス)名
ボタンC1.Win.C1Ribbon.RibbonButton
カラーピッカーC1.Win.C1Ribbon.RibbonColorPickerItem
ドロップダウンC1.Win.C1Ribbon.RibbonDropDownBase
エディットボックスC1.Win.C1Ribbon.RibbonEditBox
ギャラリーC1.Win.C1Ribbon.RibbonGalleryItem
アイテムコンテナC1.Win.C1Ribbon.RibbonItemContainer
ラベルC1.Win.C1Ribbon.RibbonLabel
リストC1.Win.C1Ribbon.RibbonListItem
プログレスバーC1.Win.C1Ribbon.RibbonProgressBar
グループボタンC1.Win.C1Ribbon.RibbonQatGroupButton
区切り線C1.Win.C1Ribbon.RibbonSeparator
トラックバーC1.Win.C1Ribbon.RibbonTrackBar

 また、RibbonDropDownBaseオブジェクトを使うと、この中にさらにメニューやスプリットボタン、コンボボックスなどを組み込むことができます。

開いたファイルの名前をメニューに組み込む

 右ペインにメニューを組み込む方法が分かれば、後はRibbonListItemオブジェクトに、次々と開いたファイル名を組み込んでいくだけになります。

 この処理は、VBでは独自のSubプロシージャ、C#では独自のメソッドaddmenuを作成して呼び出すようにします。引数にはファイル名のフルパス名を指定します。

 最初に、ファイル名の文字数によってアプリケーションメニューの幅を広げるようにします。これは、フルパス名の文字数をカウントし、12倍してRibbonApplicationMenuオブジェクトのDropDownWidthプロパティに設定します。

 ただし、すでにアプリケーションメニューで表示しているパス名よりもファイル名が短い場合は、そのままDropDownWidthプロパティに設定してしまうと、アプリケーションメニューの幅が小さくなってしまい、長いパス名が表示できなくなってしまいます。そこで、ファイル名が現在表示しているパス名よりも長い場合だけ、DropDownWidthプロパティの値を更新するようにします。

Visual Basic
Private Sub addmenu(ByVal fname As String)
        Dim cnt As Integer = fname.Length
        If Me.RibbonApplicationMenu1.DropDownWidth < cnt * 12 Then
            Me.RibbonApplicationMenu1.DropDownWidth = cnt * 12
        End If
C#
 private void addmenu(String fname)
        {
            int cnt = fname.Length;
            if(ribbonApplicationMenu1.DropDownWidth < cnt * 12)
            {
                ribbonApplicationMenu1.DropDownWidth = cnt * 12;
            }

 次にRibbonListItemオブジェクトを作成し、RibbonLabelオブジェクトをファイル名を引数に指定して組み込み、これを右ペインに組み込みます。

 そして、このアイテムが選択された時に実行するイベントハンドラを関連付けておきます。VBではAddHandlerステートメント、C#ではEventHandlerクラスのコンストラクタを使用します。イベントハンドラ名は「addmenu_Click」とします。なお、イベントハンドラへの関連付けはRibbonListItemオブジェクトを1つ作成するたびに行いますが、イベントハンドラそのものは1つで、これを共有する形にします。

 ここでポイントとなるのは、RibbonListItemオブジェクトのIDプロパティにもファイル名をフルパスで格納している点です。IDプロパティは、RibbonListItemオブジェクトを識別するために使用する、データ型が文字列のプロパティです。あとで、このメニューが選択された時にファイルを開くためにファイル名を使用する際に、このIDプロパティの値を使用しますので、ここにファイル名をフルパスで格納しておきます。

Visual Basic
    listItem = New RibbonListItem()
    listItem.Items.Add(New RibbonLabel(fname))
    listItem.ID = fname
    C1Ribbon1.ApplicationMenu.RightPaneItems.Add(listItem)
    AddHandler listItem.Click, AddressOf addmenu_Click
End Sub
C#
    listItem = new RibbonListItem();
    listItem.Items.Add(new RibbonLabel(fname));
    listItem.ID = fname;
    c1Ribbon1.ApplicationMenu.RightPaneItems.Add(listItem);
    listItem.Click += new EventHandler(addmenu_Click);
}

 作成したaddmenuプロシージャ(メソッド)は、アプリケーションメニューの「ファイルを開く」メニューでファイルを開いたあとに呼び出します。

 これで、ファイルを開くたびに、ファイル名がフルパスでメニューに組み込まれます。

Visual Basic
Private Sub RibbonButton1_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles RibbonButton1.Click
    Dim fname As String = ""
    Dim ret As Integer

    Me.OpenFileDialog1.FileName = "*.txt"
    ret = Me.OpenFileDialog1.ShowDialog
    If DialogResult.OK Then
        fname = Me.OpenFileDialog1.FileName
        If fname <> "" Then
            Me.RichTextBox1.LoadFile(fname, _
                                     RichTextBoxStreamType.PlainText)

            Call addmenu(fname)  'この行をVersion3で追加
        End If
    End If
End Sub
C#
private void ribbonButton1_Click(object sender, EventArgs e)
{
    String fname;
    DialogResult ret;

    openFileDialog1.FileName = "*.txt";
    ret = openFileDialog1.ShowDialog();
    if(ret == DialogResult.OK){
        fname = openFileDialog1.FileName;
        if(fname != ""){
            richTextBox1.LoadFile(fname, _
                                  RichTextBoxStreamType.PlainText);
            addmenu(fname);  //この行を追加
        }
    }
}

選択したファイルを開く処理-イベント処理

 今度はメニューのファイル名を選択すると、そのファイルを開く処理です。これは、イベントハンドラ「addmenu_Click」をVBではSubプロシージャで、C#ではメソッドで作成します。引数は2つで、イベントが発生したオブジェクトを格納する「Object sender」とイベント情報を格納する「EventArgs e」です。

 イベントハンドラ内では、引数senderを「RibbonListItem」型に変換し、IDプロパティからファイル名を取得して、RichTextBoxで開くだけです。

Visual Basic
Private Sub addmenu_Click(ByVal sender As Object, _
                          ByVal e As EventArgs)
    Dim fname As String = ""
    Dim selectmenu As RibbonListItem = CType(sender, RibbonListItem)

    fname = selectmenu.ID
    Me.RichTextBox1.LoadFile(fname, _
                             RichTextBoxStreamType.PlainText)
End Sub
C#
private void addmenu_Click(Object sender, EventArgs e)
{
    string fname = "";
    RibbonListItem selectmenu = (RibbonListItem)sender;

    fname = selectmenu.ID;
    richTextBox1.LoadFile(fname, RichTextBoxStreamType.PlainText);
}

まとめ

 開いたファイル名をメニューに組み込む機能は、最近のWindowsアプリケーションにほとんど実装されていますが、C1Ribbonコンポーネントでも同じような機能を組み込むことができます。しかも、アプリケーションメニューにいろいろな機能のコントロールを組み込むことができるので、かなりバラエティなアプリケーションメニューを作ることができます。

 ただし、その分オブジェクト構造が複雑になるため、どこにどのオブジェクトを使うのか理解するのがポイントになっています。

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2249 2008/06/24 15:06

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング