Visual C# .NET または Visual C# 2005 を使用して RichTextBox コントロールの内容を印刷する方法

 Visual C# .NET または Visual C# 2005 を使用して RichTextBox コントロールの内容を印刷する方法

 

実家から、

案内状見たいので文末に宛先名かきたいんだけど、宛先だけ取っ替えて簡単に印刷できる方法は無いか?

という連絡があったわけですよ。

宛名管理ソフトは山とあるけど、こういうニーズは地味にないみたいでした。

ちょっと探してみてもあんましソフトなさそうでな。。。

 

どうも、最近自宅警備員フリープログラマー(かなり自称)ということもあって、探すよりも

  1. 住所録はそこいらのフリーソフトで作ってもらってCVSで出力
  2. 本文はワードパッドとかでrtfで書いておく
  3. CVSをインポートしてrtfはRichTextBoxコントロールで読み込んで、宛名をケツにAppendして
  4. 連続印刷する

という考えが頭をよぎったらしい。

探すのもめんどいから作ってみようとなってみたんですよ。

 

まぁ、rtf読んだりCVSは何とかなるんだけどね、、、

MSのバグやらに踊らされて地味に時間がかかってる。

 

 

で、掲題の件です。

 

rtfの印刷とか、ほんとは結構めんどくさいらしいんですけど、MSさんが何とかしてくれるというものです。

ちょっと填った。

脳みその動き悪くなってきてるのもあるんだろうけど、いまいち読解に手こずりました。

 

こういうのって、まず「?という方法で?やります」ってのをはっきりしてほしいとかちょっと思ったりした。

上記リンク先のやり方だと、プロジェクト新規に立ち上げて事細かに手順を紹介しています。

あの通りやればちゃんとした物できるんでしょうがね。

でも、ある程度実装が進んでからそれに盛り込むとなるとちょっとめんどくさかった。日本語が。

 

まず、やることやりたいこと。

  1. 本ちゃんソフトを作る前に、クラスライブラリのプロジェクトを新規で作ってRichTextBoxを派生させたRichTextBoxPrintCtrl というカスタムコントロール(dll)をこさえる。
  2. 本ちゃんソフトでは1で作ったRichTextBoxのカスタム版を使用する
  3. ぐだぐだ書いてるけど、Click系のイベントハンドラ以外のコードをとりあえず実装すればいい。

ということです。

RichTextBoxの派生コントロールを使うということで、デザイナでテキストボックスの入れ替え。

名前おかしくなりそう、というのはリファクタさんがうまくやってくれるさ。

ほんで、必要なコードを実装。

 

this.printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(this.printDocument1_BeginPrint);
this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);

これはForm1.Designer.csのInitializeComponent() メソッドに追加、というかココに手書きするのはいや、という人はForm1のコンストラクタに書いてもいいかと。

それはそれでソース的に微妙だとは思うけど( ´Д`)

 

ほんで必要なメソッドは以下。

 

private int checkPrint;
private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
 {
    checkPrint = 0;
 }

 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
      // Print the content of RichTextBox. Store the last character printed.
      checkPrint = richTextBox1.Print(checkPrint, richTextBox1.TextLength, e);

      // Check for more pages
      if (checkPrint < richTextBox1.TextLength)
            e.HasMorePages = true;
      else
            e.HasMorePages = false;
}

 

プレビューとか印刷設定とかは特段変なこともなく普通に.ShowDialog();すればいいみたいです。

とりあえず、面倒なところは方付いたかな(ρw-).。o○