プリンタでの描画
プリンタをプロッタとして使う
プリンタに描画すれば、プリンタをプロッターとして使うことができる。Visual C++/CLRでは、PrintDocumentコントロールを利用すると、GraphicsクラスによってPictureBoxなどでの描画と同じようにプリンタに描画できる。プログラムPrintPicture.exeは、プリンタへ2ページの描画出力を行うものであり、1ページ目は図形の描画、2ページ目は文字列の描画になっている(図1)。
図1 1ページ目と2ページ目のプリンタ出力
実行形式のプログラムはそのファイル名PrintPicture.exeをクリックしてダウンロード・実行できる。実行開始時に図2のウィンドウが表示される。
図2 実行開始時のウィンドウ
「Print」ボタンをクリックすると、図3の「印刷」ダイアログウィンドウが表示される。
図3 「印刷」ダイアログウィンドウ
必要ならば適当な設定を行って後「印刷」ボタンをクリックすると図1の内容がプリンタに出力される。
プログラムのソースファイルなどは圧縮ファイルPrintPicture.zipとして用意した。ファイル名PrintPicture.zipをクリックしてダウンロードできる。ダウンロードしたファイルをマウスの右ボタンでクリックして表示されるメニュから「解凍」あるいは「展開」などを選ぶと解凍できる。解凍したファイルはVisual C++などで開くことができる。
プログラムPrintPictureでは、「Print」ボタンをクリックすると、以下のコードが実行される。
if
(printDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK){
printDocument1->PrinterSettings =
printDialog1->PrinterSettings;
}else{
return;
}
pCount = 1;
printDocument1->Print();
printDialog1のメンバ関数ShowDialog()によって、使用するプリンタの設定を行い、変数pCountの値を1に設定してからprintDocument1のメンバ関数Print()を呼び出している。printDialog1とprintDocument1は、それぞれツールボックスからコントロールPrintDialogおよびPrintDocumentをクリックして選びフォームに張り付けるという操作を行うと自動的に用意されて用いることができる。
Print()の呼び出しにより、次の関数が呼び出される。
private: System::Void printDocument1_PrintPage(System::Object^ sender,
System::Drawing::Printing::PrintPageEventArgs^ e) {
if
(pCount > 0){
int w =
e->PageBounds.Width;
int h =
e->PageBounds.Height;
Brush ^bsh = gcnew
SolidBrush(Color::Blue);
e->Graphics->FillRectangle(bsh, int(w*0.3), int(h*0.3),
int(w*0.4), int(h*0.4));
bsh = gcnew
SolidBrush(Color::Yellow);
e->Graphics->FillEllipse(bsh, int(w*0.32), int(h*0.32),
int(w*0.36), int(h*0.36));
Pen ^pn = gcnew
Pen(Color::Black);
pn->Width = 5;
e->Graphics->DrawRectangle(pn, int(w*0.3), int(h*0.3),
int(w*0.4), int(h*0.4));
pn->Color = Color::Green;
e->Graphics->DrawRectangle(pn, int(0.02*w), int(0.02*h),
int(0.94*w), int(0.94*h));
pCount = 0;
e->HasMorePages = true;
}else{
System::Drawing::Font ^ fnt = gcnew System::Drawing::Font("MS明朝",
int(e->PageBounds.Height * 0.05) );
Brush ^ bsh = gcnew
SolidBrush(Color::BlueViolet);
e->Graphics->DrawString("プリント終了!", fnt, bsh,
0.1*e->PageBounds.Width, 0.3*e->PageBounds.Height);
}
}
pCountの値が0より大きいとき、Graphicsクラスのメンバ関数によって長方形とか楕円の描画がプリンタで行われる。HasMorePagesプロパティの値をtrueに設定すると、この関数printDocument1_PrintPageの終了後、再びprintDocument1_PrintPage(・・・)が呼び出されて、次のページに描画が行われる(改ページ、ページ送り)。
メンバ関数printDocument1_PrintPage(・・・)は、プロパティウィンドウ(図4)にprintDocument1コントロールを表示して、PrintPageイベントの右の欄をダブルクリックするとVisual Studioによって自動的にそのひな型が挿入される。挿入されたひな型に必要なコードを書き加える。
図4 PrintPageイベントの右欄をダブルクリックする。
また、プログラムの実行時にフォントを指定するときは、ツールボックスからFontDialogコントロールを選んでフォームに張り付けの作業を行い、上の
System::Drawing::Font ^ fnt = gcnew System::Drawing::Font("MS明朝",
int(e->PageBounds.Height * 0.05) );
の1行を、次の2行と置き換える。
fontDialog1->ShowDialog();
System::Drawing::Font ^ fnt = gcnew System::Drawing::Font(fontDialog1->Font->Name, int(e->PageBounds.Height * 0.05) );
このとき、実行時にフォント設定のダイアログウィンドウが表示されてフォント名を選ぶことができる。出力文字が日本語であるので、日本語用のフォントを指定する必要がある。この実行時にフォントを指定するプログラムは圧縮ファイルPrintPictureF.zipとしてまとめた。このファイル名PrintPictureF.zipをクリックしてダウンロードできる。ダウンロードしたファイルを解凍すれば開いてビルド実行できる。実行形式のファイルPrintPictureF.exeもアップロードした。.NET Framework3.5対応であるが、ファイル名PrintPictureF.exeをクリックして実行することができる。
Visual C++プログラミングの解説を<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>として用意した。