CDC::StartDoc
更新 : 2007 年 11 月
デバイス ドライバに新しい印刷ジョブが開始されることを通知します。さらに、引き続いて発生するすべての StartPage 呼び出しと EndPage 呼び出しが、EndDoc 呼び出しが生じるまで同じジョブの下にスプールすることを通知します。
int StartDoc(
LPDOCINFO lpDocInfo
);
int StartDoc(
LPCTSTR lpszDocName
);
パラメータ
lpDocInfo
ドキュメント ファイル名と出力ファイル名を持つ DOCINFO 構造体。lpszDocName
ドキュメント ファイルの名前を含む文字列へのポインタ。
戻り値
正常終了した場合は、0 より大きい値を返します。この値はドキュメントの印刷ジョブ識別子です。
失敗した場合は、0 以下の値を返します。
解説
これは、ドキュメントが複数ページにわたるときにほかのジョブに混在しないようにするためです。
Windows Version 3.1 以降では、STARTDOC プリンタ エスケープはこの関数に置き換えられます。この関数を使うと、複数ページ ドキュメントのページがほかの印刷ジョブに混在しないようになります。
StartDoc は、メタファイル内部で使うことはできません。
使用例
通常使うプリンタを取得し、印刷ジョブを開き、"Hello, World!" という内容の 1 ページをスプールするコードは、次のとおりです。このコードで印刷されるテキストは、プリンタの論理単位にはスケーリングされていないため、出力テキストは、結果が読めないほど小さな文字になる場合もあります。SetMapMode、SetViewportOrg、SetWindowExt などの CDC スケーリング関数を使うと、スケーリングを修復できます。
void CDCView::DoStartDoc()
{
// get the default printer
CPrintDialog dlg(FALSE);
dlg.GetDefaults();
// is a default printer set up?
HDC hdcPrinter = dlg.GetPrinterDC();
if (hdcPrinter == NULL)
{
MessageBox(_T("Buy a printer!"));
}
else
{
// create a CDC and attach it to the default printer
CDC dcPrinter;
dcPrinter.Attach(hdcPrinter);
// call StartDoc() to begin printing
DOCINFO docinfo;
memset(&docinfo, 0, sizeof(docinfo));
docinfo.cbSize = sizeof(docinfo);
docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");
// if it fails, complain and exit gracefully
if (dcPrinter.StartDoc(&docinfo) < 0)
{
MessageBox(_T("Printer wouldn't initalize"));
}
else
{
// start a page
if (dcPrinter.StartPage() < 0)
{
MessageBox(_T("Could not start page"));
dcPrinter.AbortDoc();
}
else
{
// actually do some printing
CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);
dcPrinter.TextOut(50, 50, _T("Hello World!"), 12);
dcPrinter.EndPage();
dcPrinter.EndDoc();
dcPrinter.SelectObject(pOldFont);
}
}
}
}
必要条件
ヘッダー : afxwin.h