今回は、プリンタで線を描いてみます。プリンタへの出力は、プリンタのデバイスコンテキストを取得しそのデバイスコンテキストにページ毎に描いていくだけなので「単一ページの出力」であれば、プログラミング自体はそれほど難しくはないようです。今回は、デバイスコンテキストにマッピングモードを設定し、5cmの正方形と三角形を描いてみましょう。
プリンタのデバイスコンテキスト
プリンタのデバイスコンテキストを取得する時には、PrintDlg()でプリンタの設定ダイアログを使うと便利です。手順としては、まずダイアログの属性を設定するPRINTDLG構造体を作成し(この時デバイスコンテキストを返すようにフラグにPD_RETURNDCを指定します)、この構造体を使ってダイアログを出します。すると、ダイアログからPRINTDLG構造体にプリンタのデバイスコンテキストが返されるので、後はこのデバイスコンテキストに描画を行うわけです。今回は、ウインドウの作成時にPRINTDLG構造体と印刷開始時に文書名などを設定するDOCINFO構造体を設定しています。
pd.lStructSize=sizeof(pd); pd.hwndOwner=hwnd; pd.hDevMode=NULL; pd.hDevNames=NULL; pd.Flags=PD_RETURNDC|PD_HIDEPRINTTOFILE; pd.nFromPage=1; pd.nToPage=1; pd.nMinPage=1; pd.nMaxPage=1; pd.nCopies=1; dci.cbSize=sizeof(dci); dci.lpszDocName=lpszDocName; dci.lpszOutput=NULL; dci.lpszDatatype=NULL; dci.fwType=0;
実際に印刷を行う際は
if (!PrintDlg(&pd)) return 0; hdc=pd.hDC;
としてプリンタのデバイスコンテキストを取得し、続いてStartDoc()でプリンタのジョブを開始し、StratPage()でページの印刷準備をします。
StartDoc(hdc,&dci); StartPage(hdc);
これで、デバイスコンテキストhdcに描画できるようになりました。hdcに描画したら、EndPage()でページの描画を終了し、EndDoc()でプリンタジョブを終えます。
EndPage(hdc); EndDoc(hdc);
今回は、ウインドウ・プリンタへの描画用に「5cmの正方形と三角形を描く」関数draw()を定義しました。この関数は、ウインドウやプリンタのデバイスコンテキストを受け取ってそのデバイスコンテキストに描画します。
void draw(HDC hdc) { SetMapMode(hdc,MM_LOMETRIC); SelectObject(hdc,GetStockObject(BLACK_PEN)); Rectangle(hdc,0,0,500,-500); MoveToEx(hdc,0,0,NULL); LineTo(hdc,250,-500); LineTo(hdc,500,0); }
プログラム
実行すると、draw()でウインドウに正方形と三角形を描画します。プリンタの電源を入れて、メニューからprintを選択してみてください。draw()にプリンタのデバイスコンテキストが渡され、ウインドウと同じ内容がプリンタに出力されるはずです。
なお、このプログラムをビルドする時には、プロジェクトのリンクにcomctl32.libを追加してください。