2010.5.25.
石立 喬

Visual C++ 2010 Express の易しい使い方(5)

――― プリンタに出力したり、ファイルに出力したりする ―――

 ここでは、計算結果を画面に表示し、メニューを使ってプリンタへ出力し、ファイルとしても保存する方法を説明する。

プロジェクトの概要
 数学関数を使って、平方根と立方根の表をフォームのテキストボックス上に作成し、印刷プレビューで確認した後に、その内容を印刷する。テキストファイルとして保存することもできる。

フォームの設定
 すでに説明した方法により、フォームを設定する。メインメニューは「ファイル」と「印刷」の二つとし、「ファイル」のサブメニューには、「開く」、「上書き保存」、「名前を付けて保存」を設ける。ただし、「名前を付けて保存」以外は使用しないので、「開く」、「上書き保存」については、それぞれの「プロパティ」ウインドウで「動作」欄の「Enabled」をクリックし、右の逆三角をクリックして、「True」から「False」に変更する(これは、将来の機能拡張の準備と、メニューを不使用にする手法の説明のため)。「印刷」のサブメニューには、「印刷プレビュー」と「印刷」を設ける。
 「Form1」の「プロパティ」ウインドウの「表示」欄で、「BackColor」を「Window」(Controlから変更)に、「Font」を「MS ゴシック,12pt」にし、「text」を「平方根と立方根」にする。
 図1は、「フォームデザイナ」ウインドウ上で作成中したメニューを示す。「開く」と「上書き保存」のサブメニューは、グレイアウトされている。


図1 作成したメニュー


 表1は、各メニューに与えた名称と、関連するイベントハンドラ名を示す。

表1 各メニューとプログラム上の名称

  メニューのキャプション 自動的に付けられた名称 書き換えた名称 イベントハンドラ名(自動的に付く)
メインメニュー ファイル ファイルToolStripMenuItem 書き換え不要 なし
印刷 印刷ToolStripMenuItem 書き換え不要 なし
サブメニュー 開く... 開くToolStripMenuItem 書き換え不要 なし
上書き保存 上書き保存ToolStripMenuItem 書き換え不要 なし
名前を付けて保存... 名前を付けて保存ToolStripMenuItem menuSaveAs menuSaveAs_Click()
印刷プレビュー 印刷プレビューToolStripMenuItem menuPreview menuPreview_Click()
印刷... 印刷ToolStripMenuItem menuPrint menuPrint_Click()

テキストボックスの設定

 「フォーム」の文字を表示するには、文字を画像として直接描画する方法と、「テキストボックス」に、文字列として出力する方法とがある。ここでは、後者の方法を採るので、まず「テキストボックス」を用意する。「フォームデザイナ」ウインドウで下記の操作をする。
1)統合開発環境のメニューから、「表示」→「その他のウインドウ」→「ツールボックス」を選択する。
2)「ツールボックス」ウインドウで、「コモン コントロール」欄の「TextBox」をクリックし、フォーム上で、左上方から右下方に向けてマウスをドラッグする。斜めにドラッグしたにもかかわらず、細い1行分のテキストボックスしか生じない(デフォルトでは、「Multiline」プロパティが「False」のため)が、気にしない。「Multiline」プロパティを「True」に設定してから再度詳細に調整する。
3)テキストボックス領域で右クリックし、「プロパティ」ウインドウを開く。
4)「プロパティ」ウインドウで、以下のように設定する。各欄の項目をクリックすると右に下向き三角(Fontは四角形)が現れるので、リストから選択する。
  「動作」欄で、
       Multiline ------ True (Falseから) テキストボックスを縦方向に広げる。
       ReadOnly ------- True (Falseから) テキストボックスに書き込めなくする。
       TabStop -------- False (Trueから) 文字を反転(選択)状態にさせない。
   「表示」欄で
       BackColor ----- Window (Controlから変更) フォームに合わせる(BorderStyleと関連)。
       BorderStyle --- None (Fixed3Dから変更)  テキストボックスの存在を隠す。
       Font ---------- MS ゴシック,12pt (MS UI Gothic,9ptから変更) 

印刷のための準備
 「ツールボックス」の「印刷」欄から、下記左に記載の部品をダブルクリックすると、下記右に示したようなインスタンスが生成され、フォーム下部のコンポーネント・トレイに表示される。
        PrintDialog ----------- printDialog1
        PrintPreviewDialog ---- printPreviewDialog1
        PrintDocument --------- printDocument1
 図2は、「ツールボックス」で「印刷」関連の部品をダブルクリックして、コンポーネント・トレイに並んだインスタンスのリストを示す(図に収めるために並べ直してある)。


図2 印刷のための準備


表を計算して表示するプログラム
 この目的では、途中で画面を書き換えることをしないので、最初に一回だけ実行するForm1_Load()メソッドに記述しても良いが、Form1_Paint()を使用することも、もちろん差し支えないので、ここでは後者を使用する。
 Form1_Paint()では、1から10までの数の平方根と立方根を、String::Format()メソッドを用いて書式設定する。1から10までの数は、右詰2桁の整数として表示するので {0,2:D}を用い、平方根と立方根は、小数点を含めて11桁、小数点以下9桁の実数として表示するので {1,11:F9} と {2,11:F9} を用いる。
 最初の行は、textBox1->Textで書き込むが、それ以降の行は、復帰改行を意味する \r\n とtextBox1->AppendTextで追加して行く。図3のコードで、文字列を意味する「" "」は、縦方向の位置関係を比較しやすいように、揃えてある。
 図3は、プロジェクト開始時やフォームの再描画時に呼び出されるForm1_Paint()メソッドを示す。


図3 Form1_Paint()の内容


印刷対象のprintDocument1を作成するプログラム
 印刷するには、印刷対象のprintDocument1を用意しておく。コンポーネント・トレイの「printDocument1」をダブルクリックすると、printDocument1_PrintPage() のスケルトンができるので、そこに、textBox1の内容を書き出し、印刷時のフォントや印刷位置も決める。
 図4は、作成したprintDocument1_PrintPage()メソッドを示す。
 for each という見慣れない文があるが、これは、コレクションまたは配列の処理したいオブジェクトを最初から順次実行するのに便利である。
 プログラム中の
   int i=0;
   for each (String^ string1 in textBox1->Lines){
      g->DrawString(string1,Font,Brushes::Black,X0,Y0+i*15);
      i++;
   }
の意味は、
   String^ string1;
   for(int i=0;i<textBox1->Lines->Length;i++){
      string1=textBox1->Lines[i];
      g->DrawString(string1,Font,Brushes::Black,X0,Y0+i*15);
   }
と同等である。すなわち、for each 文を用いると、テキストボックス中の行が明示的に何行あるか分からなくても、行が存在する限り、上から順次に書き出してくれる。
 印刷時の用紙に対する配置と文字のフォントはprintDocument1_PrintPage()で決まる。


図4 printDocument1_PrintPage()の内容


「印刷プレビュー」のプログラム
 サブメニュー「印刷プレビュー」をダブルクリックすると、menuPreview()のスケルトンが出来ているので、そこに図5に示すコードを記述する。


図5 menuPreview_Click()の内容


「印刷」のプログラム
 サブメニュー「印刷」をダブルクリックすると、menuPrint_Click()のスケルトンが出来ているので、そこに図7に示すコードを記述する。


図6 menuPrint_Click()の内容


「名前を付けて保存」のプログラム
 サブメニュー「名前を付けて保存」をダブルクリックすると、menuSaveAs_Click()のスケルトンが出来ているので、そこに図8に示すコードを記述する。


図7 menuSaveAs_Click()の内容


プログラムの実行結果
 図8は実行結果である。テキストボックスを使っているが、境界を消してあり、背景をフォームと同色にしてあるので、テキストボックスの存在に気がつかない。


図8 実行結果


 図9は、「印刷プレビュー」サブメニューをクリックして得られるウインドウを示す。ウインドウが開くと、倍率が「自動」になっていて、小さく表示されるので、「拡大鏡」の右の三角をクリックして、倍率を「100%」にしてある。


図9 「印刷プレビュー」ウインドウ


 「印刷」サブメニューをクリックすると、普段見慣れた印刷ウインドウが開くので、それに従うと印刷が出来る。「名前を付けて保存」サブメニューをクリックしても、普段見慣れたウインドウが開くので、格納先を選んで保存できる。
 出力されたテキストファイルで、日本語はUnicode(UTF-8)でコード化されているので、それを日本語(JIS)などで読み出すと文字化けが生じる。


「Visual C++ の勉強部屋」(目次)へ