はじめに
今回は、RichTextコントロールを使って、簡単なワープロソフトを作成してみます。RichTextコントロールは、Textコントロールと違い入力したデータの文字色やフォントを変えることができ、コピー・ペーストやイメージの挿入などといった、ワードプロセッサと同様の編集機能を持ったコントロールです。
また、ComponentOne Studio 2007 WinForms Editionに組み込まれているPreview for .NETコンポーネントを使うと、プレビュー機能を簡単に組み込むことができます。このコンポーネントには、指定したデータをプロパティの設定だけでプレビュー表示できる機能が組み込まれています。データの保存や印刷機能も既に組み込まれており、高度で多彩な機能をすぐに使うことができます。
そこで、これらのコンポーネントを組み合わせて、ワープロソフトを作ってみました。
対象読者
Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。
プログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。
- C1.C1Preview.2.dll
- C1.Win.C1Preview.2.dll
これらのファイルを、実行プログラムと同じフォルダに格納します。また、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
コンポーネントのインストール
はじめてPreview for .NETコンポーネントを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。
製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。
有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
ComponentOne Studio 2007 WinForms Editionをインストールしたら、ツールボックスに専用のタブを作成し、Preview for .NETコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の名前空間が「C1.C1Preview」と「C1.Win.C1Preview」で始まる名前空間のコンポーネント「C1PrintPreviewControl」と「C1PrintDocument」です。
GUIの作成
GUIは、プロジェクトに2つのフォームを追加して作成します。
今回使用する「C1PrintPreviewControl」コンポーネントは、コンポーネント自体にツールバーやペインが実装されているコンポーネントで、ツールバーのボタンには既に処理を実行する機能が組み込まれています。
Form1の作成
Form1には、ToolStripコントロールを組み込みます。Dockプロパティはデフォルトの「Top」のままで、Buttonを3つ追加します。各Buttonは「Text」のみとし、次の文字列を設定します。
- フォント
- 文字色
- プレビュー
その下に、「RichText」コントロールを配置し、Dockプロパティを「Fill」にします。そして「FontDialog」と「ColorDialog」コントロールを配置します。
Form2の作成
Form2には、「C1PrintPreviewControl」コンポーネントと「C1PrintDocument」コンポーネントを配置します。自動的に「C1PrintPreviewControl」コンポーネントのDocumentプロパティに「C1PrintDocument」コンポーネントが設定され、2つのコンポーネントが連動するようになります。
「C1PrintPreviewControl」コンポーネントは、コンポーネント自体にツールバーやペインが実装されているコンポーネントです。ツールバーのボタンには既に処理を実行する機能が組み込まれているので、コンポーネントを1つフォームに配置して、Dockプロパティを「Fill」に設定するだけで、画面のようなユーザーインターフェースが出来上がります。
なお、この時「C1PrintPreviewControl」コンポーネントのModifierプロパティの値を確認してください。この値が「Private」になっていると、Form1からこのコンポーネントを参照できなくなってしまいます。Visual Basicではデフォルトが「Friend」なのでそのままで大丈夫ですが、C#ではデフォルトが「Private」になっている場合があるので、「Public」または「Friend」に変更してください。
RichTextコントロールの処理
RichTextコントロールは、多彩な編集機能を持っていますが今回はフォントの設定と文字色を設定する機能だけを組み込みます。なお、コードの先頭に名前空間「C1.C1Preview」への参照を入れておいてください。
フォントの設定
RichTextに入力された文字列を選択状態にして、ツールバーの[フォント]ボタンを押すと、フォントダイアログボックスを表示し、ここで選択した「フォントの種類」「スタイル」「サイズ」を選択文字列に適用するようにします。
この処理は、まずFontDialogコントロールを表示し、FontFamily、Sizeプロパティの値を取得し、これを元に新しいFontオブジェクトを作成します。そして、RichTextコントロールのSelectionFontプロパティに設定します。
Imports C1.C1Preview Private Sub ToolStripButton1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim fontname As FontFamily Dim fontsize As Single With FontDialog1 .ShowDialog() fontname = .Font.FontFamily fontsize = .Font.Size End With Dim newfont As New Font(fontname, fontsize) Me.RichTextBox1.SelectionFont = newfont End Sub
using C1.C1Preview; private void toolStripButton1_Click(object sender, EventArgs e) { FontFamily fontname; float fontsize; fontDialog1.ShowDialog(); fontname = fontDialog1.Font.FontFamily; fontsize = fontDialog1.Font.Size; Font newfont = new Font(fontname, fontsize); richTextBox1.SelectionFont = newfont; }
文字色の設定
選択した文字の文字色を変更する処理を、ツールバーの[文字色]ボタンに設定します。この処理は、色の選択ダイアログボックスを表示し、Colorプロパティの値を、RichTextコントロールのSelectionColorプロパティに設定するだけです。
Private Sub ToolStripButton2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ToolStripButton2.Click Me.ColorDialog1.ShowDialog() Me.RichTextBox1.SelectionColor = Me.ColorDialog1.Color End Sub
private void toolStripButton2_Click(object sender, EventArgs e) { colorDialog1.ShowDialog(); richTextBox1.SelectionColor = colorDialog1.Color; }
プレビューの処理
これも実に簡単で、C1PrintDocumentコンポーネントのプロパティに、RichTextコントロールのデータを設定するだけです。後は、すべてC1PrintDocumentコンポーネントが処理を行ってくれます。
この処理は、ツールバーの[プレビュー]ボタンに設定します。
まず、Form2への参照が行えるように、Form2のインスタンスを作成します。そして、C1PrintDocumentコンポーネントのBodyオブジェクトの中のChildrenコレクションに、RichTextコントロールのデータを追加します。このとき、RenderRichTextメソッドを使用して、RichTextコントロールのリッチテキストデータを、RenderObjectにしてから追加します。
C1PrintDocumentコンポーネントのBodyオブジェクトは、プレビューのページ本体を表すオブジェクトで、プレビューに表示されるデータは「レンダリングオブジェクト」と呼ばれるオブジェクトで表されます。このBodyオブジェクトのChildrenコレクションには、ドキュメントのすべてのレンダリングオブジェクトが含まれるので、ここにRichTextコントロールのデータをレンダリングオブジェクトにして追加する、という形を取ります。
一方、RichTextコントロールのデータを取得するにはいくつかの方法があります。Textプロパティは純粋なテキストデータのみを格納するプロパティで、Rtfプロパティは文字属性を含めたリッチテキストデータを格納するプロパティです。従って、ユーザーが設定したフォントや文字色も含めたデータを取得したければ、Rtfプロパティを参照し、この値を取り出して使用します。
RenderRichTextメソッドは、このRtfデータをそのままレンダリングオブジェクトに変換してくれるメソッドなので、これを使うことでRichTextコントロールで設定された文字属性をそのままC1PrintPreviewControlコンポーネントで表示させることができるようになります。
Private Sub ToolStripButton3_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles ToolStripButton3.Click Dim previewform As New Form2 With previewform .C1PrintDocument1.Body.Children.Add( _ New RenderRichText(RichTextBox1.Rtf)) .C1PrintDocument1.Generate() .Show() End With End Sub
private void toolStripButton3_Click(object sender, EventArgs e) { Form2 pf = new Form2(); pf.Show(); pf.c1PrintDocument1.Body.Children.Add( new C1.C1Preview.RenderRichText(richTextBox1.Rtf)); pf.c1PrintDocument1.Generate(); }
Form2の処理コードはありません。プレビューの拡大表示や印刷処理、ファイルへの保存処理などはすべてC1PrintPreviewControlコンポーネントに組み込まれています。
まとめ
印刷プレビュー機能は、表示倍率の設定やペインによるページ指定、複数ページの表示機能など多彩な機能を持たせる必要があり、これを自作するとなると相当大変な作業になります。C1PrintPreviewControlコンポーネントは、これらプレビューに必要な機能をすべて実装しており、プロパティやメソッドの操作ですぐにアプリケーションに組み込める、大変魅力的なコンポーネントです。このコンポーネントを使うことで開発の工数をかなり削減させることができるのではないでしょうか。
今回は簡単なワープロを作ってみましたが、画像処理ソフトや表計算、データベースのフロントエンドアプリケーションでも印刷・プレビュー機能を組み込むことができ、その守備範囲はかなり広いものになっています。
いろいろなアプリケーションを作ってみたくなる、便利なコンポーネントだと言えます。