印刷機構をプログラムするのには多くの手数が掛かります、上記のPDFの内容は最低限の定義ファイルの内容を表しています、更に最低限必要なアプリケ-ションを作成する方法です。従来のC言語及びMSDOS時代に経験したデバッグのやり方ではデバッグは不可能です、メッセ-ジの流れにより起動されてシ-ケンスは進みます、ですから開発者は流れを予測する必要が有り難しいです。よく高級言語と世の中では言われますが、基本は皆MFC(マイクロファンデ-ションクラス)により開発されているんです!他のデルファイとかの開発ツ-ルは直ぐにハングアップしますがMFCでは絶体に有りません、それほどデバッガ-は優秀です、ですが欠点もありますそれは保母適当に開発されたアプリでも動いてしまい、いざリリ-スバ-ジョンに落とそうとしたときに動かないアプリが出来てしまいます。如何に基本に忠実に作れるかが例外の発生に関係してきます。マイクロソフトのVC++開発者は解る人だけ使えと言っているのです、貴方は悔しいと思いませんか?私の理解している事柄を世の中の多くの人に伝えたいと思っています。是非応用が出来る様になってください。
印刷に必要な関数群
上記の関数は印刷時に呼び出される関数群ですが一つのアプリケ-ションで共通に使用されていますのでどのクラスに搭載するかは慎重に選ばなければいけません、各関数には
//===================プレビュー モード=====================
BOOL Vew1_Form::OnPreparePrinting(CPrintInfo* pInfo)
の様に「CPrintInfo* pInfo」が各関数に渡されていますこれが重要な引数です。例えば
//===================プレビュー モード=====================
BOOL Vew1_Form::OnPreparePrinting(CPrintInfo* pInfo)で解る様に印刷プレビュ-に使用される関数にも引数が渡されています。内部の関数を見て下さいこのコードは実際に処理している関数でWindowsから自動的に呼びだされてきます。用紙サイズとか必要な最小限を設定しています。この仕組みを理解するには自分で実行して見ないとだめです!
CFoodNutrinetDoc* pDoc = GetDocument();
pDoc->RecipiNmber=0;
if(pDoc->RecipiJobMode==週モード){
int t1=(int)pDoc->Arrays_EDMcont.GetCount();//週献立に挿入された料理のリスト t1==料理の総数である
if(0SetMaxPag=3+t1-1;//1page==週献立リスト 2Page~料理登録数分の栄養素計算値 最後のページ==栄養素リスト
else pDoc->SetMaxPag=3 ;//登録料理はない 空シート印刷
}
else if(pDoc->RecipiJobMode==月モード) pDoc->SetMaxPag=3;//月献立モード
//————————–
pInfo->SetMaxPage(pDoc->SetMaxPag);// the document is two pages long:
// the first page is the title page
// the second is the drawing
BOOL bRet = DoPreparePrinting(pInfo);// default preparation
pInfo->m_nNumPreviewPages=1; // Preview 2 pages at a time
//————————–
LPDEVMODE dm=pInfo->m_pPD->GetDevMode();
if(dm->dmOrientation==1){
::MessageBox(0,L”A4横用紙だけが使用できます”,L”!!!A4-横を指定してください!!”,MB_OK);
return FALSE;
}
return bRet;
もう少しお待ちください、ユウ-チュブで公開しますその前に凡そ理解して置いて下さい。
OnPrepareDCの関数を見る
void Vew1_Form::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
CFoodNutrinetDoc* pDoc = GetDocument();
if(pDC->IsPrinting()) {// Is the DC a printer DC.
CFormView::OnPrepareDC(pDC, pInfo);
pDC->SetMapMode(MM_ISOTROPIC ) ;
CSize sizeDoc = pDoc->GetDocSize();
pDC->SetWindowExt(sizeDoc) ;
pDoc->ArrayFoodeList.RemoveAll() ;//印刷用リストを削除する
pDoc->ArrayCount=0 ;//印刷行数初期化
pDoc->TheNumberOfSheetsOfPrint=0 ;//印刷枚数初期化
pDoc->RecipNextToroop=FALSE ;//レシピ連続印刷初期化
}
}